Vanessa 2023-01-26 18:53:57 +08:00
parent 9e52b489a7
commit d333088288
10 changed files with 109 additions and 38 deletions

View file

@ -884,6 +884,10 @@ app.on('open-url', (event, url) => { // for macOS
}
})
app.on('browser-window-created', (_, window) => {
require("@electron/remote/main").enable(window.webContents)
})
app.on('second-instance', (event, argv) => {
writeLog('second-instance [' + argv + ']')
let workspace = argv.find((arg) => arg.startsWith('--workspace='))

View file

@ -277,6 +277,6 @@ export const appearance = {
}
}
loadAssets(data);
document.querySelector("#barMode use").setAttribute("xlink:href", `#icon${window.siyuan.config.appearance.modeOS ? "Mode" : (window.siyuan.config.appearance.mode === 0 ? "Light" : "Dark")}`);
document.querySelector("#barMode use")?.setAttribute("xlink:href", `#icon${window.siyuan.config.appearance.modeOS ? "Mode" : (window.siyuan.config.appearance.mode === 0 ? "Light" : "Dark")}`);
}
};

View file

@ -29,6 +29,8 @@ import {Asset} from "../asset";
import {newFile} from "../util/newFile";
import {MenuItem} from "../menus/Menu";
import {escapeHtml} from "../util/escape";
import {isWindow} from "../util/functions";
import {setTabPosition} from "../window/setHeader";
export class Wnd {
public id: string;
@ -319,6 +321,7 @@ export class Wnd {
switchWnd(newWnd, targetWnd);
}
}
setTabPosition();
return;
}
@ -370,7 +373,7 @@ export class Wnd {
}
}
});
if (currentTab) {
if (currentTab && currentTab.headElement) {
const initData = currentTab.headElement.getAttribute("data-initdata");
if (initData) {
const json = JSON.parse(initData);
@ -495,6 +498,8 @@ export class Wnd {
} else if (this.children.length > window.siyuan.config.fileTree.maxOpenTabCount) {
this.removeOverCounter(oldFocusIndex);
}
setTabPosition();
}
private renderTabList(event: MouseEvent) {
@ -652,6 +657,12 @@ export class Wnd {
if (window.siyuan.layout.centerLayout) {
const wnd = getWndByLayout(window.siyuan.layout.centerLayout);
if (!wnd) {
/// #if !BROWSER
if (isWindow()) {
getCurrentWindow().destroy();
return;
}
/// #endif
const wnd = new Wnd();
window.siyuan.layout.centerLayout.addWnd(wnd);
wnd.addTab(newCenterEmptyTab());

View file

@ -12,21 +12,25 @@ import {getCurrentWindow} from "@electron/remote";
import {MenuItem} from "../menus/Menu";
import {Constants} from "../constants";
export const initStatus = () => {
export const initStatus = (isWindow = false) => {
/// #if !MOBILE
const allDocks = getAllDocks();
let menuHTML = "";
allDocks.forEach(item => {
menuHTML += `<button class="b3-menu__item" data-type="${item.type}"><svg class="b3-menu__icon""><use xlink:href="#${item.icon}"></use></svg><span class="b3-menu__label">${window.siyuan.languages[item.hotkeyLangId]}</span><span class="b3-menu__accelerator">${updateHotkeyTip(window.siyuan.config.keymap.general[item.hotkeyLangId].custom)}</span></button>`;
});
document.getElementById("status").innerHTML = `<div id="barDock" class="toolbar__item b3-tooltips b3-tooltips__e${window.siyuan.config.readonly ? " fn__none" : ""}" aria-label="${window.siyuan.config.uiLayout.hideDock ? window.siyuan.languages.showDock : window.siyuan.languages.hideDock}">
let barDockHTML = "";
if (!isWindow) {
barDockHTML = `<div id="barDock" class="toolbar__item b3-tooltips b3-tooltips__e${window.siyuan.config.readonly || isWindow ? " fn__none" : ""}" aria-label="${window.siyuan.config.uiLayout.hideDock ? window.siyuan.languages.showDock : window.siyuan.languages.hideDock}">
<svg>
<use xlink:href="#${window.siyuan.config.uiLayout.hideDock ? "iconDock" : "iconHideDock"}"></use>
</svg>
<div class="b3-menu fn__none" style="bottom: 32px;left: 5px">
${menuHTML}
</div>
</div>
</div>`
}
document.getElementById("status").innerHTML = `${barDockHTML}
<div class="status__msg"></div>
<div class="fn__flex-1"></div>
<div class="status__backgroundtask fn__none"></div>
@ -34,13 +38,16 @@ export const initStatus = () => {
<div id="statusHelp" class="toolbar__item b3-tooltips b3-tooltips__w" aria-label="${window.siyuan.languages.help}">
<svg><use xlink:href="#iconHelp"></use></svg>
</div>`;
const dockElement = document.getElementById("barDock");
dockElement.addEventListener("mousemove", () => {
dockElement.querySelector(".b3-menu").classList.remove("fn__none");
});
dockElement.addEventListener("mouseleave", () => {
dockElement.querySelector(".b3-menu").classList.add("fn__none");
});
if (!isWindow) {
const dockElement = document.getElementById("barDock");
dockElement.addEventListener("mousemove", () => {
dockElement.querySelector(".b3-menu").classList.remove("fn__none");
});
dockElement.addEventListener("mouseleave", () => {
dockElement.querySelector(".b3-menu").classList.add("fn__none");
});
}
document.querySelector("#status").addEventListener("click", (event) => {
let target = event.target as HTMLElement;
while (target.id !== "status") {

View file

@ -27,7 +27,8 @@ import {saveScroll} from "../protyle/scroll/saveScroll";
import {pdfResize} from "../asset/renderAssets";
import {Backlink} from "./dock/Backlink";
import {openFileById} from "../editor/util";
import {getSearch} from "../util/functions";
import {getSearch, isWindow} from "../util/functions";
import {setTabPosition} from "../window/setHeader";
export const setPanelFocus = (element: Element) => {
if (element.classList.contains("layout__tab--active") || element.classList.contains("layout__wnd--active")) {
@ -175,11 +176,17 @@ const JSONToDock = (json: any) => {
window.siyuan.layout.bottomDock = new Dock({position: "Bottom", data: json.bottom});
};
const JSONToCenter = (json: any, layout?: Layout | Wnd | Tab | Model) => {
export const JSONToCenter = (json: any, layout?: Layout | Wnd | Tab | Model) => {
let child: Layout | Wnd | Tab | Model;
if (json.instance === "Layout") {
if (!layout) {
window.siyuan.layout.layout = new Layout({element: document.getElementById("layouts")});
window.siyuan.layout.layout = new Layout({
element: document.getElementById("layouts"),
direction: json.direction,
size: json.size,
type: json.type,
resize: json.resize
});
} else {
child = new Layout({
direction: json.direction,
@ -635,10 +642,10 @@ export const addResize = (obj: Layout | Wnd) => {
if (previousNowSize < 8 || nextNowSize < 8) {
return;
}
if (window.siyuan.layout.leftDock.layout.element.contains(previousElement) && previousNowSize < 188) {
if (window.siyuan.layout.leftDock?.layout.element.contains(previousElement) && previousNowSize < 188) {
return;
}
if (window.siyuan.layout.rightDock.layout.element.contains(nextElement) && nextNowSize < 188) {
if (window.siyuan.layout.rightDock?.layout.element.contains(nextElement) && nextNowSize < 188) {
return;
}
previousElement.style[direction === "lr" ? "width" : "height"] = previousNowSize + "px";
@ -666,10 +673,12 @@ export const addResize = (obj: Layout | Wnd) => {
nextElement.classList.add("fn__flex-1");
}
resizeTabs();
window.siyuan.layout.leftDock.setSize();
window.siyuan.layout.topDock.setSize();
window.siyuan.layout.bottomDock.setSize();
window.siyuan.layout.rightDock.setSize();
if (!isWindow()) {
window.siyuan.layout.leftDock.setSize();
window.siyuan.layout.topDock.setSize();
window.siyuan.layout.bottomDock.setSize();
window.siyuan.layout.rightDock.setSize();
}
if (range) {
focusByRange(range);
}

View file

@ -2,7 +2,12 @@ import {Tab} from "../layout/Tab";
import {MenuItem} from "./Menu";
import {Editor} from "../editor";
import {copyTab} from "../layout/util";
/// #if !BROWSER
import {BrowserWindow} from "@electron/remote";
import * as path from "path";
/// #endif
import {copySubMenu} from "./commonMenuItem";
import {Constants} from "../constants";
const closeMenu = (tab: Tab) => {
const allTabs: Tab[] = [];
@ -163,7 +168,7 @@ export const initTabMenu = (tab: Tab) => {
submenu: splitSubMenu(tab)
}).element);
const model = tab.model;
let rootId;
let rootId:string;
if ((model && model instanceof Editor)) {
rootId = model.editor.protyle.block.rootID;
} else {
@ -198,5 +203,27 @@ export const initTabMenu = (tab: Tab) => {
}
}).element);
}
/// #if !BROWSER
window.siyuan.menus.menu.append(new MenuItem({
label: "new window",
click: () => {
const win = new BrowserWindow({
show: true,
width: 1032,
height: 650,
frame: "darwin" === window.siyuan.config.system.os,
icon: path.join(window.siyuan.config.system.appDir, "stage", "icon-large.png"),
titleBarStyle: "hidden",
webPreferences: {
contextIsolation: false,
nodeIntegration: true,
webviewTag: true,
webSecurity: false,
},
});
win.loadURL(`${window.location.protocol}//${window.location.host}/stage/build/app/window.html?v=${Constants.SIYUAN_VERSION}&id=${rootId}`)
}
}).element);
/// #endif
return window.siyuan.menus.menu;
};

View file

@ -192,7 +192,7 @@ export const goBack = async () => {
}
return;
}
document.querySelector("#barForward").classList.remove("toolbar__item--disabled");
document.querySelector("#barForward")?.classList.remove("toolbar__item--disabled");
if (!previousIsBack) {
forwardStack.push(window.siyuan.backStack.pop());
}
@ -208,7 +208,7 @@ export const goBack = async () => {
}
previousIsBack = true;
if (window.siyuan.backStack.length === 0) {
document.querySelector("#barBack").classList.add("toolbar__item--disabled");
document.querySelector("#barBack")?.classList.add("toolbar__item--disabled");
}
};
@ -219,7 +219,7 @@ export const goForward = async () => {
}
return;
}
document.querySelector("#barBack").classList.remove("toolbar__item--disabled");
document.querySelector("#barBack")?.classList.remove("toolbar__item--disabled");
if (previousIsBack) {
window.siyuan.backStack.push(forwardStack.pop());
}
@ -236,7 +236,7 @@ export const goForward = async () => {
}
previousIsBack = false;
if (forwardStack.length === 0) {
document.querySelector("#barForward").classList.add("toolbar__item--disabled");
document.querySelector("#barForward")?.classList.add("toolbar__item--disabled");
}
};
@ -269,7 +269,7 @@ export const pushBack = (protyle: IProtyle, range?: Range, blockElement?: Elemen
window.siyuan.backStack.push(forwardStack.pop());
}
forwardStack = [];
document.querySelector("#barForward").classList.add("toolbar__item--disabled");
document.querySelector("#barForward")?.classList.add("toolbar__item--disabled");
}
window.siyuan.backStack.push({
position,
@ -283,7 +283,7 @@ export const pushBack = (protyle: IProtyle, range?: Range, blockElement?: Elemen
previousIsBack = false;
}
if (window.siyuan.backStack.length > 1) {
document.querySelector("#barBack").classList.remove("toolbar__item--disabled");
document.querySelector("#barBack")?.classList.remove("toolbar__item--disabled");
}
}
};

View file

@ -1,5 +1,9 @@
export const isMobile = () => {
return !document.getElementById("dockBottom");
return document.getElementById("sidebar") ? true : false;
};
export const isWindow = () => {
return document.getElementById("toolbar") ? false : true;
};
export const isTouchDevice = () => {

View file

@ -118,8 +118,9 @@ export const onGetConfig = (isStart: boolean) => {
const hasKeymap4 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.heading, "editor", "heading");
const hasKeymap5 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.list, "editor", "list");
const hasKeymap6 = hasKeymap(Constants.SIYUAN_KEYMAP.editor.table, "editor", "table");
if (!window.siyuan.config.readonly && (!matchKeymap1 || !matchKeymap2 || !matchKeymap3 || !matchKeymap4 || !matchKeymap5 || !matchKeymap6) &&
(!hasKeymap1 || !hasKeymap2 || !hasKeymap3 || !hasKeymap4 || !hasKeymap5 || !hasKeymap6)) {
if (!window.siyuan.config.readonly &&
(!matchKeymap1 || !matchKeymap2 || !matchKeymap3 || !matchKeymap4 || !matchKeymap5 || !matchKeymap6 ||
!hasKeymap1 || !hasKeymap2 || !hasKeymap3 || !hasKeymap4 || !hasKeymap5 || !hasKeymap6)) {
fetchPost("/api/setting/setKeymap", {
data: window.siyuan.config.keymap
}, () => {
@ -179,7 +180,7 @@ export const onGetConfig = (isStart: boolean) => {
addGA();
};
const initBar = () => {
export const initBar = () => {
const toolbar = document.getElementById("toolbar");
toolbar.innerHTML = `
<div id="barWorkspace" class="toolbar__item">
@ -325,7 +326,7 @@ const winOnClose = (currentWindow: Electron.BrowserWindow, close = false) => {
/// #endif
};
const initWindow = () => {
export const initWindow = () => {
/// #if !BROWSER
const currentWindow = getCurrentWindow();
currentWindow.on("focus", winOnFocus);
@ -451,8 +452,8 @@ const initWindow = () => {
window.addEventListener("beforeunload", () => {
currentWindow.off("focus", winOnFocus);
}, false);
if ("windows" !== window.siyuan.config.system.os && "linux" !== window.siyuan.config.system.os) {
document.getElementById("drag").addEventListener("dblclick", () => {
if ( "darwin" === window.siyuan.config.system.os) {
document.getElementById("drag")?.addEventListener("dblclick", () => {
if (currentWindow.isMaximized()) {
currentWindow.unmaximize();
} else {
@ -474,7 +475,7 @@ const initWindow = () => {
}
document.body.classList.add("body--win32");
//添加应用图标
// 添加应用图标
const toolbar = document.getElementById("toolbar");
toolbar.insertAdjacentHTML("afterbegin", `<div class="toolbar__item" id="windowAppIcon">
<svg>
@ -482,7 +483,7 @@ const initWindow = () => {
</svg>
</div>`);
//添加窗口控件
// 添加窗口控件
const controlsElement = document.getElementById("windowControls");
controlsElement.innerHTML = `<div class="toolbar__item b3-tooltips b3-tooltips__sw" aria-label="${window.siyuan.languages.min}" id="minWindow">
<svg>

View file

@ -19,6 +19,7 @@ module.exports = (env, argv) => {
},
entry: {
'main': './src/index.ts',
'window': './src/window.ts',
},
resolve: {
extensions: ['.ts', '.js', '.tpl', '.scss', '.png', '.svg'],
@ -41,7 +42,8 @@ module.exports = (env, argv) => {
{
test: /\.tpl/,
include: [
path.resolve(__dirname, 'src/assets/template/app/index.tpl')],
path.resolve(__dirname, 'src/assets/template/app/index.tpl'),
path.resolve(__dirname, 'src/assets/template/app/window.tpl')],
loader: 'html-loader',
options: {
sources: false,
@ -117,6 +119,12 @@ module.exports = (env, argv) => {
filename: 'index.html',
template: 'src/assets/template/app/index.tpl',
}),
new HtmlWebpackPlugin({
inject: 'head',
chunks: ['window'],
filename: 'window.html',
template: 'src/assets/template/app/window.tpl',
}),
],
}
}