Skip to content

Commit 88e0292

Browse files
committed
button for selecting image in note editor for occlusion
toggle between note editor and mask editor
1 parent bb216f6 commit 88e0292

File tree

7 files changed

+1322
-218
lines changed

7 files changed

+1322
-218
lines changed

qt/aqt/editor.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,6 +1171,30 @@ def collapseTags(self) -> None:
11711171
def expandTags(self) -> None:
11721172
aqt.mw.pm.set_tags_collapsed(self.editorMode, False)
11731173

1174+
def OnAttachImageForOcclusion(self) -> None:
1175+
"""Show a file selection screen, then add the selected media."""
1176+
extension_filter = " ".join(
1177+
f"*.{extension}" for extension in sorted(itertools.chain(pics))
1178+
)
1179+
filter = f"{tr.editing_media()} ({extension_filter})"
1180+
1181+
def accept(file: str) -> None:
1182+
self.resolve_media(file)
1183+
self.web.eval(f"setMaskEditorImagePath('{file}')")
1184+
1185+
file = getFile(
1186+
parent=self.widget,
1187+
title=tr.editing_add_media(),
1188+
cb=cast(Callable[[Any], None], accept),
1189+
filter=filter,
1190+
key="media",
1191+
)
1192+
1193+
self.parentWindow.activateWindow()
1194+
1195+
def OnToggleMaskEditor(self) -> None:
1196+
self.web.eval("toggleMaskEditor()")
1197+
11741198
# Links from HTML
11751199
######################################################################
11761200

@@ -1202,6 +1226,8 @@ def _init_links(self) -> None:
12021226
toggleCloseHTMLTags=Editor.toggleCloseHTMLTags,
12031227
expandTags=Editor.expandTags,
12041228
collapseTags=Editor.collapseTags,
1229+
attachImageForOcclusion=Editor.OnAttachImageForOcclusion,
1230+
toggleMaskEditor=Editor.OnToggleMaskEditor,
12051231
)
12061232

12071233

@@ -1448,9 +1474,10 @@ def reverse_url_quoting(txt: str, editor: Editor) -> str:
14481474
def set_cloze_button(editor: Editor) -> None:
14491475
action = "show" if editor.note.note_type()["type"] == MODEL_CLOZE else "hide"
14501476
editor.web.eval(
1451-
'require("anki/ui").loaded.then(() =>'
1452-
f'require("anki/NoteEditor").instances[0].toolbar.toolbar.{action}("cloze")'
1453-
"); "
1477+
'require("anki/ui").loaded.then(() => {'
1478+
f'require("anki/NoteEditor").instances[0].toolbar.toolbar.{action}("cloze");\n'
1479+
f'require("anki/NoteEditor").instances[0].toolbar.toolbar.{action}("image-cloze");\n'
1480+
"}); "
14541481
)
14551482

14561483

ts/editor/NoteEditor.svelte

Lines changed: 234 additions & 214 deletions
Large diffs are not rendered by default.

ts/editor/editor-toolbar/EditorToolbar.svelte

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
5555
import DynamicallySlottable from "../../components/DynamicallySlottable.svelte";
5656
import Item from "../../components/Item.svelte";
5757
import BlockButtons from "./BlockButtons.svelte";
58+
import ImageOcclusionButton from "./ImageOcclusionButton.svelte";
5859
import InlineButtons from "./InlineButtons.svelte";
5960
import NotetypeButtons from "./NotetypeButtons.svelte";
6061
import OptionsButtons from "./OptionsButtons.svelte";
@@ -120,6 +121,10 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
120121
<Item id="cloze">
121122
<RichTextClozeButtons />
122123
</Item>
124+
125+
<Item id="image-cloze">
126+
<ImageOcclusionButton />
127+
</Item>
123128
</DynamicallySlottable>
124129
</ButtonToolbar>
125130
</div>
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<!--
2+
Copyright: Ankitects Pty Ltd and contributors
3+
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
4+
-->
5+
<script lang="ts">
6+
import { bridgeCommand } from "@tslib/bridgecommand";
7+
import { promiseWithResolver } from "@tslib/promise";
8+
import { registerPackage } from "@tslib/runtime-require";
9+
import ButtonGroup from "components/ButtonGroup.svelte";
10+
import IconButton from "components/IconButton.svelte";
11+
import { setFormat } from "editor/old-editor-adapter";
12+
import type { RichTextInputAPI } from "editor/rich-text-input";
13+
import { editingInputIsRichText } from "editor/rich-text-input";
14+
15+
import { context } from "../NoteEditor.svelte";
16+
import { imagePlusIcon, maskEditorIcon } from "./icons";
17+
18+
const { focusedInput } = context.get();
19+
20+
let toogleButtonDisabled = true;
21+
let mediaPromise: Promise<string>;
22+
let resolve: (media: string) => void;
23+
24+
function resolveMedia(media: string): void {
25+
resolve?.(media);
26+
}
27+
28+
function attachImageForOcclusionOnFocus(): void {
29+
if (disabled) {
30+
return;
31+
}
32+
33+
[mediaPromise, resolve] = promiseWithResolver<string>();
34+
($focusedInput as RichTextInputAPI).editable.focusHandler.focus.on(
35+
async () => {
36+
setFormat("inserthtml", await mediaPromise);
37+
toogleButtonDisabled = false;
38+
},
39+
{ once: true },
40+
);
41+
bridgeCommand("attachImageForOcclusion");
42+
}
43+
44+
registerPackage("anki/TemplateButtons", {
45+
resolveMedia,
46+
});
47+
48+
$: disabled = !$focusedInput || !editingInputIsRichText($focusedInput);
49+
</script>
50+
51+
<ButtonGroup>
52+
<IconButton
53+
{disabled}
54+
on:click={() => {
55+
attachImageForOcclusionOnFocus();
56+
}}
57+
>
58+
{@html imagePlusIcon}
59+
</IconButton>
60+
<IconButton
61+
disabled={toogleButtonDisabled}
62+
on:click={() => {
63+
bridgeCommand("toggleMaskEditor");
64+
}}
65+
>
66+
{@html maskEditorIcon}
67+
</IconButton>
68+
</ButtonGroup>

ts/editor/editor-toolbar/icons.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ export { default as textColorIcon } from "@mdi/svg/svg/format-color-text.svg";
1010
export { default as subscriptIcon } from "@mdi/svg/svg/format-subscript.svg";
1111
export { default as superscriptIcon } from "@mdi/svg/svg/format-superscript.svg";
1212
export { default as functionIcon } from "@mdi/svg/svg/function-variant.svg";
13+
export { default as imagePlusIcon } from "@mdi/svg/svg/image-plus.svg";
1314
export { default as paperclipIcon } from "@mdi/svg/svg/paperclip.svg";
15+
export { default as maskEditorIcon } from "@mdi/svg/svg/view-dashboard.svg";
1416
export { default as eraserIcon } from "bootstrap-icons/icons/eraser.svg";
1517
export { default as justifyFullIcon } from "bootstrap-icons/icons/justify.svg";
1618
export { default as olIcon } from "bootstrap-icons/icons/list-ol.svg";

ts/editor/tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
"symbols-overlay/*",
88
"plain-text-input/*",
99
"rich-text-input/*",
10-
"editor-toolbar/*"
10+
"editor-toolbar/*",
11+
"../image-occlusion/*"
1112
],
1213
"references": [
1314
{ "path": "../components" },

0 commit comments

Comments
 (0)