From 62631472ea9ceadb4e7f823e26941746c9846c91 Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Wed, 28 Oct 2026 19:23:09 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E7=BC=96=E8=BE=91=E8=83=BD=E5=8A=9B):=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BA=95=E8=89=B2=E5=8F=8A=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E9=A2=9C=E8=89=B2=E6=8F=90=E4=BA=A4=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/webui/ofdgo.js | 53 +++++++++++++++++++++++++++++++++++--- assets/webui/ofdgo_edit.js | 9 ++++++- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/assets/webui/ofdgo.js b/assets/webui/ofdgo.js index 5171187..d408910 100644 --- a/assets/webui/ofdgo.js +++ b/assets/webui/ofdgo.js @@ -702,12 +702,14 @@ const fontManager = new FontManager({ const fontPicker = new FontPicker(el.textFont, el.textFontToggle, el.textFontList, changeTextFont, loadEditorFonts); const textFormatButtons = [...document.querySelectorAll("[data-text-format]")]; const textBackground = document.querySelector("#textBackground"); +const editorColors = new Map(); const annotationFields = Object.fromEntries(["CreateForm", "CreateCancel", "Content", "Old", "Font", "Text", "TextRow", "Image", "ImageRow", "Author", "LinkKind", "Address", "AddressRow", "Target", "TargetRow", "X", "Y", "Width", "Height", "Angle", "Opacity", "Tile", "Placement", "PlacementLabel", "Pick", "Scope", "Pages"].map(key => [key, document.querySelector(`#annotation${key}`)])); el.editorTools.addEventListener("scroll", () => fontPicker.position()); const canvasEditor = new CanvasEditor(el.viewerPanel, { textControls: [el.textAlign, el.textFont, el.textFontToggle, el.textFontAdd, el.textFontList, el.textSize, el.textColor, el.textLineHeight, el.textSpacing, el.textWrap, el.paragraphButton, el.paragraphPanel, textBackground, ...textFormatButtons, el.undoButton, el.redoButton, el.saveButton, el.saveAsButton, el.fontInput, document.querySelector("#textReflow")], keepTextFocus: () => fontPicker.open || el.closePanel.open || el.paragraphPanel.open || canvasEditor.input?.fontDialog, + prepareTextCommit: flushEditorColors, onTextFormat: changeRangeFormat, onRichInput: ensureRichInput, textClipboardScope: () => `${documentTab().id}:${documentContentKey(state)}:${state.editorInfo?.revision ?? ""}`, @@ -867,9 +869,10 @@ editorClick(el.editObjectButton, () => { } }); el.textSize.addEventListener("change", () => changeTextStyle(false)); -el.textColor.addEventListener("change", () => changeTextStyle(true)); +bindEditorColor(el.textColor, () => changeTextStyle(true)); for (const button of textFormatButtons) button.addEventListener("click", () => changeRangeFormat(button.dataset.textFormat)); -textBackground.addEventListener("change", () => changeRangeFormat("background", textBackground.value)); +bindEditorColor(textBackground, value => changeRangeFormat("background", value)); +document.addEventListener("pointerdown", flushEditorColors, true); editorClick(el.textWrap, () => changeParagraph(!currentTextStyle().wrap), true); el.textAlign.addEventListener("change", () => changeTextAlignment()); el.textLineHeight.addEventListener("change", () => changeParagraph(undefined, "lineHeight")); @@ -1303,9 +1306,10 @@ editorClick(el.eraseButton, () => toggleDrawingTool(el.eraseMode.value)); el.eraseMode.addEventListener("change", () => { if (canvasEditor.tool.startsWith("erase-")) canvasEditor.setTool(el.eraseMode.value); }); -for (const input of [el.shapeFill, el.shapeFillColor, el.shapeStroke, el.shapeStrokeColor, el.shapeWidth]) { +for (const input of [el.shapeFill, el.shapeStroke, el.shapeWidth]) { input.addEventListener("change", changeShapeStyle); } +for (const input of [el.shapeFillColor, el.shapeStrokeColor]) bindEditorColor(input, () => changeShapeStyle({ target: input })); el.addPageButton.addEventListener("change", async () => { const action = el.addPageButton.value; el.addPageButton.value = ""; @@ -3005,6 +3009,9 @@ async function releaseDocumentTab(tab) { if (!prepared && workspace.objectClipboard === clipboard) workspace.objectClipboard = null; } tab.closed = true; + for (const color of editorColors.values()) { + if (color.pending?.tab === tab) { color.pending = null; color.handled = true; } + } tab.print?.destroy(); tab.print = null; tab.opening?.controller.abort(); @@ -4208,6 +4215,46 @@ async function reflowCanvasText() { updateObjectControls(canvasEditor.selected, true); } +function bindEditorColor(input, change) { + const color = { input, change, pending: null, task: null, handled: false }; + editorColors.set(input, color); + const remember = () => { + color.pending = { value: input.value, tab: documentTab(), content: documentContentKey(state), editing: canvasEditor.input, selected: canvasEditor.selected }; + color.handled = false; + }; + input.addEventListener("input", remember); + input.addEventListener("change", () => { + let task; + if (!color.handled) { + if (!color.pending) remember(); + task = flushEditorColor(color); + } + color.handled = false; + return task; + }); +} + +function flushEditorColor(color) { + if (color.task || !color.pending) return color.task; + color.task = (async () => { + while (color.pending) { + const pending = color.pending; + color.pending = null; + color.handled = true; + if (!isForegroundDocument(pending.tab) || pending.content !== documentContentKey(state) + || pending.editing !== canvasEditor.input || pending.selected !== canvasEditor.selected) continue; + color.input.value = pending.value; + await color.change(pending.value); + } + })().finally(() => { color.task = null; }); + return color.task; +} + +function flushEditorColors() { + const tasks = [...editorColors.values()].map(flushEditorColor).filter(Boolean); + return tasks.length ? Promise.all(tasks) : null; +} + async function changeRangeFormat(key, value) { if (!state.ready || document.body.hasAttribute("data-busy") || canvasEditor.input?.composing) return; const tab = documentTab(), editing = canvasEditor.input; diff --git a/assets/webui/ofdgo_edit.js b/assets/webui/ofdgo_edit.js index f4ee9cb..64f6fe4 100644 --- a/assets/webui/ofdgo_edit.js +++ b/assets/webui/ofdgo_edit.js @@ -2306,12 +2306,19 @@ export class CanvasEditor { async commitText() { const editing = this.input; if (!editing) return true; - if (editing.saving) return false; + if (editing.saving || editing.preparingCommit) return false; if (editing.composing) { editing.commitAfterComposition = true; return false; } editing.commitAfterComposition = false; + const preparation = this.options.prepareTextCommit?.(); + if (preparation) { + editing.preparingCommit = true; + try { await preparation; } + finally { editing.preparingCommit = false; } + if (this.input !== editing) return !this.input; + } const value = editTextValue(editing.input); if (!this.textChanged()) { this.closeText();