diff --git a/app/src/boot/globalShortcut.ts b/app/src/boot/globalShortcut.ts index bb63d299d..8a8db0f61 100644 --- a/app/src/boot/globalShortcut.ts +++ b/app/src/boot/globalShortcut.ts @@ -436,7 +436,7 @@ export const globalShortcut = (app: App) => { if (event.key === "Shift") { window.siyuan.shiftIsPressed = true; if (!event.repeat) { - showPopover(app,true); + showPopover(app, true); } } else { window.siyuan.shiftIsPressed = false; @@ -478,8 +478,11 @@ export const globalShortcut = (app: App) => { rootId = ` data-node-id="${item.model.editor.protyle.block.rootID}"`; icon = unicode2Emoji(item.docIcon || Constants.SIYUAN_IMAGE_FILE, false, "b3-list-item__graphic", true); } else if (initData) { - rootId = ` data-node-id="${JSON.parse(initData).rootId}"`; - icon = unicode2Emoji(item.docIcon || Constants.SIYUAN_IMAGE_FILE, false, "b3-list-item__graphic", true); + const initDataObj = JSON.parse(initData) + if (initDataObj.instance === "Editor") { + rootId = ` data-node-id="${initDataObj.rootId}"`; + icon = unicode2Emoji(item.docIcon || Constants.SIYUAN_IMAGE_FILE, false, "b3-list-item__graphic", true); + } } tabHtml += `
  • ${icon}${escapeHtml(item.title)}
  • `; }); diff --git a/app/src/editor/util.ts b/app/src/editor/util.ts index f67cf92ac..02ee95bda 100644 --- a/app/src/editor/util.ts +++ b/app/src/editor/util.ts @@ -110,6 +110,16 @@ export const openFile = (options: IOpenFileOptions) => { } }); if (custom) { + if (options.afterOpen) { + options.afterOpen(); + } + return; + } + const hasModel = getUnInitTab(options); + if (hasModel) { + if (options.afterOpen) { + options.afterOpen(); + } return; } } else if (options.searchData) { @@ -284,7 +294,8 @@ const getUnInitTab = (options: IOpenFileOptions) => { const initData = item.headElement?.getAttribute("data-initdata"); if (initData) { const initObj = JSON.parse(initData); - if (initObj.rootId === options.rootID || initObj.blockId === options.rootID) { + if (initObj.instance === "Editor" && + (initObj.rootId === options.rootID || initObj.blockId === options.rootID)) { initObj.blockId = options.id; initObj.mode = options.mode; if (options.zoomIn) { @@ -296,6 +307,9 @@ const getUnInitTab = (options: IOpenFileOptions) => { item.headElement.setAttribute("data-initdata", JSON.stringify(initObj)); item.parent.switchTab(item.headElement); return true; + } else if (initObj.instance === "Custom" && objEquals(initObj.customModelData, options.custom.data)) { + item.parent.switchTab(item.headElement); + return true; } } }); diff --git a/app/src/index.ts b/app/src/index.ts index 9d0f540e8..92b580d7c 100644 --- a/app/src/index.ts +++ b/app/src/index.ts @@ -80,7 +80,7 @@ export class App { const initTab = tab.headElement.getAttribute("data-initdata"); if (initTab) { const initTabData = JSON.parse(initTab); - if (initTabData.rootId === data.data.id) { + if (initTabData.instance === "Editor" && initTabData.rootId === data.data.id) { tab.updateTitle(data.data.title); } } @@ -93,7 +93,7 @@ export class App { const initTab = tab.headElement.getAttribute("data-initdata"); if (initTab) { const initTabData = JSON.parse(initTab); - if (data.data.box === initTabData.notebookId) { + if (initTabData.instance === "Editor" && data.data.box === initTabData.notebookId) { tab.parent.removeTab(tab.id); } } @@ -106,7 +106,7 @@ export class App { const initTab = tab.headElement.getAttribute("data-initdata"); if (initTab) { const initTabData = JSON.parse(initTab); - if (data.data.ids.includes(initTabData.rootId)) { + if (initTabData.instance === "Editor" && data.data.ids.includes(initTabData.rootId)) { tab.parent.removeTab(tab.id); } } diff --git a/app/src/layout/Tab.ts b/app/src/layout/Tab.ts index d8f298ada..247653d1d 100644 --- a/app/src/layout/Tab.ts +++ b/app/src/layout/Tab.ts @@ -54,7 +54,7 @@ export class Tab { id = (this.model as Editor).editor.protyle.block.rootID; } else if (!this.model) { const initData = JSON.parse(this.headElement.getAttribute("data-initdata") || "{}"); - if (initData) { + if (initData && initData.instance === "Editor") { id = initData.blockId; } } diff --git a/app/src/layout/Wnd.ts b/app/src/layout/Wnd.ts index bc17bc958..2d35f989b 100644 --- a/app/src/layout/Wnd.ts +++ b/app/src/layout/Wnd.ts @@ -3,7 +3,7 @@ import {genUUID} from "../util/genID"; import { getInstanceById, getWndByLayout, JSONToCenter, - newCenterEmptyTab, pdfIsLoading, + newCenterEmptyTab, newModelByInitData, pdfIsLoading, resizeTabs, setPanelFocus, switchWnd @@ -434,15 +434,7 @@ export class Wnd { if (currentTab && currentTab.headElement) { const initData = currentTab.headElement.getAttribute("data-initdata"); if (initData) { - const json = JSON.parse(initData); - currentTab.addModel(new Editor({ - app: this.app, - tab: currentTab, - blockId: json.blockId, - mode: json.mode, - action: typeof json.action === "string" ? [json.action] : json.action, - scrollAttr: json.scrollAttr, - })); + currentTab.addModel(newModelByInitData(this.app, currentTab, JSON.parse(initData))) currentTab.headElement.removeAttribute("data-initdata"); return; } diff --git a/app/src/layout/util.ts b/app/src/layout/util.ts index 4563b7943..e149657a0 100644 --- a/app/src/layout/util.ts +++ b/app/src/layout/util.ts @@ -265,7 +265,7 @@ const JSONToDock = (json: any, app: App) => { window.siyuan.layout.bottomDock = new Dock({position: "Bottom", data: json.bottom, app}); }; -export const JSONToCenter = (app: App, json: ILayoutJSON, layout?: Layout | Wnd | Tab | Model, isStart = false) => { +export const JSONToCenter = (app: App, json: ILayoutJSON, layout?: Layout | Wnd | Tab | Model) => { let child: Layout | Wnd | Tab | Model; if (json.instance === "Layout") { if (!layout) { @@ -376,75 +376,51 @@ export const JSONToCenter = (app: App, json: ILayoutJSON, layout?: Layout | Wnd config: json.config })); } else if (json.instance === "Custom") { - if (json.customModelType === "siyuan-card") { - (layout as Tab).addModel(newCardModel({ - app, - tab: (layout as Tab), - data: json.customModelData - })); - } else { - app.plugins.find(item => { - if (item.models[json.customModelType]) { - (layout as Tab).addModel(item.models[json.customModelType]({ - tab: (layout as Tab), - data: json.customModelData - })); - return true; - } - }); + if (window.siyuan.config.fileTree.openFilesUseCurrentTab) { + (layout as Tab).headElement.classList.add("item--unupdate"); } + (layout as Tab).headElement.setAttribute("data-initdata", JSON.stringify(json)); } if (json.children) { if (Array.isArray(json.children)) { - json.children.forEach((item: any, index: number) => { - JSONToCenter(app, item, layout ? child : window.siyuan.layout.layout, isStart); - if (item.instance === "Tab" && index === (json.children as ILayoutJSON[]).length - 1) { - const activeTabElement = (child as Wnd).headersElement.querySelector('[data-init-active="true"]') as HTMLElement; - if (activeTabElement) { - if (window.siyuan.config.fileTree.closeTabsOnStart && isStart && - !item.pin && item.title) { - // 启动时关闭所有页签就不应该再初始化它 - } else { - activeTabElement.removeAttribute("data-init-active"); - (child as Wnd).switchTab(activeTabElement, false, false); - } - } - } + json.children.forEach((item: any) => { + JSONToCenter(app, item, layout ? child : window.siyuan.layout.layout); }); } else { - JSONToCenter(app, json.children, child, isStart); + JSONToCenter(app, json.children, child); } } }; export const JSONToLayout = (app: App, isStart: boolean) => { - JSONToCenter(app, window.siyuan.config.uiLayout.layout, undefined, isStart); + JSONToCenter(app, window.siyuan.config.uiLayout.layout, undefined); JSONToDock(window.siyuan.config.uiLayout, app); // 启动时不打开页签,需要移除没有钉住的页签 if (window.siyuan.config.fileTree.closeTabsOnStart && isStart) { getAllTabs().forEach(item => { if (item.headElement && !item.headElement.classList.contains("item--pin")) { - item.parent.removeTab(item.id); + item.parent.removeTab(item.id, false, false, false); } }); } + app.plugins.forEach(item => { + afterLoadPlugin(item); + }); const idZoomIn = getIdZoomInByPath(); - - - setTimeout(() => { - // 启动时 layout 中有该文档,该文档还原会在此之后,因此需有延迟 - if (idZoomIn.id) { - openFileById({ - app, - id: idZoomIn.id, - action: idZoomIn.isZoomIn ? [Constants.CB_GET_ALL, Constants.CB_GET_FOCUS] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT], - zoomIn: idZoomIn.isZoomIn - }); - } - app.plugins.forEach(item => { - afterLoadPlugin(item); + if (idZoomIn.id) { + openFileById({ + app, + id: idZoomIn.id, + action: idZoomIn.isZoomIn ? [Constants.CB_GET_ALL, Constants.CB_GET_FOCUS] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT], + zoomIn: idZoomIn.isZoomIn }); - }, Constants.TIMEOUT_LOAD); + } else { + document.querySelectorAll('li[data-type="tab-header"][data-init-active="true"]').forEach((item: HTMLElement) => { + item.removeAttribute("data-init-active"); + const tab = getInstanceById(item.getAttribute("data-id")) as Tab + tab.parent.switchTab(item, false, false); + }); + } }; export const layoutToJSON = (layout: Layout | Wnd | Tab | Model, json: any, dropEditScroll = false) => { @@ -706,23 +682,52 @@ export const copyTab = (app: App, tab: Tab) => { } } else if (!tab.model && tab.headElement) { const initData = JSON.parse(tab.headElement.getAttribute("data-initdata") || "{}"); - if (initData.scrollAttr) { - initData.scrollAttr.rootId = initData.rootId; + if (initData) { + // 历史数据兼容 2023-05-24 + if (initData.scrollAttr) { + initData.scrollAttr.rootId = initData.rootId; + } + model = newModelByInitData(app, newTab, initData); } - model = new Editor({ - app, - tab: newTab, - blockId: initData.blockId, - mode: initData.mode, - action: typeof initData.action === "string" ? [initData.action] : initData.action, - scrollAttr: initData.scrollAttr, - }); } newTab.addModel(model); } }); }; +export const newModelByInitData = (app: App, tab: Tab, json: any) => { + let model: Model + if (json.instance === "Custom") { + if (json.customModelType === "siyuan-card") { + model = newCardModel({ + app, + tab: tab, + data: json.customModelData + }) + } else { + app.plugins.find(item => { + if (item.models[json.customModelType]) { + model = item.models[json.customModelType]({ + tab: tab, + data: json.customModelData + }); + return true; + } + }); + } + } else if (json.instance === "Editor") { + model = new Editor({ + app, + tab, + blockId: json.blockId, + mode: json.mode, + action: typeof json.action === "string" ? [json.action] : json.action, + scrollAttr: json.scrollAttr, + }); + } + return model; +} + export const pdfIsLoading = (element: HTMLElement) => { const isLoading = element.querySelector('.layout-tab-container > [data-loading="true"]') ? true : false; if (isLoading) { diff --git a/app/src/menus/tab.ts b/app/src/menus/tab.ts index 7220a195d..852a2c324 100644 --- a/app/src/menus/tab.ts +++ b/app/src/menus/tab.ts @@ -176,7 +176,9 @@ export const initTabMenu = (app: App, tab: Tab) => { const initData = tab.headElement.getAttribute("data-initdata"); if (initData) { const initDataObj = JSON.parse(initData); - rootId = initDataObj.rootId || initDataObj.blockId; + if (initDataObj && initDataObj.instance === "Editor") { + rootId = initDataObj.rootId || initDataObj.blockId; + } } } if (rootId) { diff --git a/app/src/window/global/function.ts b/app/src/window/global/function.ts index d0e700b42..da57d9ee0 100644 --- a/app/src/window/global/function.ts +++ b/app/src/window/global/function.ts @@ -17,7 +17,7 @@ export const switchTabById = (id: string) => { const initTab = tab.headElement.getAttribute("data-initdata"); if (initTab) { const initTabData = JSON.parse(initTab); - if (initTabData.rootId === id) { + if (initTabData.instance === "Editor" && initTabData.rootId === id) { tab.parent.switchTab(tab.headElement); return true; } diff --git a/app/src/window/index.ts b/app/src/window/index.ts index 79216a103..8d6b312b7 100644 --- a/app/src/window/index.ts +++ b/app/src/window/index.ts @@ -64,7 +64,7 @@ class App { const initTab = tab.headElement.getAttribute("data-initdata"); if (initTab) { const initTabData = JSON.parse(initTab); - if (initTabData.rootId === data.data.id) { + if (initTabData.instance === "Editor" && initTabData.rootId === data.data.id) { tab.updateTitle(data.data.title); } } @@ -77,7 +77,7 @@ class App { const initTab = tab.headElement.getAttribute("data-initdata"); if (initTab) { const initTabData = JSON.parse(initTab); - if (data.data.box === initTabData.notebookId) { + if (initTabData.instance === "Editor" && data.data.box === initTabData.notebookId) { tab.parent.removeTab(tab.id); } } @@ -90,7 +90,7 @@ class App { const initTab = tab.headElement.getAttribute("data-initdata"); if (initTab) { const initTabData = JSON.parse(initTab); - if (data.data.ids.includes(initTabData.rootId)) { + if (initTabData.instance === "Editor" && data.data.ids.includes(initTabData.rootId)) { tab.parent.removeTab(tab.id); } } diff --git a/app/src/window/setHeader.ts b/app/src/window/setHeader.ts index d3ece6a43..1cd5395d1 100644 --- a/app/src/window/setHeader.ts +++ b/app/src/window/setHeader.ts @@ -66,7 +66,9 @@ export const setModelsHash = () => { const initTab = tab.headElement.getAttribute("data-initdata"); if (initTab) { const initTabData = JSON.parse(initTab); - hash += initTabData.rootId + Constants.ZWSP; + if (initTabData.instance === "Editor") { + hash += initTabData.rootId + Constants.ZWSP; + } } } else if (tab.model instanceof Editor) { hash += tab.model.editor.protyle.block.rootID + Constants.ZWSP;