mirror of
https://github.com/ankitects/anki.git
synced 2025-09-21 15:32:23 -04:00
Add option to shrink editor images by default (#2071)
+ Don't persist shrinking toggle Closes #1894
This commit is contained in:
parent
c1176a2e6c
commit
4089e76800
9 changed files with 142 additions and 14 deletions
|
@ -61,6 +61,7 @@ editing-underline-text = Underline text
|
||||||
editing-unordered-list = Unordered list
|
editing-unordered-list = Unordered list
|
||||||
editing-warning-cloze-deletions-will-not-work = Warning, cloze deletions will not work until you switch the type at the top to Cloze.
|
editing-warning-cloze-deletions-will-not-work = Warning, cloze deletions will not work until you switch the type at the top to Cloze.
|
||||||
editing-toggle-mathjax-rendering = Toggle MathJax Rendering
|
editing-toggle-mathjax-rendering = Toggle MathJax Rendering
|
||||||
|
editing-shrink-images = Shrink Images
|
||||||
|
|
||||||
## You don't need to translate these strings, as they will be replaced with different ones soon.
|
## You don't need to translate these strings, as they will be replaced with different ones soon.
|
||||||
|
|
||||||
|
|
|
@ -534,6 +534,7 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too
|
||||||
setColorButtons({});
|
setColorButtons({});
|
||||||
setTags({});
|
setTags({});
|
||||||
setMathjaxEnabled({});
|
setMathjaxEnabled({});
|
||||||
|
setShrinkImages({});
|
||||||
""".format(
|
""".format(
|
||||||
json.dumps(data),
|
json.dumps(data),
|
||||||
json.dumps(collapsed),
|
json.dumps(collapsed),
|
||||||
|
@ -545,6 +546,7 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too
|
||||||
json.dumps([text_color, highlight_color]),
|
json.dumps([text_color, highlight_color]),
|
||||||
json.dumps(self.note.tags),
|
json.dumps(self.note.tags),
|
||||||
json.dumps(self.mw.col.get_config("renderMathjax", True)),
|
json.dumps(self.mw.col.get_config("renderMathjax", True)),
|
||||||
|
json.dumps(self.mw.col.get_config("shrinkEditorImages", True)),
|
||||||
)
|
)
|
||||||
|
|
||||||
if self.addMode:
|
if self.addMode:
|
||||||
|
@ -1159,6 +1161,12 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too
|
||||||
self.setupWeb()
|
self.setupWeb()
|
||||||
self.loadNoteKeepingFocus()
|
self.loadNoteKeepingFocus()
|
||||||
|
|
||||||
|
def toggleShrinkImages(self) -> None:
|
||||||
|
self.mw.col.set_config(
|
||||||
|
"shrinkEditorImages",
|
||||||
|
not self.mw.col.get_config("shrinkEditorImages", True),
|
||||||
|
)
|
||||||
|
|
||||||
# Links from HTML
|
# Links from HTML
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
|
@ -1186,6 +1194,7 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too
|
||||||
mathjaxBlock=Editor.insertMathjaxBlock,
|
mathjaxBlock=Editor.insertMathjaxBlock,
|
||||||
mathjaxChemistry=Editor.insertMathjaxChemistry,
|
mathjaxChemistry=Editor.insertMathjaxChemistry,
|
||||||
toggleMathjax=Editor.toggleMathjax,
|
toggleMathjax=Editor.toggleMathjax,
|
||||||
|
toggleShrinkImages=Editor.toggleShrinkImages,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ module.exports = {
|
||||||
"warn",
|
"warn",
|
||||||
{ argsIgnorePattern: "^_", varsIgnorePattern: "^_" },
|
{ argsIgnorePattern: "^_", varsIgnorePattern: "^_" },
|
||||||
],
|
],
|
||||||
|
"no-unused-vars": ["warn", { argsIgnorePattern: "^_" }],
|
||||||
"import/newline-after-import": "warn",
|
"import/newline-after-import": "warn",
|
||||||
"import/no-useless-path-segments": "warn",
|
"import/no-useless-path-segments": "warn",
|
||||||
"simple-import-sort/imports": "warn",
|
"simple-import-sort/imports": "warn",
|
||||||
|
|
|
@ -3,9 +3,17 @@ Copyright: Ankitects Pty Ltd and contributors
|
||||||
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
-->
|
-->
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
:global([data-editor-shrink]:not([data-editor-shrink="false"])) {
|
:global(img) {
|
||||||
max-width: var(--editor-shrink-max-width);
|
max-width: var(--editor-default-max-width);
|
||||||
max-height: var(--editor-shrink-max-height);
|
max-height: var(--editor-default-max-height);
|
||||||
width: auto;
|
|
||||||
|
&:is([data-editor-shrink="true"]) {
|
||||||
|
max-width: var(--editor-shrink-max-width);
|
||||||
|
max-height: var(--editor-shrink-max-height);
|
||||||
|
}
|
||||||
|
&:is([data-editor-shrink="false"]) {
|
||||||
|
max-width: initial;
|
||||||
|
max-height: initial;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -58,6 +58,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
import FrameElement from "./FrameElement.svelte";
|
import FrameElement from "./FrameElement.svelte";
|
||||||
import { alertIcon } from "./icons";
|
import { alertIcon } from "./icons";
|
||||||
import ImageHandle from "./image-overlay";
|
import ImageHandle from "./image-overlay";
|
||||||
|
import { shrinkImagesByDefault } from "./image-overlay/ImageOverlay.svelte";
|
||||||
import MathjaxHandle from "./mathjax-overlay";
|
import MathjaxHandle from "./mathjax-overlay";
|
||||||
import MathjaxElement from "./MathjaxElement.svelte";
|
import MathjaxElement from "./MathjaxElement.svelte";
|
||||||
import Notification from "./Notification.svelte";
|
import Notification from "./Notification.svelte";
|
||||||
|
@ -210,9 +211,18 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
const fieldSave = new ChangeTimer();
|
const fieldSave = new ChangeTimer();
|
||||||
|
|
||||||
|
function transformContentBeforeSave(content: string): string {
|
||||||
|
return content.replace(/ data-editor-shrink="(true|false)"/g, "");
|
||||||
|
}
|
||||||
|
|
||||||
function updateField(index: number, content: string): void {
|
function updateField(index: number, content: string): void {
|
||||||
fieldSave.schedule(
|
fieldSave.schedule(
|
||||||
() => bridgeCommand(`key:${index}:${getNoteId()}:${content}`),
|
() =>
|
||||||
|
bridgeCommand(
|
||||||
|
`key:${index}:${getNoteId()}:${transformContentBeforeSave(
|
||||||
|
content,
|
||||||
|
)}`,
|
||||||
|
),
|
||||||
600,
|
600,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -250,6 +260,10 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
const toolbar: Partial<EditorToolbarAPI> = {};
|
const toolbar: Partial<EditorToolbarAPI> = {};
|
||||||
|
|
||||||
|
function setShrinkImages(shrinkByDefault: boolean) {
|
||||||
|
$shrinkImagesByDefault = shrinkByDefault;
|
||||||
|
}
|
||||||
|
|
||||||
import { mathjaxConfig } from "../editable/mathjax-element";
|
import { mathjaxConfig } from "../editable/mathjax-element";
|
||||||
import { wrapInternal } from "../lib/wrap";
|
import { wrapInternal } from "../lib/wrap";
|
||||||
import { refocusInput } from "./helpers";
|
import { refocusInput } from "./helpers";
|
||||||
|
@ -283,6 +297,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
wrap,
|
wrap,
|
||||||
setMathjaxEnabled,
|
setMathjaxEnabled,
|
||||||
setInsertSymbolsEnabled,
|
setInsertSymbolsEnabled,
|
||||||
|
setShrinkImages,
|
||||||
...oldEditorAdapter,
|
...oldEditorAdapter,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -350,7 +365,11 @@ the AddCards dialog) should be implemented in the user of this component.
|
||||||
}}
|
}}
|
||||||
on:focusout={() => {
|
on:focusout={() => {
|
||||||
$focusedField = null;
|
$focusedField = null;
|
||||||
bridgeCommand(`blur:${index}:${getNoteId()}:${get(content)}`);
|
bridgeCommand(
|
||||||
|
`blur:${index}:${getNoteId()}:${transformContentBeforeSave(
|
||||||
|
get(content),
|
||||||
|
)}`,
|
||||||
|
);
|
||||||
}}
|
}}
|
||||||
on:mouseenter={() => {
|
on:mouseenter={() => {
|
||||||
$hoveredField = fields[index];
|
$hoveredField = fields[index];
|
||||||
|
|
|
@ -56,6 +56,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
import BlockButtons from "./BlockButtons.svelte";
|
import BlockButtons from "./BlockButtons.svelte";
|
||||||
import InlineButtons from "./InlineButtons.svelte";
|
import InlineButtons from "./InlineButtons.svelte";
|
||||||
import NotetypeButtons from "./NotetypeButtons.svelte";
|
import NotetypeButtons from "./NotetypeButtons.svelte";
|
||||||
|
import OptionsButton from "./OptionsButton.svelte";
|
||||||
import RichTextClozeButtons from "./RichTextClozeButtons.svelte";
|
import RichTextClozeButtons from "./RichTextClozeButtons.svelte";
|
||||||
import TemplateButtons from "./TemplateButtons.svelte";
|
import TemplateButtons from "./TemplateButtons.svelte";
|
||||||
|
|
||||||
|
@ -108,6 +109,10 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
<Item id="cloze">
|
<Item id="cloze">
|
||||||
<RichTextClozeButtons />
|
<RichTextClozeButtons />
|
||||||
</Item>
|
</Item>
|
||||||
|
|
||||||
|
<Item id="options">
|
||||||
|
<OptionsButton />
|
||||||
|
</Item>
|
||||||
</DynamicallySlottable>
|
</DynamicallySlottable>
|
||||||
</ButtonToolbar>
|
</ButtonToolbar>
|
||||||
</div>
|
</div>
|
||||||
|
|
49
ts/editor/editor-toolbar/OptionsButton.svelte
Normal file
49
ts/editor/editor-toolbar/OptionsButton.svelte
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
<!--
|
||||||
|
Copyright: Ankitects Pty Ltd and contributors
|
||||||
|
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
-->
|
||||||
|
<script lang="ts">
|
||||||
|
import CheckBox from "../../components/CheckBox.svelte";
|
||||||
|
import DropdownItem from "../../components/DropdownItem.svelte";
|
||||||
|
import IconButton from "../../components/IconButton.svelte";
|
||||||
|
import Popover from "../../components/Popover.svelte";
|
||||||
|
import WithFloating from "../../components/WithFloating.svelte";
|
||||||
|
import { bridgeCommand } from "../../lib/bridgecommand";
|
||||||
|
import * as tr from "../../lib/ftl";
|
||||||
|
import { shrinkImagesByDefault } from "../image-overlay/ImageOverlay.svelte";
|
||||||
|
import { cogIcon } from "./icons";
|
||||||
|
|
||||||
|
let showFloating = false;
|
||||||
|
|
||||||
|
function toggleShrinkImages(_evt: MouseEvent): void {
|
||||||
|
$shrinkImagesByDefault = !$shrinkImagesByDefault;
|
||||||
|
bridgeCommand("toggleShrinkImages");
|
||||||
|
showFloating = false;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<WithFloating
|
||||||
|
show={showFloating}
|
||||||
|
placement="bottom"
|
||||||
|
inline
|
||||||
|
on:close={() => (showFloating = false)}
|
||||||
|
let:asReference
|
||||||
|
>
|
||||||
|
<span use:asReference>
|
||||||
|
<IconButton
|
||||||
|
tooltip={tr.actionsOptions()}
|
||||||
|
--border-left-radius="5px"
|
||||||
|
--border-right-radius="5px"
|
||||||
|
on:click={() => (showFloating = !showFloating)}
|
||||||
|
>
|
||||||
|
{@html cogIcon}
|
||||||
|
</IconButton>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<Popover slot="floating" --popover-padding-inline="0">
|
||||||
|
<DropdownItem on:click={toggleShrinkImages}>
|
||||||
|
<CheckBox value={$shrinkImagesByDefault} />
|
||||||
|
<span class="d-flex-inline ps-3">{tr.editingShrinkImages()}</span>
|
||||||
|
</DropdownItem>
|
||||||
|
</Popover>
|
||||||
|
</WithFloating>
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
/// <reference types="../../lib/image-import" />
|
/// <reference types="../../lib/image-import" />
|
||||||
|
|
||||||
|
export { default as cogIcon } from "@mdi/svg/svg/cog.svg";
|
||||||
export { default as colorHelperIcon } from "@mdi/svg/svg/color-helper.svg";
|
export { default as colorHelperIcon } from "@mdi/svg/svg/color-helper.svg";
|
||||||
export { default as highlightColorIcon } from "@mdi/svg/svg/format-color-highlight.svg";
|
export { default as highlightColorIcon } from "@mdi/svg/svg/format-color-highlight.svg";
|
||||||
export { default as textColorIcon } from "@mdi/svg/svg/format-color-text.svg";
|
export { default as textColorIcon } from "@mdi/svg/svg/format-color-text.svg";
|
||||||
|
|
|
@ -2,6 +2,12 @@
|
||||||
Copyright: Ankitects Pty Ltd and contributors
|
Copyright: Ankitects Pty Ltd and contributors
|
||||||
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
-->
|
-->
|
||||||
|
<script lang="ts" context="module">
|
||||||
|
import { writable } from "svelte/store";
|
||||||
|
|
||||||
|
export const shrinkImagesByDefault = writable(true);
|
||||||
|
</script>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { onMount, tick } from "svelte";
|
import { onMount, tick } from "svelte";
|
||||||
|
|
||||||
|
@ -27,18 +33,47 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
let activeImage: HTMLImageElement | null = null;
|
let activeImage: HTMLImageElement | null = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For element dataset attributes which work like the contenteditable attribute
|
* Returns the value if set, otherwise null.
|
||||||
*/
|
*/
|
||||||
function isDatasetAttributeFlagSet(
|
function getBooleanDatasetAttribute(
|
||||||
element: HTMLElement | SVGElement,
|
element: HTMLElement | SVGElement,
|
||||||
attribute: string,
|
attribute: string,
|
||||||
): boolean {
|
): boolean | null {
|
||||||
return attribute in element.dataset && element.dataset[attribute] !== "false";
|
return attribute in element.dataset
|
||||||
|
? element.dataset[attribute] !== "false"
|
||||||
|
: null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$: isSizeConstrained = activeImage
|
let isSizeConstrained = false;
|
||||||
? isDatasetAttributeFlagSet(activeImage, "editorShrink")
|
$: {
|
||||||
: false;
|
if (activeImage) {
|
||||||
|
isSizeConstrained =
|
||||||
|
getBooleanDatasetAttribute(activeImage, "editorShrink") ??
|
||||||
|
$shrinkImagesByDefault;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$: {
|
||||||
|
if ($shrinkImagesByDefault) {
|
||||||
|
document.documentElement.style.setProperty(
|
||||||
|
"--editor-default-max-width",
|
||||||
|
`${maxWidth}px`,
|
||||||
|
);
|
||||||
|
document.documentElement.style.setProperty(
|
||||||
|
"--editor-default-max-height",
|
||||||
|
`${maxHeight}px`,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
document.documentElement.style.setProperty(
|
||||||
|
"--editor-default-max-width",
|
||||||
|
"inherit",
|
||||||
|
);
|
||||||
|
document.documentElement.style.setProperty(
|
||||||
|
"--editor-default-max-height",
|
||||||
|
"inherit",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function resetHandle(): Promise<void> {
|
async function resetHandle(): Promise<void> {
|
||||||
activeImage = null;
|
activeImage = null;
|
||||||
|
@ -181,7 +216,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
|
|
||||||
function toggleActualSize(): void {
|
function toggleActualSize(): void {
|
||||||
if (isSizeConstrained) {
|
if (isSizeConstrained) {
|
||||||
delete activeImage!.dataset.editorShrink;
|
activeImage!.dataset.editorShrink = "false";
|
||||||
} else {
|
} else {
|
||||||
activeImage!.dataset.editorShrink = "true";
|
activeImage!.dataset.editorShrink = "true";
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue