Implement close button

This commit is contained in:
Abdo 2025-07-09 05:32:46 +03:00
parent 01fd4df9cb
commit a8a2e4ee32
8 changed files with 87 additions and 35 deletions

View file

@ -42,6 +42,7 @@ service FrontendService {
rpc ShowInMediaFolder(generic.String) returns (generic.Empty); rpc ShowInMediaFolder(generic.String) returns (generic.Empty);
rpc RecordAudio(generic.Empty) returns (generic.String); rpc RecordAudio(generic.Empty) returns (generic.String);
rpc CloseAddCards(generic.Bool) returns (generic.Empty); rpc CloseAddCards(generic.Bool) returns (generic.Empty);
rpc CloseEditCurrent(generic.Empty) returns (generic.Empty);
// Profile config // Profile config
rpc GetProfileConfigJson(generic.String) returns (generic.Json); rpc GetProfileConfigJson(generic.String) returns (generic.Json);

View file

@ -34,7 +34,7 @@ class AddCards(QMainWindow):
def __init__(self, mw: AnkiQt) -> None: def __init__(self, mw: AnkiQt) -> None:
super().__init__(None, Qt.WindowType.Window) super().__init__(None, Qt.WindowType.Window)
self._close_event_has_cleaned_up = False self._close_event_has_cleaned_up = False
self._close_callback: Callable[[], None] | None = None self._close_callback: Callable[[], None] = self._close
self.mw = mw self.mw = mw
self.col = mw.col self.col = mw.col
form = aqt.forms.addcards.Ui_Dialog() form = aqt.forms.addcards.Ui_Dialog()

View file

@ -32,13 +32,7 @@ class EditCurrent(QMainWindow):
self.editor.card = self.mw.reviewer.card self.editor.card = self.mw.reviewer.card
self.editor.set_note(self.mw.reviewer.card.note(), focusTo=0) self.editor.set_note(self.mw.reviewer.card.note(), focusTo=0)
restoreGeom(self, "editcurrent") restoreGeom(self, "editcurrent")
close_button = self.form.buttonBox.button(QDialogButtonBox.StandardButton.Close)
assert close_button is not None
close_button.setShortcut(QKeySequence("Ctrl+Return"))
add_close_shortcut(self) add_close_shortcut(self)
# qt5.14+ doesn't handle numpad enter on Windows
self.compat_add_shorcut = QShortcut(QKeySequence("Ctrl+Enter"), self)
qconnect(self.compat_add_shorcut.activated, close_button.click)
gui_hooks.operation_did_execute.append(self.on_operation_did_execute) gui_hooks.operation_did_execute.append(self.on_operation_did_execute)
self.show() self.show()

View file

@ -28,16 +28,6 @@
<item> <item>
<widget class="QWidget" name="fieldsArea" native="true"/> <widget class="QWidget" name="fieldsArea" native="true"/>
</item> </item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QMenuBar" name="menubar"> <widget class="QMenuBar" name="menubar">
@ -60,22 +50,4 @@
<resources> <resources>
<include location="icons.qrc"/> <include location="icons.qrc"/>
</resources> </resources>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>Dialog</receiver>
<slot>close()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui> </ui>

View file

@ -818,6 +818,18 @@ def close_add_cards() -> bytes:
return b"" return b""
def close_edit_current() -> bytes:
def handle_on_main() -> None:
from aqt.editcurrent import EditCurrent
window = aqt.mw.app.activeWindow()
if isinstance(window, EditCurrent):
window.close()
aqt.mw.taskman.run_on_main(lambda: QTimer.singleShot(0, handle_on_main))
return b""
post_handler_list = [ post_handler_list = [
congrats_info, congrats_info,
get_deck_configs_for_update, get_deck_configs_for_update,
@ -850,6 +862,7 @@ post_handler_list = [
read_clipboard, read_clipboard,
write_clipboard, write_clipboard,
close_add_cards, close_add_cards,
close_edit_current,
] ]
@ -1048,3 +1061,4 @@ def _extract_dynamic_get_request(path: str) -> DynamicRequest | None:
return legacy_page_data return legacy_page_data
else: else:
return None return None
return None

View file

@ -0,0 +1,23 @@
<!--
Copyright: Ankitects Pty Ltd and contributors
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
<script lang="ts">
import CloseButton from "./CloseButton.svelte";
import type { EditorMode } from "./types";
export let mode: EditorMode;
export let onClose: () => void;
</script>
<div class="action-buttons d-flex flex-row-reverse">
{#if mode === "add" || mode === "current"}
<CloseButton {onClose} />
{/if}
</div>
<style lang="scss">
.action-buttons {
margin-top: 10px;
}
</style>

View file

@ -0,0 +1,32 @@
<!--
Copyright: Ankitects Pty Ltd and contributors
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
<script lang="ts">
import * as tr from "@generated/ftl";
import { getPlatformString } from "@tslib/shortcuts";
import LabelButton from "$lib/components/LabelButton.svelte";
import Shortcut from "$lib/components/Shortcut.svelte";
const rtl: boolean = window.getComputedStyle(document.body).direction == "rtl";
export let onClose: () => void;
const closeKeyCombination = "Control+Enter";
</script>
<LabelButton
primary
on:click={onClose}
tooltip={getPlatformString(closeKeyCombination)}
--border-left-radius={!rtl ? "var(--border-radius)" : "0"}
--border-right-radius={rtl ? "var(--border-radius)" : "0"}
>
<div class="close">{tr.actionsClose()}</div>
</LabelButton>
<Shortcut keyCombination={closeKeyCombination} on:action={onClose} />
<style lang="scss">
.close {
margin: 0 0.75rem;
}
</style>

View file

@ -397,6 +397,19 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
await closeAddCardsBackend({ val: await shouldPromptBeforeClosing() }); await closeAddCardsBackend({ val: await shouldPromptBeforeClosing() });
} }
async function closeEditCurrent() {
saveNow();
await closeEditCurrentBackend({});
}
async function onClose() {
if (mode === "add") {
await closeAddCards();
} else if (mode == "current") {
await closeEditCurrent();
}
}
export function saveOnPageHide() { export function saveOnPageHide() {
if (document.visibilityState === "hidden") { if (document.visibilityState === "hidden") {
// will fire on session close and minimize // will fire on session close and minimize
@ -588,6 +601,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
addMediaFromPath, addMediaFromPath,
updateEditorNotetype, updateEditorNotetype,
closeAddCards as closeAddCardsBackend, closeAddCards as closeAddCardsBackend,
closeEditCurrent as closeEditCurrentBackend,
} from "@generated/backend"; } from "@generated/backend";
import { wrapInternal } from "@tslib/wrap"; import { wrapInternal } from "@tslib/wrap";
import { getProfileConfig, getMeta, setMeta, getColConfig } from "@tslib/profile"; import { getProfileConfig, getMeta, setMeta, getColConfig } from "@tslib/profile";
@ -611,6 +625,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import { NoteFieldsCheckResponse_State, type Note } from "@generated/anki/notes_pb"; import { NoteFieldsCheckResponse_State, type Note } from "@generated/anki/notes_pb";
import { setupContextMenu } from "./context-menu.svelte"; import { setupContextMenu } from "./context-menu.svelte";
import { registerShortcut } from "@tslib/shortcuts"; import { registerShortcut } from "@tslib/shortcuts";
import ActionButtons from "./ActionButtons.svelte";
$: isIOImageLoaded = false; $: isIOImageLoaded = false;
$: ioImageLoadedStore.set(isIOImageLoaded); $: ioImageLoadedStore.set(isIOImageLoaded);
@ -1221,6 +1236,7 @@ components and functionality for general note editing.
<Collapsible toggleDisplay collapse={$tagsCollapsed}> <Collapsible toggleDisplay collapse={$tagsCollapsed}>
<TagEditor {tags} on:tagsupdate={saveTags} /> <TagEditor {tags} on:tagsupdate={saveTags} />
</Collapsible> </Collapsible>
<ActionButtons {mode} {onClose} />
{/if} {/if}
<ContextMenu bind:this={contextMenu}> <ContextMenu bind:this={contextMenu}>