Persist field states with SessionOptions object (#2241)

* Persist collapsed- and field states with SessionOptions object

* Format types.ts

* Replace format function with f-string

* Give setters more descriptive parameter names

* Do not use default prefix for descriptions and fonts

since they are not meant to be changed via Svelte.
This commit is contained in:
Matthias Metelka 2022-12-07 06:37:46 +01:00 committed by GitHub
parent e059aab184
commit d2fa50dd9f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 70 additions and 37 deletions

View file

@ -523,35 +523,23 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too
text_color = self.mw.pm.profile.get("lastTextColor", "#00f") text_color = self.mw.pm.profile.get("lastTextColor", "#00f")
highlight_color = self.mw.pm.profile.get("lastHighlightColor", "#00f") highlight_color = self.mw.pm.profile.get("lastHighlightColor", "#00f")
js = """ js = f"""
setFields({}); saveSession();
setCollapsed({}); setFields({json.dumps(data)});
setPlainTexts({}); setNotetypeId({json.dumps(self.note.mid)});
setDescriptions({}); setCollapsed({json.dumps(collapsed)});
setFonts({}); setPlainTexts({json.dumps(plain_texts)});
focusField({}); setDescriptions({json.dumps(descriptions)});
setNoteId({}); setFonts({json.dumps(self.fonts())});
setColorButtons({}); focusField({json.dumps(focusTo)});
setTags({}); setNoteId({json.dumps(self.note.id)});
setTagsCollapsed({}); setColorButtons({json.dumps([text_color, highlight_color])});
setMathjaxEnabled({}); setTags({json.dumps(self.note.tags)});
setShrinkImages({}); setTagsCollapsed({json.dumps(self.mw.pm.tags_collapsed(self.editorMode))});
setCloseHTMLTags({}); setMathjaxEnabled({json.dumps(self.mw.col.get_config("renderMathjax", True))});
""".format( setShrinkImages({json.dumps(self.mw.col.get_config("shrinkEditorImages", True))});
json.dumps(data), setCloseHTMLTags({json.dumps(self.mw.col.get_config("closeHTMLTags", True))});
json.dumps(collapsed), """
json.dumps(plain_texts),
json.dumps(descriptions),
json.dumps(self.fonts()),
json.dumps(focusTo),
json.dumps(self.note.id),
json.dumps([text_color, highlight_color]),
json.dumps(self.note.tags),
json.dumps(self.mw.pm.tags_collapsed(self.editorMode)),
json.dumps(self.mw.col.get_config("renderMathjax", True)),
json.dumps(self.mw.col.get_config("shrinkEditorImages", True)),
json.dumps(self.mw.col.get_config("closeHTMLTags", True)),
)
if self.addMode: if self.addMode:
sticky = [field["sticky"] for field in self.note.note_type()["flds"]] sticky = [field["sticky"] for field in self.note.note_type()["flds"]]

View file

@ -71,6 +71,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import RichTextInput, { editingInputIsRichText } from "./rich-text-input"; import RichTextInput, { editingInputIsRichText } from "./rich-text-input";
import RichTextBadge from "./RichTextBadge.svelte"; import RichTextBadge from "./RichTextBadge.svelte";
import SymbolsOverlay from "./symbols-overlay"; import SymbolsOverlay from "./symbols-overlay";
import type { SessionOptions } from "./types";
function quoteFontFamily(fontFamily: string): string { function quoteFontFamily(fontFamily: string): string {
// generic families (e.g. sans-serif) must not be quoted // generic families (e.g. sans-serif) must not be quoted
@ -83,6 +84,20 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
const size = 1.6; const size = 1.6;
const wrap = true; const wrap = true;
const sessionOptions: SessionOptions = {};
export function saveSession(): void {
if (notetypeId) {
sessionOptions[notetypeId] = {
fieldsCollapsed,
fieldStates: {
richTextsHidden,
plainTextsHidden,
plainTextDefaults,
},
};
}
}
const fieldStores: Writable<string>[] = []; const fieldStores: Writable<string>[] = [];
let fieldNames: string[] = []; let fieldNames: string[] = [];
export function setFields(fs: [string, string][]): void { export function setFields(fs: [string, string][]): void {
@ -119,18 +134,26 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
} }
let fieldsCollapsed: boolean[] = []; let fieldsCollapsed: boolean[] = [];
export function setCollapsed(fs: boolean[]): void { export function setCollapsed(defaultCollapsed: boolean[]): void {
fieldsCollapsed = fs; fieldsCollapsed =
sessionOptions[notetypeId!]?.fieldsCollapsed ?? defaultCollapsed;
} }
let richTextsHidden: boolean[] = []; let richTextsHidden: boolean[] = [];
let plainTextsHidden: boolean[] = []; let plainTextsHidden: boolean[] = [];
let plainTextDefaults: boolean[] = []; let plainTextDefaults: boolean[] = [];
export function setPlainTexts(fs: boolean[]): void { export function setPlainTexts(defaultPlainTexts: boolean[]): void {
richTextsHidden = fs; const states = sessionOptions[notetypeId!]?.fieldStates;
plainTextsHidden = Array.from(fs, (v) => !v); if (states) {
plainTextDefaults = [...richTextsHidden]; richTextsHidden = states.richTextsHidden;
plainTextsHidden = states.plainTextsHidden;
plainTextDefaults = states.plainTextDefaults;
} else {
plainTextDefaults = defaultPlainTexts;
richTextsHidden = defaultPlainTexts;
plainTextsHidden = Array.from(defaultPlainTexts, (v) => !v);
}
} }
function setMathjaxEnabled(enabled: boolean): void { function setMathjaxEnabled(enabled: boolean): void {
@ -138,8 +161,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
} }
let fieldDescriptions: string[] = []; let fieldDescriptions: string[] = [];
export function setDescriptions(fs: string[]): void { export function setDescriptions(descriptions: string[]): void {
fieldDescriptions = fs; fieldDescriptions = descriptions;
} }
let fonts: [string, number, boolean][] = []; let fonts: [string, number, boolean][] = [];
@ -187,6 +210,11 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
noteId = ntid; noteId = ntid;
} }
let notetypeId: number | null = null;
export function setNotetypeId(mid: number): void {
notetypeId = mid;
}
let insertSymbols = false; let insertSymbols = false;
function setInsertSymbolsEnabled() { function setInsertSymbolsEnabled() {
@ -299,6 +327,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
} }
Object.assign(globalThis, { Object.assign(globalThis, {
saveSession,
setFields, setFields,
setCollapsed, setCollapsed,
setPlainTexts, setPlainTexts,
@ -313,6 +342,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
focusIfField, focusIfField,
getNoteId, getNoteId,
setNoteId, setNoteId,
setNotetypeId,
wrap, wrap,
setMathjaxEnabled, setMathjaxEnabled,
setInsertSymbolsEnabled, setInsertSymbolsEnabled,

15
ts/editor/types.ts Normal file
View file

@ -0,0 +1,15 @@
// Copyright: Ankitects Pty Ltd and contributors
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
export type EditorOptions = {
fieldsCollapsed: boolean[];
fieldStates: {
richTextsHidden: boolean[];
plainTextsHidden: boolean[];
plainTextDefaults: boolean[];
};
};
export type SessionOptions = {
[key: number]: EditorOptions;
};