feat(关闭文档): 区分关闭文档与标签
build.yaml / build (push) Successful in 48s

This commit is contained in:
xiaoqidun committed 2026-10-22 22:35:11 +08:00
1 parent a73d08d328
commit f15b40545a
2 files changed
+26 -18

No files matched your search

+1 -1
View File
@@ -24,7 +24,7 @@
<input id="fontDirectoryInput" class="file-input" type="file" webkitdirectory multiple> <input id="fontDirectoryInput" class="file-input" type="file" webkitdirectory multiple>
<div class="tool-group"> <div class="tool-group">
<button id="ofdButton" class="icon-button" type="button" title="打开"><span class="open-icon"></span></button> <button id="ofdButton" class="icon-button" type="button" title="打开"><span class="open-icon"></span></button>
<button id="closeButton" class="icon-button" type="button" title="关闭" disabled><span class="close-icon"></span></button> <button id="closeButton" class="icon-button" type="button" title="关闭文档" disabled><span class="close-icon"></span></button>
<button id="newButton" class="icon-button" type="button" title="新建"><span class="new-icon"></span></button> <button id="newButton" class="icon-button" type="button" title="新建"><span class="new-icon"></span></button>
<button id="saveButton" class="icon-button" type="button" title="保存" disabled><span class="save-icon"></span></button> <button id="saveButton" class="icon-button" type="button" title="保存" disabled><span class="save-icon"></span></button>
<button id="saveAsButton" class="icon-button" type="button" title="另存" disabled><span class="save-as-icon"></span></button> <button id="saveAsButton" class="icon-button" type="button" title="另存" disabled><span class="save-as-icon"></span></button>
+25 -17
View File
@@ -1468,7 +1468,7 @@ el.pageForm.addEventListener("submit", async (event) => {
}); });
el.ofdButton.addEventListener("click", openOFDFile); el.ofdButton.addEventListener("click", openOFDFile);
el.closeButton.addEventListener("pointerdown", event => event.preventDefault()); el.closeButton.addEventListener("pointerdown", event => event.preventDefault());
el.closeButton.addEventListener("click", () => closeFile().catch(error => showError(error, false))); el.closeButton.addEventListener("click", () => closeDocument().catch(error => showError(error, false)));
batchElements.Button.addEventListener("click", () => { updateBatchControls(); batchElements.Panel.showModal(); }); batchElements.Button.addEventListener("click", () => { updateBatchControls(); batchElements.Panel.showModal(); });
batchElements.Add.addEventListener("click", () => batchElements.Input.click()); batchElements.Add.addEventListener("click", () => batchElements.Input.click());
batchElements.Input.addEventListener("change", () => { addBatchFiles(batchElements.Input.files); batchElements.Input.value = ""; }); batchElements.Input.addEventListener("change", () => { addBatchFiles(batchElements.Input.files); batchElements.Input.value = ""; });
@@ -1850,7 +1850,7 @@ function handleKeyDown(event) {
if (nativeHost && (event.ctrlKey || event.metaKey) && (key === "Tab" || key.toLowerCase() === "w")) { if (nativeHost && (event.ctrlKey || event.metaKey) && (key === "Tab" || key.toLowerCase() === "w")) {
event.preventDefault(); event.preventDefault();
if (document.body.hasAttribute("data-busy") || formDialogOpen()) return; if (document.body.hasAttribute("data-busy") || formDialogOpen()) return;
if (key.toLowerCase() === "w") closeFile(); if (key.toLowerCase() === "w") closeTab(documentTab());
else { else {
const count = workspace.tabs.length, index = workspace.tabs.indexOf(documentTab()); const count = workspace.tabs.length, index = workspace.tabs.indexOf(documentTab());
activateDocumentTab(workspace.tabs[(index + (event.shiftKey ? -1 : 1) + count) % count]); activateDocumentTab(workspace.tabs[(index + (event.shiftKey ? -1 : 1) + count) % count]);
@@ -2559,14 +2559,14 @@ function renderDocumentTabs() {
close.disabled = !nativeHost && !tab.state.doc && !tab.opening && !tab.error && workspace.tabs.length === 1; close.disabled = !nativeHost && !tab.state.doc && !tab.opening && !tab.error && workspace.tabs.length === 1;
close.addEventListener("click", async event => { close.addEventListener("click", async event => {
event.stopPropagation(); event.stopPropagation();
await closeFile(tab); await closeTab(tab);
}); });
item.append(name, close); item.append(name, close);
item.addEventListener("click", () => activateDocumentTab(tab)); item.addEventListener("click", () => activateDocumentTab(tab));
item.addEventListener("auxclick", async event => { item.addEventListener("auxclick", async event => {
if (event.button !== 1) return; if (event.button !== 1) return;
event.preventDefault(); event.preventDefault();
await closeFile(tab); await closeTab(tab);
}); });
item.addEventListener("dragstart", event => { item.addEventListener("dragstart", event => {
if (event.target.closest("button")) { event.preventDefault(); return; } if (event.target.closest("button")) { event.preventDefault(); return; }
@@ -2591,7 +2591,7 @@ function renderDocumentTabs() {
item.addEventListener("keydown", async event => { item.addEventListener("keydown", async event => {
if (!["ArrowLeft", "ArrowRight", "Home", "End", "Delete"].includes(event.key) || event.target !== item) return; if (!["ArrowLeft", "ArrowRight", "Home", "End", "Delete"].includes(event.key) || event.target !== item) return;
event.preventDefault(); event.preventDefault();
if (event.key === "Delete") { await closeFile(tab); return; } if (event.key === "Delete") { await closeTab(tab); return; }
const index = workspace.tabs.indexOf(tab), count = workspace.tabs.length; const index = workspace.tabs.indexOf(tab), count = workspace.tabs.length;
const next = event.key === "Home" ? 0 : event.key === "End" ? count - 1 : (index + (event.key === "ArrowRight" ? 1 : -1) + count) % count; const next = event.key === "Home" ? 0 : event.key === "End" ? count - 1 : (index + (event.key === "ArrowRight" ? 1 : -1) + count) % count;
if (await activateDocumentTab(workspace.tabs[next])) el.documentTabs.querySelector('[data-selected="true"]')?.focus(); if (await activateDocumentTab(workspace.tabs[next])) el.documentTabs.querySelector('[data-selected="true"]')?.focus();
@@ -2890,17 +2890,21 @@ async function confirmDocumentClose(tab = documentTab()) {
return !tab.closed && !state.saving; return !tab.closed && !state.saving;
} }
async function closeFile(tab = null) { function closeDocument() {
const implicit = !tab?.state; return closeFile(documentTab(), true);
if (implicit) { }
if (workspace.closeDefault) return;
tab = documentTab(); function closeTab(tab) {
} return closeFile(tab, false);
}
async function closeFile(tab = documentTab(), keepTab = false) {
if (keepTab && workspace.closeDefault) return;
if (tab.closed || tab.closing || workspace.closing) return; if (tab.closed || tab.closing || workspace.closing) return;
if (nativeHost && workspace.tabs.length === 1) return closeWorkspace(); if (!keepTab && nativeHost && workspace.tabs.length === 1) return closeWorkspace();
if (!tab.state.doc && !tab.opening && !tab.error && workspace.tabs.length === 1) return; if (!tab.state.doc && !tab.opening && !tab.error && (keepTab || workspace.tabs.length === 1)) return;
tab.closing = true; tab.closing = true;
if (implicit) { if (keepTab) {
workspace.closeDefault = tab; workspace.closeDefault = tab;
queueMicrotask(() => { if (workspace.closeDefault === tab) workspace.closeDefault = null; }); queueMicrotask(() => { if (workspace.closeDefault === tab) workspace.closeDefault = null; });
} }
@@ -2922,7 +2926,11 @@ async function closeFile(tab = null) {
try { try {
const index = workspace.tabs.indexOf(tab); const index = workspace.tabs.indexOf(tab);
if (selected) detachDocumentView(); if (selected) detachDocumentView();
workspace.tabs.splice(index, 1); if (keepTab) {
const empty = createDocumentTab();
empty.id = tab.id;
workspace.tabs[index] = empty;
} else workspace.tabs.splice(index, 1);
if (!workspace.tabs.length) workspace.tabs.push(createDocumentTab()); if (!workspace.tabs.length) workspace.tabs.push(createDocumentTab());
if (selected) attachDocumentTab(workspace.tabs[Math.min(index, workspace.tabs.length - 1)]); if (selected) attachDocumentTab(workspace.tabs[Math.min(index, workspace.tabs.length - 1)]);
workspace.switching = false; workspace.switching = false;
@@ -13511,7 +13519,7 @@ function updateControls() {
updateStructureControls(); updateStructureControls();
const hasDoc = Boolean(state.doc); const hasDoc = Boolean(state.doc);
el.newButton.disabled = workspace.closing; el.newButton.disabled = workspace.closing;
el.closeButton.disabled = !nativeHost && !(hasDoc || documentTab().opening || documentTab().error) || workspace.closing; el.closeButton.disabled = !(hasDoc || documentTab().opening || documentTab().error) || workspace.closing;
updateDocumentControls(); updateDocumentControls();
updateDisplayControls(); updateDisplayControls();
updateEditorTools(); updateEditorTools();
@@ -13760,7 +13768,7 @@ function setBusy(busy, text = "", percent = 0, status = "", tab = documentTab())
el.newButton.disabled = false; el.newButton.disabled = false;
el.documentNewTab.disabled = workspace.closing; el.documentNewTab.disabled = workspace.closing;
el.pageLayoutButton.disabled = busy || !(state.doc?.pageCount > 1); el.pageLayoutButton.disabled = busy || !(state.doc?.pageCount > 1);
el.closeButton.disabled = !nativeHost && !(state.doc || tab.opening || tab.error) || workspace.closing; el.closeButton.disabled = !(state.doc || tab.opening || tab.error) || workspace.closing;
el.refreshAppButton.disabled = busy; el.refreshAppButton.disabled = busy;
updateStructureControls(); updateStructureControls();
updateDocumentControls(); updateDocumentControls();