From 1f002134fe0dabcb7ade0d542b93f6aa8fc47e95 Mon Sep 17 00:00:00 2001 From: Abdo Date: Mon, 30 Jun 2025 11:50:00 +0300 Subject: [PATCH] Add a basic fieldsAreBlank() --- proto/anki/frontend.proto | 1 + qt/aqt/addcards.py | 30 ++++++++++++++++++------------ qt/aqt/mediasrv.py | 16 ++++++++++++++++ ts/routes/editor/NoteEditor.svelte | 16 ++++++++++++++++ 4 files changed, 51 insertions(+), 12 deletions(-) diff --git a/proto/anki/frontend.proto b/proto/anki/frontend.proto index 0974913ec..60a82b845 100644 --- a/proto/anki/frontend.proto +++ b/proto/anki/frontend.proto @@ -38,6 +38,7 @@ service FrontendService { rpc OpenMedia(generic.String) returns (generic.Empty); rpc ShowInMediaFolder(generic.String) returns (generic.Empty); rpc RecordAudio(generic.Empty) returns (generic.String); + rpc CloseAddCards(generic.Bool) returns (generic.Empty); // Profile config rpc GetProfileConfigJson(generic.String) returns (generic.Json); diff --git a/qt/aqt/addcards.py b/qt/aqt/addcards.py index f1b1cdbcf..b4319d038 100644 --- a/qt/aqt/addcards.py +++ b/qt/aqt/addcards.py @@ -34,6 +34,7 @@ class AddCards(QMainWindow): def __init__(self, mw: AnkiQt) -> None: super().__init__(None, Qt.WindowType.Window) self._close_event_has_cleaned_up = False + self._close_callback: Callable[[], None] | None = None self.mw = mw self.col = mw.col form = aqt.forms.addcards.Ui_Dialog() @@ -249,21 +250,26 @@ class AddCards(QMainWindow): self.close() def ifCanClose(self, onOk: Callable) -> None: + self._close_callback = onOk + self.editor.web.eval("closeAddCards()") + + def _close_if_user_wants_to_discard_changes(self, is_empty: bool) -> None: + if is_empty: + self._close_callback() + return + def callback(choice: int) -> None: if choice == 0: - onOk() + self._close_callback() - def afterSave() -> None: - ask_user_dialog( - tr.adding_discard_current_input(), - callback=callback, - buttons=[ - QMessageBox.StandardButton.Discard, - (tr.adding_keep_editing(), QMessageBox.ButtonRole.RejectRole), - ], - ) - - self.editor.call_after_note_saved(afterSave) + ask_user_dialog( + tr.adding_discard_current_input(), + callback=callback, + buttons=[ + QMessageBox.StandardButton.Discard, + (tr.adding_keep_editing(), QMessageBox.ButtonRole.RejectRole), + ], + ) def closeWithCallback(self, cb: Callable[[], None]) -> None: def doClose() -> None: diff --git a/qt/aqt/mediasrv.py b/qt/aqt/mediasrv.py index 21ab8ad68..e4c1b256d 100644 --- a/qt/aqt/mediasrv.py +++ b/qt/aqt/mediasrv.py @@ -791,6 +791,21 @@ def write_clipboard() -> bytes: return b"" +def close_add_cards() -> bytes: + req = generic_pb2.Bool() + req.ParseFromString(request.data) + + def handle_on_main() -> None: + from aqt.addcards import AddCards + + window = aqt.mw.app.activeWindow() + if isinstance(window, AddCards): + window._close_if_user_wants_to_discard_changes(req.val) + + aqt.mw.taskman.run_on_main(lambda: QTimer.singleShot(0, handle_on_main)) + return b"" + + post_handler_list = [ congrats_info, get_deck_configs_for_update, @@ -820,6 +835,7 @@ post_handler_list = [ record_audio, read_clipboard, write_clipboard, + close_add_cards, ] diff --git a/ts/routes/editor/NoteEditor.svelte b/ts/routes/editor/NoteEditor.svelte index 3bef364b9..7b9f42688 100644 --- a/ts/routes/editor/NoteEditor.svelte +++ b/ts/routes/editor/NoteEditor.svelte @@ -370,6 +370,20 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html saveFieldNow(); } + // TODO this needs to accept a previousNote arg + async function fieldsAreBlank(): Promise { + const result = await noteFieldsCheck(note!); + if (result.state === NoteFieldsCheckResponse_State.EMPTY) { + return true; + } + return false; + } + + async function closeAddCards() { + saveNow(); + await closeAddCardsBackend({ val: await fieldsAreBlank() }); + } + export function saveOnPageHide() { if (document.visibilityState === "hidden") { // will fire on session close and minimize @@ -559,6 +573,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html addNote, addMediaFromPath, updateNotetype, + closeAddCards as closeAddCardsBackend, } from "@generated/backend"; import { wrapInternal } from "@tslib/wrap"; import { getProfileConfig, getMeta, setMeta, getColConfig } from "@tslib/profile"; @@ -925,6 +940,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html setBackgrounds, setClozeHint, saveNow, + closeAddCards, focusIfField, setNotetypeMeta, wrap,