diff --git a/app/src/layout/dock/index.ts b/app/src/layout/dock/index.ts index 902645479..cb5584bee 100644 --- a/app/src/layout/dock/index.ts +++ b/app/src/layout/dock/index.ts @@ -19,6 +19,8 @@ import {App} from "../../index"; import {Plugin} from "../../plugin"; import {Custom} from "./Custom"; +const TYPES = ["file", "outline", "inbox", "bookmark", "tag", "graph", "globalGraph", "backlink"]; + export class Dock { public element: HTMLElement; public layout: Layout; @@ -63,7 +65,26 @@ export class Dock { this.position = options.position; this.pin = options.data.pin; this.data = {}; - if (options.data.data.length === 0) { + let showDock = false + if (options.data.data.length !== 0) { + if (!showDock) { + options.data.data[0].find(item => { + if (TYPES.includes(item.type)) { + showDock = true + return true + } + }) + } + if (!showDock) { + options.data.data[1].find(item => { + if (TYPES.includes(item.type)) { + showDock = true + return true + } + }) + } + } + if (!showDock) { this.element.firstElementChild.innerHTML = ` `; diff --git a/app/src/layout/util.ts b/app/src/layout/util.ts index 6635c681e..4563b7943 100644 --- a/app/src/layout/util.ts +++ b/app/src/layout/util.ts @@ -37,6 +37,7 @@ import {Custom} from "./dock/Custom"; import {newCardModel} from "../card/newCardTab"; import {openRecentDocs} from "../business/openRecentDocs"; import {App} from "../index"; +import {afterLoadPlugin} from "../plugin/loader"; export const setPanelFocus = (element: Element) => { if (element.classList.contains("layout__tab--active") || element.classList.contains("layout__wnd--active")) { @@ -239,55 +240,24 @@ export const exportLayout = (options: { }); }; -const pushPluginDock = (app: App, dockItem: IDockTab[], position: TPluginDockPosition) => { - const needPushData: { [key: string]: IPluginDockTab } = {}; - app.plugins.forEach((pluginItem) => { - let isExist = false; - dockItem.forEach(existSubItem => { - if (Object.keys(pluginItem.docks).includes(existSubItem.type)) { - isExist = true; - } - }); - if (!isExist) { - Object.keys(pluginItem.docks).forEach(pluginDockKey => { - if (pluginItem.docks[pluginDockKey].config.position === position) { - needPushData[pluginDockKey] = pluginItem.docks[pluginDockKey].config; - } - }); - } - }); - dockItem.forEach((existSubItem, index) => { - if (!["file", "outline", "inbox", "bookmark", "tag", "graph", "globalGraph", "backlink"].includes(existSubItem.type)) { - dockItem.splice(index, 1); - return; - } +const initInternalDock = (dockItem: IDockTab[]) => { + dockItem.forEach((existSubItem) => { if (existSubItem.hotkeyLangId) { existSubItem.title = window.siyuan.languages[existSubItem.hotkeyLangId]; existSubItem.hotkey = window.siyuan.config.keymap.general[existSubItem.hotkeyLangId].custom; } }); - Object.keys(needPushData).forEach(key => { - const item = needPushData[key]; - dockItem.push({ - type: key, - size: item.size, - show: false, - icon: item.icon, - hotkey: item.hotkey || "", - title: item.title, - }); - }); }; const JSONToDock = (json: any, app: App) => { - json.left.data.forEach((existItem: IDockTab[], index: number) => { - pushPluginDock(app, existItem, index === 0 ? "LeftTop" : "LeftBottom"); + json.left.data.forEach((existItem: IDockTab[]) => { + initInternalDock(existItem); }); - json.right.data.forEach((existItem: IDockTab[], index: number) => { - pushPluginDock(app, existItem, index === 0 ? "RightTop" : "RightBottom"); + json.right.data.forEach((existItem: IDockTab[]) => { + initInternalDock(existItem); }); - json.bottom.data.forEach((existItem: IDockTab[], index: number) => { - pushPluginDock(app, existItem, index === 0 ? "BottomLeft" : "BottomRight"); + json.bottom.data.forEach((existItem: IDockTab[]) => { + initInternalDock(existItem); }); window.siyuan.layout.centerLayout = window.siyuan.layout.layout.children[0].children[1] as Layout; window.siyuan.layout.leftDock = new Dock({position: "Left", data: json.left, app}); @@ -472,21 +442,8 @@ export const JSONToLayout = (app: App, isStart: boolean) => { }); } app.plugins.forEach(item => { - try { - item.onLayoutReady(); - } catch (e) { - console.error(`plugin ${item.name} onLayoutReady error:`, e); - } - - item.topBarIcons.forEach(element=> { - if (isMobile()) { - document.querySelector("#menuAbout").after(element); - } else if (!isWindow()) { - document.querySelector("#" + (element.getAttribute("data-position") === "right" ? "barSearch" : "drag")).before(element); - } - }); + afterLoadPlugin(item); }); - // 等待 tab、dock 完成后再 init Tab model,dock }, Constants.TIMEOUT_LOAD); }; diff --git a/app/src/plugin/index.ts b/app/src/plugin/index.ts index 1e6b23ea1..367f8490e 100644 --- a/app/src/plugin/index.ts +++ b/app/src/plugin/index.ts @@ -72,7 +72,7 @@ export class Plugin { iconElement.setAttribute("data-menu", "true"); iconElement.innerHTML = options.icon.startsWith("icon") ? `` : options.icon; iconElement.addEventListener("click", options.callback); - iconElement.setAttribute("data-position", options.position ); + iconElement.setAttribute("data-position", options.position); } this.topBarIcons.push(iconElement); return iconElement; diff --git a/app/src/plugin/loader.ts b/app/src/plugin/loader.ts index fd314b03a..830ef60d2 100644 --- a/app/src/plugin/loader.ts +++ b/app/src/plugin/loader.ts @@ -5,6 +5,7 @@ import {Plugin} from "./index"; import {exportLayout} from "../layout/util"; /// #endif import {API} from "./API"; +import {isMobile, isWindow} from "../util/functions"; const getObject = (key: string) => { const api = { @@ -64,6 +65,61 @@ const loadPluginJS = (app: App, item: IPluginData) => { export const loadPlugin = (app: App, item: IPluginData) => { const plugin = loadPluginJS(app, item); + const styleElement = document.createElement("style"); + styleElement.textContent = item.css; + document.head.append(styleElement); + afterLoadPlugin(plugin); + /// #if !MOBILE + exportLayout({ + reload: false, + onlyData: false, + errorExit: false + }); + /// #endif +}; + + +const updateDock = (dockItem: IDockTab[], index: number, plugin: Plugin, type: string) => { + const dockKeys = Object.keys(plugin.docks) + dockItem.forEach((tabItem: IDockTab, tabIndex: number) => { + if (dockKeys.includes(tabItem.type)) { + if (type === "Left") { + plugin.docks[tabItem.type].config.position = index === 0 ? "LeftTop" : "LeftBottom"; + } else if (type === "Right") { + plugin.docks[tabItem.type].config.position = index === 0 ? "RightTop" : "RightBottom"; + } else if (type === "Bottom") { + plugin.docks[tabItem.type].config.position = index === 0 ? "BottomLeft" : "BottomRight"; + } + plugin.docks[tabItem.type].config.index = tabIndex; + plugin.docks[tabItem.type].config.size = tabItem.size; + } + }) +} + +export const afterLoadPlugin = (plugin: Plugin) => { + try { + plugin.onLayoutReady(); + } catch (e) { + console.error(`plugin ${plugin.name} onLayoutReady error:`, e); + } + + plugin.topBarIcons.forEach(element => { + if (isMobile()) { + document.querySelector("#menuAbout").after(element); + } else if (!isWindow()) { + document.querySelector("#" + (element.getAttribute("data-position") === "right" ? "barSearch" : "drag")).before(element); + } + }); + + window.siyuan.config.uiLayout.left.data.forEach((dockItem: IDockTab[], index: number) => { + updateDock(dockItem, index, plugin, "Left") + }) + window.siyuan.config.uiLayout.right.data.forEach((dockItem: IDockTab[], index: number) => { + updateDock(dockItem, index, plugin, "Right") + }) + window.siyuan.config.uiLayout.bottom.data.forEach((dockItem: IDockTab[], index: number) => { + updateDock(dockItem, index, plugin, "Bottom") + }) Object.keys(plugin.docks).forEach(key => { const dock = plugin.docks[key]; if (dock.config.position.startsWith("Left")) { @@ -74,7 +130,7 @@ export const loadPlugin = (app: App, item: IPluginData) => { icon: dock.config.icon, title: dock.config.title, hotkey: dock.config.hotkey - }], dock.config.position === "LeftBottom" ? 1 : 0, true); + }], dock.config.position === "LeftBottom" ? 1 : 0, dock.config.index); } else if (dock.config.position.startsWith("Bottom")) { window.siyuan.layout.bottomDock.genButton([{ type: key, @@ -83,7 +139,7 @@ export const loadPlugin = (app: App, item: IPluginData) => { icon: dock.config.icon, title: dock.config.title, hotkey: dock.config.hotkey - }], dock.config.position === "BottomRight" ? 1 : 0, true); + }], dock.config.position === "BottomRight" ? 1 : 0, dock.config.index); } else if (dock.config.position.startsWith("Right")) { window.siyuan.layout.rightDock.genButton([{ type: key, @@ -92,17 +148,8 @@ export const loadPlugin = (app: App, item: IPluginData) => { icon: dock.config.icon, title: dock.config.title, hotkey: dock.config.hotkey - }], dock.config.position === "RightBottom" ? 1 : 0, true); + }], dock.config.position === "RightBottom" ? 1 : 0, dock.config.index); } }); - const styleElement = document.createElement("style"); - styleElement.textContent = item.css; - document.head.append(styleElement); - /// #if !MOBILE - exportLayout({ - reload: false, - onlyData: false, - errorExit: false - }); - /// #endif -}; + // 等待 tab 完成后再 init Tab model +}