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;