Add group search context action
This commit is contained in:
parent
172133299b
commit
f5981e94bf
@ -1,4 +1,6 @@
|
|||||||
actions-add = Add
|
actions-add = Add
|
||||||
|
actions-all-selected = All selected
|
||||||
|
actions-any-selected = Any selected
|
||||||
actions-blue-flag = Blue Flag
|
actions-blue-flag = Blue Flag
|
||||||
actions-cancel = Cancel
|
actions-cancel = Cancel
|
||||||
actions-choose = Choose
|
actions-choose = Choose
|
||||||
|
@ -8,7 +8,7 @@ from enum import Enum, auto
|
|||||||
from typing import Any, Dict, Iterable, List, Optional, Sequence, Tuple, cast
|
from typing import Any, Dict, Iterable, List, Optional, Sequence, Tuple, cast
|
||||||
|
|
||||||
import aqt
|
import aqt
|
||||||
from anki.collection import Config, SearchNode
|
from anki.collection import Config, SearchJoiner, SearchNode
|
||||||
from anki.decks import DeckTreeNode
|
from anki.decks import DeckTreeNode
|
||||||
from anki.errors import DeckRenameError, InvalidInput
|
from anki.errors import DeckRenameError, InvalidInput
|
||||||
from anki.tags import TagTreeNode
|
from anki.tags import TagTreeNode
|
||||||
@ -446,11 +446,15 @@ class SidebarTreeView(QTreeView):
|
|||||||
if item.is_expanded(searching):
|
if item.is_expanded(searching):
|
||||||
self.setExpanded(idx, True)
|
self.setExpanded(idx, True)
|
||||||
|
|
||||||
def update_search(self, *terms: Union[str, SearchNode]) -> None:
|
def update_search(
|
||||||
|
self,
|
||||||
|
*terms: Union[str, SearchNode],
|
||||||
|
joiner: SearchJoiner = "AND",
|
||||||
|
) -> None:
|
||||||
"""Modify the current search string based on modifier keys, then refresh."""
|
"""Modify the current search string based on modifier keys, then refresh."""
|
||||||
mods = self.mw.app.keyboardModifiers()
|
mods = self.mw.app.keyboardModifiers()
|
||||||
previous = SearchNode(parsable_text=self.browser.current_search())
|
previous = SearchNode(parsable_text=self.browser.current_search())
|
||||||
current = self.mw.col.group_searches(*terms)
|
current = self.mw.col.group_searches(*terms, joiner=joiner)
|
||||||
|
|
||||||
# if Alt pressed, invert
|
# if Alt pressed, invert
|
||||||
if mods & Qt.AltModifier:
|
if mods & Qt.AltModifier:
|
||||||
@ -489,9 +493,8 @@ class SidebarTreeView(QTreeView):
|
|||||||
|
|
||||||
def dropEvent(self, event: QDropEvent) -> None:
|
def dropEvent(self, event: QDropEvent) -> None:
|
||||||
model = self.model()
|
model = self.model()
|
||||||
source_items = [model.item_for_index(idx) for idx in self.selectedIndexes()]
|
|
||||||
target_item = model.item_for_index(self.indexAt(event.pos()))
|
target_item = model.item_for_index(self.indexAt(event.pos()))
|
||||||
if self.handle_drag_drop(source_items, target_item):
|
if self.handle_drag_drop(self._selected_items(), target_item):
|
||||||
event.acceptProposedAction()
|
event.acceptProposedAction()
|
||||||
|
|
||||||
def mouseReleaseEvent(self, event: QMouseEvent) -> None:
|
def mouseReleaseEvent(self, event: QMouseEvent) -> None:
|
||||||
@ -726,7 +729,9 @@ class SidebarTreeView(QTreeView):
|
|||||||
name=TR.BROWSING_AGAIN_TODAY,
|
name=TR.BROWSING_AGAIN_TODAY,
|
||||||
icon=icon,
|
icon=icon,
|
||||||
type=type,
|
type=type,
|
||||||
search_node=SearchNode(rated=SearchNode.Rated(days=1, rating=SearchNode.RATING_AGAIN)),
|
search_node=SearchNode(
|
||||||
|
rated=SearchNode.Rated(days=1, rating=SearchNode.RATING_AGAIN)
|
||||||
|
),
|
||||||
)
|
)
|
||||||
root.add_simple(
|
root.add_simple(
|
||||||
name=TR.BROWSING_SIDEBAR_OVERDUE,
|
name=TR.BROWSING_SIDEBAR_OVERDUE,
|
||||||
@ -984,27 +989,35 @@ class SidebarTreeView(QTreeView):
|
|||||||
a = m.addAction(act_name)
|
a = m.addAction(act_name)
|
||||||
qconnect(a.triggered, lambda _, func=act_func: func(item))
|
qconnect(a.triggered, lambda _, func=act_func: func(item))
|
||||||
|
|
||||||
|
self._maybe_add_search_actions(m)
|
||||||
|
|
||||||
if idx:
|
if idx:
|
||||||
self.maybe_add_tree_actions(m, item, idx)
|
self.maybe_add_tree_actions(m, item, idx)
|
||||||
|
|
||||||
if not m.children():
|
if not m.children():
|
||||||
return
|
return
|
||||||
|
|
||||||
# until we support multiple selection, show user that only the current
|
|
||||||
# item is being operated on by clearing the selection
|
|
||||||
if idx:
|
|
||||||
sm = self.selectionModel()
|
|
||||||
sm.clear()
|
|
||||||
sm.select(
|
|
||||||
idx,
|
|
||||||
cast(
|
|
||||||
QItemSelectionModel.SelectionFlag,
|
|
||||||
QItemSelectionModel.SelectCurrent | QItemSelectionModel.Rows,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
m.exec_(QCursor.pos())
|
m.exec_(QCursor.pos())
|
||||||
|
|
||||||
|
def _maybe_add_search_actions(self, menu: QMenu) -> None:
|
||||||
|
nodes = [
|
||||||
|
item.search_node for item in self._selected_items() if item.search_node
|
||||||
|
]
|
||||||
|
if not nodes:
|
||||||
|
return
|
||||||
|
menu.addSeparator()
|
||||||
|
if len(nodes) == 1:
|
||||||
|
menu.addAction(tr(TR.ACTIONS_SEARCH), lambda: self.update_search(*nodes))
|
||||||
|
return
|
||||||
|
sub_menu = menu.addMenu(tr(TR.ACTIONS_SEARCH))
|
||||||
|
sub_menu.addAction(
|
||||||
|
tr(TR.ACTIONS_ALL_SELECTED), lambda: self.update_search(*nodes)
|
||||||
|
)
|
||||||
|
sub_menu.addAction(
|
||||||
|
tr(TR.ACTIONS_ANY_SELECTED),
|
||||||
|
lambda: self.update_search(*nodes, joiner="OR"),
|
||||||
|
)
|
||||||
|
|
||||||
def maybe_add_tree_actions(
|
def maybe_add_tree_actions(
|
||||||
self, menu: QMenu, item: SidebarItem, parent: QModelIndex
|
self, menu: QMenu, item: SidebarItem, parent: QModelIndex
|
||||||
) -> None:
|
) -> None:
|
||||||
@ -1170,3 +1183,9 @@ class SidebarTreeView(QTreeView):
|
|||||||
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
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Helpers
|
||||||
|
##################
|
||||||
|
|
||||||
|
def _selected_items(self) -> List[SidebarItem]:
|
||||||
|
return [self.model().item_for_index(idx) for idx in self.selectedIndexes()]
|
||||||
|
Loading…
Reference in New Issue
Block a user