mirror of
https://github.com/ankitects/anki.git
synced 2025-09-23 16:26:40 -04:00
move saved search code into sidebar.py, and remove from Filter button
This commit is contained in:
parent
132bb5ff36
commit
79239c89b7
2 changed files with 56 additions and 90 deletions
|
@ -44,7 +44,6 @@ from aqt.utils import (
|
||||||
SubMenu,
|
SubMenu,
|
||||||
askUser,
|
askUser,
|
||||||
disable_help_button,
|
disable_help_button,
|
||||||
getOnlyText,
|
|
||||||
getTag,
|
getTag,
|
||||||
openHelp,
|
openHelp,
|
||||||
qtMenuShortcutWorkaround,
|
qtMenuShortcutWorkaround,
|
||||||
|
@ -970,9 +969,6 @@ QTableView {{ gridline-color: {grid} }}
|
||||||
toggle_sidebar.setCheckable(True)
|
toggle_sidebar.setCheckable(True)
|
||||||
toggle_sidebar.setChecked(self.sidebarDockWidget.isVisible())
|
toggle_sidebar.setChecked(self.sidebarDockWidget.isVisible())
|
||||||
ml.addChild(toggle_sidebar)
|
ml.addChild(toggle_sidebar)
|
||||||
ml.addSeparator()
|
|
||||||
|
|
||||||
ml.addChild(self._savedSearches())
|
|
||||||
|
|
||||||
ml.popupOver(self.form.filter)
|
ml.popupOver(self.form.filter)
|
||||||
|
|
||||||
|
@ -1060,81 +1056,6 @@ QTableView {{ gridline-color: {grid} }}
|
||||||
)
|
)
|
||||||
return subm
|
return subm
|
||||||
|
|
||||||
# Favourites
|
|
||||||
######################################################################
|
|
||||||
|
|
||||||
def _savedSearches(self):
|
|
||||||
ml = MenuList()
|
|
||||||
# make sure exists
|
|
||||||
if "savedFilters" not in self.col.conf:
|
|
||||||
self.col.set_config("savedFilters", {})
|
|
||||||
|
|
||||||
ml.addSeparator()
|
|
||||||
|
|
||||||
if self._currentFilterIsSaved():
|
|
||||||
ml.addItem(tr(TR.BROWSING_REMOVE_CURRENT_FILTER), self._onRemoveFilter)
|
|
||||||
else:
|
|
||||||
ml.addItem(tr(TR.BROWSING_SAVE_CURRENT_FILTER), self._onSaveFilter)
|
|
||||||
|
|
||||||
return ml
|
|
||||||
|
|
||||||
def _onSaveFilter(self) -> None:
|
|
||||||
try:
|
|
||||||
filt = self.col.backend.normalize_search(
|
|
||||||
self.form.searchEdit.lineEdit().text()
|
|
||||||
)
|
|
||||||
except InvalidInput as e:
|
|
||||||
show_invalid_search_error(e)
|
|
||||||
else:
|
|
||||||
name = getOnlyText(tr(TR.BROWSING_PLEASE_GIVE_YOUR_FILTER_A_NAME))
|
|
||||||
if not name:
|
|
||||||
return
|
|
||||||
conf = self.col.get_config("savedFilters")
|
|
||||||
conf[name] = filt
|
|
||||||
self.col.set_config("savedFilters", conf)
|
|
||||||
self.sidebar.refresh()
|
|
||||||
|
|
||||||
def _onRemoveFilter(self) -> None:
|
|
||||||
self.removeFilter(self._currentFilterIsSaved())
|
|
||||||
|
|
||||||
def removeFilter(self, name: str) -> None:
|
|
||||||
if not askUser(tr(TR.BROWSING_REMOVE_FROM_YOUR_SAVED_SEARCHES, val=name)):
|
|
||||||
return
|
|
||||||
conf = self.col.get_config("savedFilters")
|
|
||||||
del conf[name]
|
|
||||||
self.col.set_config("savedFilters", conf)
|
|
||||||
self.sidebar.refresh()
|
|
||||||
|
|
||||||
def renameFilter(self, old: str) -> None:
|
|
||||||
conf = self.col.get_config("savedFilters")
|
|
||||||
try:
|
|
||||||
filt = conf[old]
|
|
||||||
except KeyError:
|
|
||||||
return
|
|
||||||
new = getOnlyText(tr(TR.ACTIONS_NEW_NAME), default=old)
|
|
||||||
if new == old or not new:
|
|
||||||
return
|
|
||||||
conf[new] = filt
|
|
||||||
del conf[old]
|
|
||||||
self.col.set_config("savedFilters", conf)
|
|
||||||
self.sidebar.refresh()
|
|
||||||
|
|
||||||
# returns name if found
|
|
||||||
def _currentFilterIsSaved(self) -> Optional[str]:
|
|
||||||
filt = self.form.searchEdit.lineEdit().text()
|
|
||||||
try:
|
|
||||||
filt = self.col.backend.normalize_search(filt)
|
|
||||||
except InvalidInput:
|
|
||||||
pass
|
|
||||||
for k, v in self.col.get_config("savedFilters").items():
|
|
||||||
try:
|
|
||||||
v = self.col.backend.normalize_search(v)
|
|
||||||
except InvalidInput:
|
|
||||||
pass
|
|
||||||
if filt == v:
|
|
||||||
return k
|
|
||||||
return None
|
|
||||||
|
|
||||||
# Info
|
# Info
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
|
|
|
@ -11,13 +11,27 @@ from typing import TYPE_CHECKING, Dict, Iterable, List, Optional, Sequence, Tupl
|
||||||
import aqt
|
import aqt
|
||||||
from anki.collection import ConfigBoolKey
|
from anki.collection import ConfigBoolKey
|
||||||
from anki.errors import DeckRenameError
|
from anki.errors import DeckRenameError
|
||||||
from anki.rsbackend import DeckTreeNode, FilterToSearchIn, NamedFilter, TagTreeNode
|
from anki.rsbackend import (
|
||||||
|
DeckTreeNode,
|
||||||
|
FilterToSearchIn,
|
||||||
|
InvalidInput,
|
||||||
|
NamedFilter,
|
||||||
|
TagTreeNode,
|
||||||
|
)
|
||||||
from aqt import gui_hooks
|
from aqt import gui_hooks
|
||||||
from aqt.main import ResetReason
|
from aqt.main import ResetReason
|
||||||
from aqt.models import Models
|
from aqt.models import Models
|
||||||
from aqt.qt import *
|
from aqt.qt import *
|
||||||
from aqt.theme import theme_manager
|
from aqt.theme import theme_manager
|
||||||
from aqt.utils import TR, getOnlyText, showInfo, showWarning, tr
|
from aqt.utils import (
|
||||||
|
TR,
|
||||||
|
askUser,
|
||||||
|
getOnlyText,
|
||||||
|
show_invalid_search_error,
|
||||||
|
showInfo,
|
||||||
|
showWarning,
|
||||||
|
tr,
|
||||||
|
)
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from anki.collection import ConfigBoolKeyValue, TRValue
|
from anki.collection import ConfigBoolKeyValue, TRValue
|
||||||
|
@ -231,8 +245,8 @@ class SidebarTreeView(QTreeView):
|
||||||
(tr(TR.ACTIONS_DELETE), self.remove_tag),
|
(tr(TR.ACTIONS_DELETE), self.remove_tag),
|
||||||
),
|
),
|
||||||
SidebarItemType.SAVED_SEARCH: (
|
SidebarItemType.SAVED_SEARCH: (
|
||||||
(tr(TR.ACTIONS_RENAME), self.rename_filter),
|
(tr(TR.ACTIONS_RENAME), self.rename_saved_search),
|
||||||
(tr(TR.ACTIONS_DELETE), self.remove_filter),
|
(tr(TR.ACTIONS_DELETE), self.remove_saved_search),
|
||||||
),
|
),
|
||||||
SidebarItemType.NOTETYPE: ((tr(TR.ACTIONS_MANAGE), self.manage_notetype),),
|
SidebarItemType.NOTETYPE: ((tr(TR.ACTIONS_MANAGE), self.manage_notetype),),
|
||||||
SidebarItemType.SAVED_SEARCH_ROOT: (
|
SidebarItemType.SAVED_SEARCH_ROOT: (
|
||||||
|
@ -700,16 +714,47 @@ class SidebarTreeView(QTreeView):
|
||||||
self.browser.model.beginReset()
|
self.browser.model.beginReset()
|
||||||
self.mw.taskman.run_in_background(do_delete, on_done)
|
self.mw.taskman.run_in_background(do_delete, on_done)
|
||||||
|
|
||||||
def remove_filter(self, item: "aqt.browser.SidebarItem") -> None:
|
def remove_saved_search(self, item: "aqt.browser.SidebarItem") -> None:
|
||||||
self.browser.removeFilter(item.name)
|
name = item.name
|
||||||
|
if not askUser(tr(TR.BROWSING_REMOVE_FROM_YOUR_SAVED_SEARCHES, val=name)):
|
||||||
|
return
|
||||||
|
conf = self.col.get_config("savedFilters")
|
||||||
|
del conf[name]
|
||||||
|
self.col.set_config("savedFilters", conf)
|
||||||
|
self.refresh()
|
||||||
|
|
||||||
def rename_filter(self, item: "aqt.browser.SidebarItem") -> None:
|
def rename_saved_search(self, item: "aqt.browser.SidebarItem") -> None:
|
||||||
self.browser.renameFilter(item.name)
|
old = item.name
|
||||||
|
conf = self.col.get_config("savedFilters")
|
||||||
|
try:
|
||||||
|
filt = conf[old]
|
||||||
|
except KeyError:
|
||||||
|
return
|
||||||
|
new = getOnlyText(tr(TR.ACTIONS_NEW_NAME), default=old)
|
||||||
|
if new == old or not new:
|
||||||
|
return
|
||||||
|
conf[new] = filt
|
||||||
|
del conf[old]
|
||||||
|
self.col.set_config("savedFilters", conf)
|
||||||
|
self.refresh()
|
||||||
|
|
||||||
|
def save_current_search(self, _item=None) -> None:
|
||||||
|
try:
|
||||||
|
filt = self.col.backend.normalize_search(
|
||||||
|
self.browser.form.searchEdit.lineEdit().text()
|
||||||
|
)
|
||||||
|
except InvalidInput as e:
|
||||||
|
show_invalid_search_error(e)
|
||||||
|
else:
|
||||||
|
name = getOnlyText(tr(TR.BROWSING_PLEASE_GIVE_YOUR_FILTER_A_NAME))
|
||||||
|
if not name:
|
||||||
|
return
|
||||||
|
conf = self.col.get_config("savedFilters")
|
||||||
|
conf[name] = filt
|
||||||
|
self.col.set_config("savedFilters", conf)
|
||||||
|
self.refresh()
|
||||||
|
|
||||||
def manage_notetype(self, item: "aqt.browser.SidebarItem") -> None:
|
def manage_notetype(self, item: "aqt.browser.SidebarItem") -> None:
|
||||||
Models(
|
Models(
|
||||||
self.mw, parent=self.browser, fromMain=True, selected_notetype_id=item.id
|
self.mw, parent=self.browser, fromMain=True, selected_notetype_id=item.id
|
||||||
)
|
)
|
||||||
|
|
||||||
def save_current_search(self, _item=None) -> None:
|
|
||||||
self.browser._onSaveFilter()
|
|
||||||
|
|
Loading…
Reference in a new issue