From 32af54cd4d413bc762353acba7c0c8f9fb206db7 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Mon, 1 Mar 2021 09:58:12 +1000 Subject: [PATCH] catch attempts to nest under a filtered deck; don't show traceback --- ftl/core/errors.ftl | 2 +- qt/aqt/deckbrowser.py | 6 +++++- qt/aqt/sidebar.py | 6 +++++- rslib/src/decks/mod.rs | 3 +++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/ftl/core/errors.ftl b/ftl/core/errors.ftl index 23a8cc7a3..cc3b138d0 100644 --- a/ftl/core/errors.ftl +++ b/ftl/core/errors.ftl @@ -1,4 +1,4 @@ errors-invalid-input-empty = Invalid input. errors-invalid-input-details = Invalid input: { $details } errors-parse-number-fail = A number was invalid or out of range. -errors-filtered-parent-deck = Invalid deck name: Filtered decks cannot be parent decks. +errors-filtered-parent-deck = Filtered decks can not have child decks. diff --git a/qt/aqt/deckbrowser.py b/qt/aqt/deckbrowser.py index 9b788bafb..3977edf7b 100644 --- a/qt/aqt/deckbrowser.py +++ b/qt/aqt/deckbrowser.py @@ -287,7 +287,11 @@ class DeckBrowser: self._renderPage(reuse=True) def _handle_drag_and_drop(self, source: int, target: int) -> None: - self.mw.col.decks.drag_drop_decks([source], target) + try: + self.mw.col.decks.drag_drop_decks([source], target) + except Exception as e: + showWarning(str(e)) + return gui_hooks.sidebar_should_refresh_decks() self.show() diff --git a/qt/aqt/sidebar.py b/qt/aqt/sidebar.py index ca2e26e79..513144057 100644 --- a/qt/aqt/sidebar.py +++ b/qt/aqt/sidebar.py @@ -472,7 +472,11 @@ class SidebarTreeView(QTreeView): def on_done(fut: Future) -> None: self.browser.model.endReset() - fut.result() + try: + fut.result() + except Exception as e: + showWarning(str(e)) + return self.refresh() self.mw.deckBrowser.refresh() diff --git a/rslib/src/decks/mod.rs b/rslib/src/decks/mod.rs index 9c69af06d..9ade97912 100644 --- a/rslib/src/decks/mod.rs +++ b/rslib/src/decks/mod.rs @@ -605,6 +605,9 @@ impl Collection { let mut target_name = None; if let Some(target) = target { if let Some(target) = col.storage.get_deck(target)? { + if target.is_filtered() { + return Err(AnkiError::DeckIsFiltered); + } target_deck = target; target_name = Some(target_deck.name.as_str()); }