From 99122dfa16467bd1087f2441daa995ff8497485d Mon Sep 17 00:00:00 2001 From: RumovZ Date: Sat, 13 Mar 2021 09:31:56 +0100 Subject: [PATCH 1/2] Use same constraints for deleting by key press ... ... as for deleting via context menu, i.e., delete key does nothing if not all selected items are of the same type. --- qt/aqt/sidebar.py | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/qt/aqt/sidebar.py b/qt/aqt/sidebar.py index da4905b20..182160704 100644 --- a/qt/aqt/sidebar.py +++ b/qt/aqt/sidebar.py @@ -553,7 +553,7 @@ class SidebarTreeView(QTreeView): if not self.isPersistentEditorOpen(index): self._on_search(index) elif event.key() == Qt.Key_Delete: - self._on_delete(index) + self._on_delete_key(index) else: super().keyPressEvent(event) @@ -641,14 +641,23 @@ class SidebarTreeView(QTreeView): if search_node := item.search_node: self.update_search(search_node) - def _on_delete(self, index: QModelIndex) -> None: + def _on_delete_key(self, index: QModelIndex) -> None: if item := self.model().item_for_index(index): - if item.item_type == SidebarItemType.SAVED_SEARCH: - self.remove_saved_searches(item) - elif item.item_type == SidebarItemType.DECK: - self.delete_decks(item) - elif item.item_type == SidebarItemType.TAG: - self.remove_tags(item) + if self._enable_delete(item): + self._on_delete(item) + + def _enable_delete(self, item: SidebarItem) -> bool: + return item.item_type.is_deletable() and all( + s.item_type == item.item_type for s in self._selected_items() + ) + + def _on_delete(self, item: SidebarItem) -> None: + if item.item_type == SidebarItemType.SAVED_SEARCH: + self.remove_saved_searches(item) + elif item.item_type == SidebarItemType.DECK: + self.delete_decks(item) + elif item.item_type == SidebarItemType.TAG: + self.remove_tags(item) def _on_expansion(self, idx: QModelIndex) -> None: if self.current_search: @@ -1059,10 +1068,8 @@ class SidebarTreeView(QTreeView): def _maybe_add_delete_action( self, menu: QMenu, item: SidebarItem, index: QModelIndex ) -> None: - if item.item_type.is_deletable() and all( - s.item_type == item.item_type for s in self._selected_items() - ): - menu.addAction(tr(TR.ACTIONS_DELETE), lambda: self._on_delete(index)) + if self._enable_delete(item): + menu.addAction(tr(TR.ACTIONS_DELETE), lambda: self._on_delete(item)) def _maybe_add_rename_action( self, menu: QMenu, item: SidebarItem, index: QModelIndex From 41428ca6f971b68803d7b9f8ea65e16576eaa09c Mon Sep 17 00:00:00 2001 From: RumovZ Date: Sat, 13 Mar 2021 09:45:06 +0100 Subject: [PATCH 2/2] Improve grouping of sidebar methods --- qt/aqt/sidebar.py | 78 ++++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 34 deletions(-) diff --git a/qt/aqt/sidebar.py b/qt/aqt/sidebar.py index 182160704..03d903152 100644 --- a/qt/aqt/sidebar.py +++ b/qt/aqt/sidebar.py @@ -256,7 +256,7 @@ class SidebarModel(QAbstractItemModel): def setData( self, index: QModelIndex, text: QVariant, _role: int = Qt.EditRole ) -> bool: - return self.sidebar.rename_node(index.internalPointer(), text) + return self.sidebar._on_rename(index.internalPointer(), text) def supportedDropActions(self) -> Qt.DropActions: return cast(Qt.DropActions, Qt.MoveAction) @@ -557,6 +557,7 @@ class SidebarTreeView(QTreeView): else: super().keyPressEvent(event) + # Slots ########### def _on_selection_changed(self, _new: QItemSelection, _old: QItemSelection) -> None: @@ -641,6 +642,18 @@ class SidebarTreeView(QTreeView): if search_node := item.search_node: self.update_search(search_node) + def _on_rename(self, item: SidebarItem, text: str) -> bool: + new_name = text.replace('"', "") + if new_name and new_name != item.name: + if item.item_type == SidebarItemType.DECK: + self.rename_deck(item, new_name) + elif item.item_type == SidebarItemType.SAVED_SEARCH: + self.rename_saved_search(item, new_name) + elif item.item_type == SidebarItemType.TAG: + self.rename_tag(item, new_name) + # renaming may be asynchronous so always return False + return False + def _on_delete_key(self, index: QModelIndex) -> None: if item := self.model().item_for_index(index): if self._enable_delete(item): @@ -1034,7 +1047,7 @@ class SidebarTreeView(QTreeView): root.add_child(item) - # Context menu actions + # Context menu ########################### def onContextMenu(self, point: QPoint) -> None: @@ -1134,6 +1147,9 @@ class SidebarTreeView(QTreeView): lambda: set_children_expanded(False), ) + # Decks + ########################### + def rename_deck(self, item: SidebarItem, new_name: str) -> None: deck = self.mw.col.decks.get(item.id) new_name = item.name_prefix + new_name @@ -1149,6 +1165,27 @@ class SidebarTreeView(QTreeView): self.mw.deckBrowser.refresh() self.mw.update_undo_actions() + def delete_decks(self, _item: SidebarItem) -> None: + self.browser.editor.saveNow(self._delete_decks) + + def _delete_decks(self) -> None: + def do_delete() -> int: + return self.mw.col.decks.remove(dids) + + def on_done(fut: Future) -> None: + self.mw.requireReset(reason=ResetReason.BrowserDeleteDeck, context=self) + self.browser.search() + self.browser.model.endReset() + tooltip(tr(TR.BROWSING_CARDS_DELETED, count=fut.result()), parent=self) + self.refresh() + + dids = self._selected_decks() + self.browser.model.beginReset() + self.mw.taskman.with_progress(do_delete, on_done) + + # Tags + ########################### + def remove_tags(self, item: SidebarItem) -> None: self.browser.editor.saveNow(lambda: self._remove_tags(item)) @@ -1202,38 +1239,8 @@ class SidebarTreeView(QTreeView): self.browser.model.beginReset() self.mw.taskman.with_progress(do_rename, on_done) - def delete_decks(self, _item: SidebarItem) -> None: - self.browser.editor.saveNow(self._delete_decks) - - def _delete_decks(self) -> None: - def do_delete() -> int: - return self.mw.col.decks.remove(dids) - - def on_done(fut: Future) -> None: - self.mw.requireReset(reason=ResetReason.BrowserDeleteDeck, context=self) - self.browser.search() - self.browser.model.endReset() - tooltip(tr(TR.BROWSING_CARDS_DELETED, count=fut.result()), parent=self) - self.refresh() - - dids = self._selected_decks() - self.browser.model.beginReset() - self.mw.taskman.with_progress(do_delete, on_done) - - def rename_node(self, item: SidebarItem, text: str) -> bool: - new_name = text.replace('"', "") - if new_name and new_name != item.name: - if item.item_type == SidebarItemType.DECK: - self.rename_deck(item, new_name) - elif item.item_type == SidebarItemType.SAVED_SEARCH: - self.rename_saved_search(item, new_name) - elif item.item_type == SidebarItemType.TAG: - self.rename_tag(item, new_name) - # renaming may be asynchronous so always return False - return False - # Saved searches - ################## + #################################### _saved_searches_key = "savedFilters" @@ -1293,6 +1300,9 @@ class SidebarTreeView(QTreeView): and item.name == name ) + # Notetypes and templates + #################################### + def manage_notetype(self, item: SidebarItem) -> None: Models( self.mw, parent=self.browser, fromMain=True, selected_notetype_id=item.id @@ -1303,7 +1313,7 @@ class SidebarTreeView(QTreeView): CardLayout(self.mw, note, ord=item.id, parent=self, fill_empty=True) # Helpers - ################## + #################################### def _selected_items(self) -> List[SidebarItem]: return [self.model().item_for_index(idx) for idx in self.selectedIndexes()]