This commit is contained in:
Vanessa 2023-04-09 19:46:12 +08:00
parent 2cce3c3e12
commit ba4bedf3bc
3 changed files with 58 additions and 8 deletions

View File

@ -12,7 +12,7 @@ import {Tab} from "./Tab";
import {Model} from "./Model"; import {Model} from "./Model";
import {Editor} from "../editor"; import {Editor} from "../editor";
import {Graph} from "./dock/Graph"; import {Graph} from "./dock/Graph";
import {hasClosestByAttribute, hasClosestByClassName} from "../protyle/util/hasClosest"; import {hasClosestBlock, hasClosestByAttribute, hasClosestByClassName} from "../protyle/util/hasClosest";
import {Constants} from "../constants"; import {Constants} from "../constants";
/// #if !BROWSER /// #if !BROWSER
import {webFrame, ipcRenderer} from "electron"; import {webFrame, ipcRenderer} from "electron";
@ -32,6 +32,7 @@ import {MenuItem} from "../menus/Menu";
import {escapeHtml} from "../util/escape"; import {escapeHtml} from "../util/escape";
import {isWindow} from "../util/functions"; import {isWindow} from "../util/functions";
import {hideAllElements} from "../protyle/ui/hideElements"; import {hideAllElements} from "../protyle/ui/hideElements";
import {focusByOffset, getSelectionOffset, getSelectionPosition} from "../protyle/util/selection";
export class Wnd { export class Wnd {
public id: string; public id: string;
@ -369,6 +370,7 @@ export class Wnd {
switchWnd(newWnd, targetWnd); switchWnd(newWnd, targetWnd);
} }
} }
resizeTabs();
/// #if !BROWSER /// #if !BROWSER
setTabPosition(); setTabPosition();
/// #endif /// #endif
@ -754,10 +756,29 @@ export class Wnd {
} }
public moveTab(tab: Tab, nextId?: string) { public moveTab(tab: Tab, nextId?: string) {
let rangeData: {
id: string,
start: number,
end: number
}
if (tab.model instanceof Editor && tab.model.editor.protyle.toolbar.range) {
const blockElement = hasClosestBlock(tab.model.editor.protyle.toolbar.range.startContainer);
if (blockElement) {
const startEnd = getSelectionOffset(blockElement, undefined, tab.model.editor.protyle.toolbar.range);
rangeData = {
id: blockElement.getAttribute("data-node-id"),
start: startEnd.start,
end: startEnd.end
}
}
}
this.element.querySelector(".layout-tab-container").append(tab.panelElement); this.element.querySelector(".layout-tab-container").append(tab.panelElement);
if (tab.model instanceof Editor) { if (rangeData && tab.model instanceof Editor) {
// DOM 移动后 range 会变化,因此置空 // DOM 移动后 range 会变化
tab.model.editor.protyle.toolbar.range = null; const range = focusByOffset(tab.model.editor.protyle.wysiwyg.element.querySelector(`[data-node-id="${rangeData.id}"]`), rangeData.start, rangeData.end);
if (range) {
tab.model.editor.protyle.toolbar.range = range;
}
} }
if (nextId) { if (nextId) {
// 只能用 find https://github.com/siyuan-note/siyuan/issues/3455 // 只能用 find https://github.com/siyuan-note/siyuan/issues/3455
@ -802,7 +823,6 @@ export class Wnd {
} }
} }
tab.parent = this; tab.parent = this;
resizeTabs();
hideAllElements(["toolbar"]); hideAllElements(["toolbar"]);
} }

View File

@ -16,7 +16,7 @@ import {getAllModels, getAllTabs} from "./getAll";
import {Asset} from "../asset"; import {Asset} from "../asset";
import {Search} from "../search"; import {Search} from "../search";
import {Dock} from "./dock"; import {Dock} from "./dock";
import {focusByRange} from "../protyle/util/selection"; import {focusByOffset, focusByRange, getSelectionOffset} from "../protyle/util/selection";
import {hideAllElements, hideElements} from "../protyle/ui/hideElements"; import {hideAllElements, hideElements} from "../protyle/ui/hideElements";
import {fetchPost} from "../util/fetch"; import {fetchPost} from "../util/fetch";
import {hasClosestBlock, hasClosestByClassName} from "../protyle/util/hasClosest"; import {hasClosestBlock, hasClosestByClassName} from "../protyle/util/hasClosest";
@ -79,7 +79,35 @@ export const getDockByType = (type: TDockType) => {
}; };
export const switchWnd = (newWnd: Wnd, targetWnd: Wnd) => { export const switchWnd = (newWnd: Wnd, targetWnd: Wnd) => {
// DOM 移动后 range 会变化
const rangeDatas: {
id: string,
start: number,
end: number
}[] = [];
targetWnd.children.forEach((item) => {
if (item.model instanceof Editor && item.model.editor.protyle.toolbar.range) {
const blockElement = hasClosestBlock(item.model.editor.protyle.toolbar.range.startContainer);
if (blockElement) {
const startEnd = getSelectionOffset(blockElement, undefined, item.model.editor.protyle.toolbar.range);
rangeDatas.push({
id: blockElement.getAttribute("data-node-id"),
start: startEnd.start,
end: startEnd.end
})
}
}
})
newWnd.element.after(targetWnd.element); newWnd.element.after(targetWnd.element);
targetWnd.children.forEach((item) => {
if (item.model instanceof Editor) {
const rangeData = rangeDatas.splice(0, 1)[0];
const range = focusByOffset(item.model.editor.protyle.wysiwyg.element.querySelector(`[data-node-id="${rangeData.id}"]`), rangeData.start, rangeData.end);
if (range) {
item.model.editor.protyle.toolbar.range = range;
}
}
})
// 分割线 // 分割线
newWnd.element.after(newWnd.element.previousElementSibling); newWnd.element.after(newWnd.element.previousElementSibling);
newWnd.parent.children.find((item, index) => { newWnd.parent.children.find((item, index) => {
@ -160,7 +188,7 @@ export const exportLayout = (reload: boolean, cb?: () => void, onlyData = false,
} else if (cb) { } else if (cb) {
cb(); cb();
} }
return ; return;
} }
const useElement = document.querySelector("#barDock use"); const useElement = document.querySelector("#barDock use");
if (!useElement) { if (!useElement) {

View File

@ -1,7 +1,7 @@
import {Tab} from "../layout/Tab"; import {Tab} from "../layout/Tab";
import {MenuItem} from "./Menu"; import {MenuItem} from "./Menu";
import {Editor} from "../editor"; import {Editor} from "../editor";
import {copyTab} from "../layout/util"; import {copyTab, resizeTabs} from "../layout/util";
/// #if !BROWSER /// #if !BROWSER
import {openNewWindow} from "../window/openNewWindow"; import {openNewWindow} from "../window/openNewWindow";
/// #endif /// #endif
@ -132,6 +132,7 @@ const splitSubMenu = (tab: Tab) => {
newWnd.headersElement.append(tab.headElement); newWnd.headersElement.append(tab.headElement);
newWnd.headersElement.parentElement.classList.remove("fn__none"); newWnd.headersElement.parentElement.classList.remove("fn__none");
newWnd.moveTab(tab); newWnd.moveTab(tab);
resizeTabs();
} }
}); });
} }
@ -152,6 +153,7 @@ const splitSubMenu = (tab: Tab) => {
newWnd.headersElement.append(tab.headElement); newWnd.headersElement.append(tab.headElement);
newWnd.headersElement.parentElement.classList.remove("fn__none"); newWnd.headersElement.parentElement.classList.remove("fn__none");
newWnd.moveTab(tab); newWnd.moveTab(tab);
resizeTabs();
} }
}); });
} }