diff --git a/qt/aqt/editor.py b/qt/aqt/editor.py index c2d80e8af..3eed03c64 100644 --- a/qt/aqt/editor.py +++ b/qt/aqt/editor.py @@ -511,6 +511,7 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too collapsed = [fld["collapsed"] for fld in flds] plain_texts = [fld.get("plainText", False) for fld in flds] descriptions = [fld.get("description", "") for fld in flds] + notetype_meta = {"id": self.note.mid, "modTime": self.note.note_type()["mod"]} self.widget.show() @@ -533,7 +534,7 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too js = f""" saveSession(); setFields({json.dumps(data)}); - setNotetypeId({json.dumps(self.note.mid)}); + setNotetypeMeta({json.dumps(notetype_meta)}); setCollapsed({json.dumps(collapsed)}); setPlainTexts({json.dumps(plain_texts)}); setDescriptions({json.dumps(descriptions)}); diff --git a/ts/editor/NoteEditor.svelte b/ts/editor/NoteEditor.svelte index bcfc20928..2fdf9f069 100644 --- a/ts/editor/NoteEditor.svelte +++ b/ts/editor/NoteEditor.svelte @@ -67,7 +67,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import RichTextInput, { editingInputIsRichText } from "./rich-text-input"; import RichTextBadge from "./RichTextBadge.svelte"; import SymbolsOverlay from "./symbols-overlay"; - import type { SessionOptions } from "./types"; + import type { NotetypeIdAndModTime, SessionOptions } from "./types"; function quoteFontFamily(fontFamily: string): string { // generic families (e.g. sans-serif) must not be quoted @@ -82,14 +82,15 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html const sessionOptions: SessionOptions = {}; export function saveSession(): void { - if (notetypeId) { - sessionOptions[notetypeId] = { + if (notetypeMeta) { + sessionOptions[notetypeMeta.id] = { fieldsCollapsed, fieldStates: { richTextsHidden, plainTextsHidden, plainTextDefaults, }, + modTimeOfNotetype: notetypeMeta.modTime, }; } } @@ -132,7 +133,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html let fieldsCollapsed: boolean[] = []; export function setCollapsed(defaultCollapsed: boolean[]): void { fieldsCollapsed = - sessionOptions[notetypeId!]?.fieldsCollapsed ?? defaultCollapsed; + sessionOptions[notetypeMeta?.id]?.fieldsCollapsed ?? defaultCollapsed; } let richTextsHidden: boolean[] = []; @@ -140,7 +141,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html let plainTextDefaults: boolean[] = []; export function setPlainTexts(defaultPlainTexts: boolean[]): void { - const states = sessionOptions[notetypeId!]?.fieldStates; + const states = sessionOptions[notetypeMeta?.id]?.fieldStates; if (states) { richTextsHidden = states.richTextsHidden; plainTextsHidden = states.plainTextsHidden; @@ -223,9 +224,13 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html noteId = ntid; } - let notetypeId: number | null = null; - export function setNotetypeId(mid: number): void { - notetypeId = mid; + let notetypeMeta: NotetypeIdAndModTime; + function setNotetypeMeta({ id, modTime }: NotetypeIdAndModTime): void { + notetypeMeta = { id, modTime }; + // Discard the saved state of the fields if the notetype has been modified. + if (sessionOptions[id]?.modTimeOfNotetype !== modTime) { + delete sessionOptions[id]; + } } let insertSymbols = false; @@ -405,7 +410,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html focusIfField, getNoteId, setNoteId, - setNotetypeId, + setNotetypeMeta, wrap, setMathjaxEnabled, setInsertSymbolsEnabled, diff --git a/ts/editor/PlainTextBadge.svelte b/ts/editor/PlainTextBadge.svelte index 51b46aa50..5310a5b02 100644 --- a/ts/editor/PlainTextBadge.svelte +++ b/ts/editor/PlainTextBadge.svelte @@ -5,7 +5,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import * as tr from "@tslib/ftl"; import { getPlatformString, registerShortcut } from "@tslib/shortcuts"; - import { createEventDispatcher, onMount } from "svelte"; + import { createEventDispatcher, onDestroy } from "svelte"; import Badge from "../components/Badge.svelte"; import { context as editorFieldContext } from "./EditorField.svelte"; @@ -24,11 +24,13 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html dispatch("toggle"); } - function shortcut(target: HTMLElement): () => void { - return registerShortcut(toggle, keyCombination, { target }); - } + let unregister: ReturnType | undefined; - onMount(() => editorField.element.then(shortcut)); + editorField.element.then((target) => { + unregister = registerShortcut(toggle, keyCombination, { target }); + }); + + onDestroy(() => unregister?.());