mirror of
https://github.com/ankitects/anki.git
synced 2025-09-18 22:12:21 -04:00
Merge pull request #1277 from RumovZ/config-keys
Add constants for literal config keys
This commit is contained in:
commit
44ef810f67
8 changed files with 70 additions and 84 deletions
35
pylib/anki/browser.py
Normal file
35
pylib/anki/browser.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright: Ankitects Pty Ltd and contributors
|
||||||
|
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
|
|
||||||
|
class BrowserConfig:
|
||||||
|
ACTIVE_CARD_COLUMNS_KEY = "activeCols"
|
||||||
|
ACTIVE_NOTE_COLUMNS_KEY = "activeNoteCols"
|
||||||
|
CARDS_SORT_COLUMN_KEY = "sortType"
|
||||||
|
NOTES_SORT_COLUMN_KEY = "noteSortType"
|
||||||
|
CARDS_SORT_BACKWARDS_KEY = "sortBackwards"
|
||||||
|
NOTES_SORT_BACKWARDS_KEY = "browserNoteSortBackwards"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def active_columns_key(is_notes_mode: bool) -> str:
|
||||||
|
if is_notes_mode:
|
||||||
|
return BrowserConfig.ACTIVE_NOTE_COLUMNS_KEY
|
||||||
|
return BrowserConfig.ACTIVE_CARD_COLUMNS_KEY
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def sort_column_key(is_notes_mode: bool) -> str:
|
||||||
|
if is_notes_mode:
|
||||||
|
return BrowserConfig.NOTES_SORT_COLUMN_KEY
|
||||||
|
return BrowserConfig.CARDS_SORT_COLUMN_KEY
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def sort_backwards_key(is_notes_mode: bool) -> str:
|
||||||
|
if is_notes_mode:
|
||||||
|
return BrowserConfig.NOTES_SORT_BACKWARDS_KEY
|
||||||
|
return BrowserConfig.CARDS_SORT_BACKWARDS_KEY
|
||||||
|
|
||||||
|
|
||||||
|
class BrowserDefaults:
|
||||||
|
CARD_COLUMNS = ["noteFld", "template", "cardDue", "deck"]
|
||||||
|
NOTE_COLUMNS = ["noteFld", "note", "noteCards", "noteTags"]
|
|
@ -37,6 +37,7 @@ from dataclasses import dataclass, field
|
||||||
import anki.latex
|
import anki.latex
|
||||||
from anki import hooks
|
from anki import hooks
|
||||||
from anki._backend import RustBackend, Translations
|
from anki._backend import RustBackend, Translations
|
||||||
|
from anki.browser import BrowserConfig, BrowserDefaults
|
||||||
from anki.cards import Card, CardId
|
from anki.cards import Card, CardId
|
||||||
from anki.config import Config, ConfigManager
|
from anki.config import Config, ConfigManager
|
||||||
from anki.consts import *
|
from anki.consts import *
|
||||||
|
@ -493,14 +494,10 @@ class Collection(DeprecatedNamesMixin):
|
||||||
if order is False:
|
if order is False:
|
||||||
return _pb.SortOrder(none=_pb.Empty())
|
return _pb.SortOrder(none=_pb.Empty())
|
||||||
# order=True: set args to sort column and reverse from config
|
# order=True: set args to sort column and reverse from config
|
||||||
sort_key = "noteSortType" if finding_notes else "sortType"
|
sort_key = BrowserConfig.sort_column_key(finding_notes)
|
||||||
order = self.get_browser_column(self.get_config(sort_key))
|
order = self.get_browser_column(self.get_config(sort_key))
|
||||||
reverse_key = (
|
reverse_key = BrowserConfig.sort_backwards_key(finding_notes)
|
||||||
Config.Bool.BROWSER_NOTE_SORT_BACKWARDS
|
reverse = self.get_config(reverse_key)
|
||||||
if finding_notes
|
|
||||||
else Config.Bool.BROWSER_SORT_BACKWARDS
|
|
||||||
)
|
|
||||||
reverse = self.get_config_bool(reverse_key)
|
|
||||||
if isinstance(order, BrowserColumns.Column):
|
if isinstance(order, BrowserColumns.Column):
|
||||||
if order.sorting != BrowserColumns.SORTING_NONE:
|
if order.sorting != BrowserColumns.SORTING_NONE:
|
||||||
return _pb.SortOrder(
|
return _pb.SortOrder(
|
||||||
|
@ -679,25 +676,25 @@ class Collection(DeprecatedNamesMixin):
|
||||||
def load_browser_card_columns(self) -> List[str]:
|
def load_browser_card_columns(self) -> List[str]:
|
||||||
"""Return the stored card column names and ensure the backend columns are set and in sync."""
|
"""Return the stored card column names and ensure the backend columns are set and in sync."""
|
||||||
columns = self.get_config(
|
columns = self.get_config(
|
||||||
"activeCols", ["noteFld", "template", "cardDue", "deck"]
|
BrowserConfig.ACTIVE_CARD_COLUMNS_KEY, BrowserDefaults.CARD_COLUMNS
|
||||||
)
|
)
|
||||||
self._backend.set_active_browser_columns(columns)
|
self._backend.set_active_browser_columns(columns)
|
||||||
return columns
|
return columns
|
||||||
|
|
||||||
def set_browser_card_columns(self, columns: List[str]) -> None:
|
def set_browser_card_columns(self, columns: List[str]) -> None:
|
||||||
self.set_config("activeCols", columns)
|
self.set_config(BrowserConfig.ACTIVE_CARD_COLUMNS_KEY, columns)
|
||||||
self._backend.set_active_browser_columns(columns)
|
self._backend.set_active_browser_columns(columns)
|
||||||
|
|
||||||
def load_browser_note_columns(self) -> List[str]:
|
def load_browser_note_columns(self) -> List[str]:
|
||||||
"""Return the stored note column names and ensure the backend columns are set and in sync."""
|
"""Return the stored note column names and ensure the backend columns are set and in sync."""
|
||||||
columns = self.get_config(
|
columns = self.get_config(
|
||||||
"activeNoteCols", ["noteFld", "note", "noteCards", "noteTags"]
|
BrowserConfig.ACTIVE_NOTE_COLUMNS_KEY, BrowserDefaults.NOTE_COLUMNS
|
||||||
)
|
)
|
||||||
self._backend.set_active_browser_columns(columns)
|
self._backend.set_active_browser_columns(columns)
|
||||||
return columns
|
return columns
|
||||||
|
|
||||||
def set_browser_note_columns(self, columns: List[str]) -> None:
|
def set_browser_note_columns(self, columns: List[str]) -> None:
|
||||||
self.set_config("activeNoteCols", columns)
|
self.set_config(BrowserConfig.ACTIVE_NOTE_COLUMNS_KEY, columns)
|
||||||
self._backend.set_active_browser_columns(columns)
|
self._backend.set_active_browser_columns(columns)
|
||||||
|
|
||||||
# Config
|
# Config
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from anki.collection import Config
|
from anki.browser import BrowserConfig
|
||||||
from anki.consts import *
|
from anki.consts import *
|
||||||
from tests.shared import getEmptyCol, isNearCutoff
|
from tests.shared import getEmptyCol, isNearCutoff
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ def test_find_cards():
|
||||||
col.conf["sortType"] = "cardMod"
|
col.conf["sortType"] = "cardMod"
|
||||||
assert col.find_cards("", order=True)[-1] in latestCardIds
|
assert col.find_cards("", order=True)[-1] in latestCardIds
|
||||||
assert col.find_cards("", order=True)[0] == firstCardId
|
assert col.find_cards("", order=True)[0] == firstCardId
|
||||||
col.set_config_bool(Config.Bool.BROWSER_SORT_BACKWARDS, True)
|
col.set_config(BrowserConfig.CARDS_SORT_BACKWARDS_KEY, True)
|
||||||
assert col.find_cards("", order=True)[0] in latestCardIds
|
assert col.find_cards("", order=True)[0] in latestCardIds
|
||||||
assert (
|
assert (
|
||||||
col.find_cards("", order=col.get_browser_column("cardDue"), reverse=False)[0]
|
col.find_cards("", order=col.get_browser_column("cardDue"), reverse=False)[0]
|
||||||
|
|
|
@ -6,21 +6,24 @@ from __future__ import annotations
|
||||||
from abc import ABC, abstractmethod, abstractproperty
|
from abc import ABC, abstractmethod, abstractproperty
|
||||||
from typing import List, Sequence, Union, cast
|
from typing import List, Sequence, Union, cast
|
||||||
|
|
||||||
|
from anki.browser import BrowserConfig
|
||||||
from anki.cards import Card, CardId
|
from anki.cards import Card, CardId
|
||||||
from anki.collection import Collection, Config
|
from anki.collection import Collection
|
||||||
from anki.notes import Note, NoteId
|
from anki.notes import Note, NoteId
|
||||||
from anki.utils import ids2str
|
from anki.utils import ids2str
|
||||||
from aqt.browser.table import Column, ItemId, ItemList
|
from aqt.browser.table import Column, ItemId, ItemList
|
||||||
|
|
||||||
|
|
||||||
class ItemState(ABC):
|
class ItemState(ABC):
|
||||||
config_key_prefix: str
|
GEOMETRY_KEY_PREFIX: str
|
||||||
|
SORT_COLUMN_KEY: str
|
||||||
|
SORT_BACKWARDS_KEY: str
|
||||||
_active_columns: List[str]
|
_active_columns: List[str]
|
||||||
_sort_column: str
|
|
||||||
_sort_backwards: bool
|
|
||||||
|
|
||||||
def __init__(self, col: Collection) -> None:
|
def __init__(self, col: Collection) -> None:
|
||||||
self.col = col
|
self.col = col
|
||||||
|
self._sort_column = self.col.get_config(self.SORT_COLUMN_KEY)
|
||||||
|
self._sort_backwards = self.col.get_config(self.SORT_BACKWARDS_KEY, False)
|
||||||
|
|
||||||
def is_notes_mode(self) -> bool:
|
def is_notes_mode(self) -> bool:
|
||||||
"""Return True if the state is a NoteState."""
|
"""Return True if the state is a NoteState."""
|
||||||
|
@ -56,21 +59,23 @@ class ItemState(ABC):
|
||||||
def toggle_active_column(self, column: str) -> None:
|
def toggle_active_column(self, column: str) -> None:
|
||||||
"""Add or remove an active column."""
|
"""Add or remove an active column."""
|
||||||
|
|
||||||
@abstractproperty
|
@property
|
||||||
def sort_column(self) -> str:
|
def sort_column(self) -> str:
|
||||||
"""Return the sort column from the config."""
|
return self._sort_column
|
||||||
|
|
||||||
@sort_column.setter
|
@sort_column.setter
|
||||||
def sort_column(self, column: str) -> None:
|
def sort_column(self, column: str) -> None:
|
||||||
"""Save the sort column in the config."""
|
self.col.set_config(self.SORT_COLUMN_KEY, column)
|
||||||
|
self._sort_column = column
|
||||||
|
|
||||||
@abstractproperty
|
@property
|
||||||
def sort_backwards(self) -> bool:
|
def sort_backwards(self) -> bool:
|
||||||
"""Return the sort order from the config."""
|
return self._sort_backwards
|
||||||
|
|
||||||
@sort_backwards.setter
|
@sort_backwards.setter
|
||||||
def sort_backwards(self, order: bool) -> None:
|
def sort_backwards(self, order: bool) -> None:
|
||||||
"""Save the sort order in the config."""
|
self.col.set_config(self.SORT_BACKWARDS_KEY, order)
|
||||||
|
self._sort_backwards = order
|
||||||
|
|
||||||
# Get objects
|
# Get objects
|
||||||
|
|
||||||
|
@ -114,14 +119,13 @@ class ItemState(ABC):
|
||||||
|
|
||||||
|
|
||||||
class CardState(ItemState):
|
class CardState(ItemState):
|
||||||
|
GEOMETRY_KEY_PREFIX = "editor"
|
||||||
|
SORT_COLUMN_KEY = BrowserConfig.CARDS_SORT_COLUMN_KEY
|
||||||
|
SORT_BACKWARDS_KEY = BrowserConfig.CARDS_SORT_BACKWARDS_KEY
|
||||||
|
|
||||||
def __init__(self, col: Collection) -> None:
|
def __init__(self, col: Collection) -> None:
|
||||||
super().__init__(col)
|
super().__init__(col)
|
||||||
self.config_key_prefix = "editor"
|
|
||||||
self._active_columns = self.col.load_browser_card_columns()
|
self._active_columns = self.col.load_browser_card_columns()
|
||||||
self._sort_column = self.col.get_config("sortType")
|
|
||||||
self._sort_backwards = self.col.get_config_bool(
|
|
||||||
Config.Bool.BROWSER_SORT_BACKWARDS
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def active_columns(self) -> List[str]:
|
def active_columns(self) -> List[str]:
|
||||||
|
@ -134,24 +138,6 @@ class CardState(ItemState):
|
||||||
self._active_columns.append(column)
|
self._active_columns.append(column)
|
||||||
self.col.set_browser_card_columns(self._active_columns)
|
self.col.set_browser_card_columns(self._active_columns)
|
||||||
|
|
||||||
@property
|
|
||||||
def sort_column(self) -> str:
|
|
||||||
return self._sort_column
|
|
||||||
|
|
||||||
@sort_column.setter
|
|
||||||
def sort_column(self, column: str) -> None:
|
|
||||||
self.col.set_config("sortType", column)
|
|
||||||
self._sort_column = column
|
|
||||||
|
|
||||||
@property
|
|
||||||
def sort_backwards(self) -> bool:
|
|
||||||
return self._sort_backwards
|
|
||||||
|
|
||||||
@sort_backwards.setter
|
|
||||||
def sort_backwards(self, order: bool) -> None:
|
|
||||||
self.col.set_config_bool(Config.Bool.BROWSER_SORT_BACKWARDS, order)
|
|
||||||
self._sort_backwards = order
|
|
||||||
|
|
||||||
def get_card(self, item: ItemId) -> Card:
|
def get_card(self, item: ItemId) -> Card:
|
||||||
return self.col.get_card(CardId(item))
|
return self.col.get_card(CardId(item))
|
||||||
|
|
||||||
|
@ -180,14 +166,13 @@ class CardState(ItemState):
|
||||||
|
|
||||||
|
|
||||||
class NoteState(ItemState):
|
class NoteState(ItemState):
|
||||||
|
GEOMETRY_KEY_PREFIX = "editorNotesMode"
|
||||||
|
SORT_COLUMN_KEY = BrowserConfig.NOTES_SORT_COLUMN_KEY
|
||||||
|
SORT_BACKWARDS_KEY = BrowserConfig.NOTES_SORT_BACKWARDS_KEY
|
||||||
|
|
||||||
def __init__(self, col: Collection) -> None:
|
def __init__(self, col: Collection) -> None:
|
||||||
super().__init__(col)
|
super().__init__(col)
|
||||||
self.config_key_prefix = "editorNotesMode"
|
|
||||||
self._active_columns = self.col.load_browser_note_columns()
|
self._active_columns = self.col.load_browser_note_columns()
|
||||||
self._sort_column = self.col.get_config("noteSortType")
|
|
||||||
self._sort_backwards = self.col.get_config_bool(
|
|
||||||
Config.Bool.BROWSER_NOTE_SORT_BACKWARDS
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def active_columns(self) -> List[str]:
|
def active_columns(self) -> List[str]:
|
||||||
|
@ -200,24 +185,6 @@ class NoteState(ItemState):
|
||||||
self._active_columns.append(column)
|
self._active_columns.append(column)
|
||||||
self.col.set_browser_note_columns(self._active_columns)
|
self.col.set_browser_note_columns(self._active_columns)
|
||||||
|
|
||||||
@property
|
|
||||||
def sort_column(self) -> str:
|
|
||||||
return self._sort_column
|
|
||||||
|
|
||||||
@sort_column.setter
|
|
||||||
def sort_column(self, column: str) -> None:
|
|
||||||
self.col.set_config("noteSortType", column)
|
|
||||||
self._sort_column = column
|
|
||||||
|
|
||||||
@property
|
|
||||||
def sort_backwards(self) -> bool:
|
|
||||||
return self._sort_backwards
|
|
||||||
|
|
||||||
@sort_backwards.setter
|
|
||||||
def sort_backwards(self, order: bool) -> None:
|
|
||||||
self.col.set_config_bool(Config.Bool.BROWSER_NOTE_SORT_BACKWARDS, order)
|
|
||||||
self._sort_backwards = order
|
|
||||||
|
|
||||||
def get_card(self, item: ItemId) -> Card:
|
def get_card(self, item: ItemId) -> Card:
|
||||||
return self.get_note(item).cards()[0]
|
return self.get_note(item).cards()[0]
|
||||||
|
|
||||||
|
|
|
@ -252,11 +252,11 @@ class Table:
|
||||||
hh.setCascadingSectionResizes(False)
|
hh.setCascadingSectionResizes(False)
|
||||||
|
|
||||||
def _save_header(self) -> None:
|
def _save_header(self) -> None:
|
||||||
saveHeader(self._view.horizontalHeader(), self._state.config_key_prefix)
|
saveHeader(self._view.horizontalHeader(), self._state.GEOMETRY_KEY_PREFIX)
|
||||||
|
|
||||||
def _restore_header(self) -> None:
|
def _restore_header(self) -> None:
|
||||||
self._view.horizontalHeader().blockSignals(True)
|
self._view.horizontalHeader().blockSignals(True)
|
||||||
restoreHeader(self._view.horizontalHeader(), self._state.config_key_prefix)
|
restoreHeader(self._view.horizontalHeader(), self._state.GEOMETRY_KEY_PREFIX)
|
||||||
self._set_column_sizes()
|
self._set_column_sizes()
|
||||||
self._set_sort_indicator()
|
self._set_sort_indicator()
|
||||||
self._view.horizontalHeader().blockSignals(False)
|
self._view.horizontalHeader().blockSignals(False)
|
||||||
|
|
|
@ -1447,8 +1447,6 @@ message Config {
|
||||||
message Bool {
|
message Bool {
|
||||||
enum Key {
|
enum Key {
|
||||||
BROWSER_TABLE_SHOW_NOTES_MODE = 0;
|
BROWSER_TABLE_SHOW_NOTES_MODE = 0;
|
||||||
BROWSER_SORT_BACKWARDS = 1;
|
|
||||||
BROWSER_NOTE_SORT_BACKWARDS = 2;
|
|
||||||
PREVIEW_BOTH_SIDES = 3;
|
PREVIEW_BOTH_SIDES = 3;
|
||||||
COLLAPSE_TAGS = 4;
|
COLLAPSE_TAGS = 4;
|
||||||
COLLAPSE_NOTETYPES = 5;
|
COLLAPSE_NOTETYPES = 5;
|
||||||
|
|
|
@ -16,8 +16,6 @@ impl From<BoolKeyProto> for BoolKey {
|
||||||
fn from(k: BoolKeyProto) -> Self {
|
fn from(k: BoolKeyProto) -> Self {
|
||||||
match k {
|
match k {
|
||||||
BoolKeyProto::BrowserTableShowNotesMode => BoolKey::BrowserTableShowNotesMode,
|
BoolKeyProto::BrowserTableShowNotesMode => BoolKey::BrowserTableShowNotesMode,
|
||||||
BoolKeyProto::BrowserSortBackwards => BoolKey::BrowserSortBackwards,
|
|
||||||
BoolKeyProto::BrowserNoteSortBackwards => BoolKey::BrowserNoteSortBackwards,
|
|
||||||
BoolKeyProto::PreviewBothSides => BoolKey::PreviewBothSides,
|
BoolKeyProto::PreviewBothSides => BoolKey::PreviewBothSides,
|
||||||
BoolKeyProto::CollapseTags => BoolKey::CollapseTags,
|
BoolKeyProto::CollapseTags => BoolKey::CollapseTags,
|
||||||
BoolKeyProto::CollapseNotetypes => BoolKey::CollapseNotetypes,
|
BoolKeyProto::CollapseNotetypes => BoolKey::CollapseNotetypes,
|
||||||
|
|
|
@ -11,7 +11,6 @@ use crate::prelude::*;
|
||||||
#[strum(serialize_all = "camelCase")]
|
#[strum(serialize_all = "camelCase")]
|
||||||
pub enum BoolKey {
|
pub enum BoolKey {
|
||||||
BrowserTableShowNotesMode,
|
BrowserTableShowNotesMode,
|
||||||
BrowserNoteSortBackwards,
|
|
||||||
CardCountsSeparateInactive,
|
CardCountsSeparateInactive,
|
||||||
CollapseCardState,
|
CollapseCardState,
|
||||||
CollapseDecks,
|
CollapseDecks,
|
||||||
|
@ -28,8 +27,6 @@ pub enum BoolKey {
|
||||||
PreviewBothSides,
|
PreviewBothSides,
|
||||||
Sched2021,
|
Sched2021,
|
||||||
|
|
||||||
#[strum(to_string = "sortBackwards")]
|
|
||||||
BrowserSortBackwards,
|
|
||||||
#[strum(to_string = "normalize_note_text")]
|
#[strum(to_string = "normalize_note_text")]
|
||||||
NormalizeNoteText,
|
NormalizeNoteText,
|
||||||
#[strum(to_string = "dayLearnFirst")]
|
#[strum(to_string = "dayLearnFirst")]
|
||||||
|
@ -50,12 +47,6 @@ struct BoolLike(#[serde(deserialize_with = "deserialize_bool_from_anything")] bo
|
||||||
impl Collection {
|
impl Collection {
|
||||||
pub fn get_config_bool(&self, key: BoolKey) -> bool {
|
pub fn get_config_bool(&self, key: BoolKey) -> bool {
|
||||||
match key {
|
match key {
|
||||||
BoolKey::BrowserSortBackwards => {
|
|
||||||
// older clients were storing this as an int
|
|
||||||
self.get_config_default::<BoolLike, _>(BoolKey::BrowserSortBackwards)
|
|
||||||
.0
|
|
||||||
}
|
|
||||||
|
|
||||||
// some keys default to true
|
// some keys default to true
|
||||||
BoolKey::InterruptAudioWhenAnswering
|
BoolKey::InterruptAudioWhenAnswering
|
||||||
| BoolKey::ShowIntervalsAboveAnswerButtons
|
| BoolKey::ShowIntervalsAboveAnswerButtons
|
||||||
|
|
Loading…
Reference in a new issue