diff --git a/app/src/assets/scss/_layout.scss b/app/src/assets/scss/_layout.scss index 6c8e354ec..5b7c83d6a 100644 --- a/app/src/assets/scss/_layout.scss +++ b/app/src/assets/scss/_layout.scss @@ -106,6 +106,10 @@ } } + &-bars--drag > .layout-tab-bar { + background-color: var(--b3-theme-primary-lightest); + } + &-bar { list-style: none; align-items: center; @@ -117,10 +121,6 @@ display: none; } - &--drag { - background-color: var(--b3-theme-primary-lightest); - } - &--readonly { flex-shrink: 0; min-width: 71px; diff --git a/app/src/layout/Wnd.ts b/app/src/layout/Wnd.ts index 9a2d7a852..e4f8fc4ed 100644 --- a/app/src/layout/Wnd.ts +++ b/app/src/layout/Wnd.ts @@ -63,6 +63,10 @@ export class Wnd {
${dragHTML}
`; this.headersElement = this.element.querySelector(".layout-tab-bar"); + const dragElement = this.element.querySelector(".layout-tab-container__drag") as HTMLElement; + if (!dragElement) { + return; + } this.headersElement.addEventListener("mousedown", (event) => { // 点击鼠标滚轮关闭 if (event.button !== 1) { @@ -84,6 +88,7 @@ export class Wnd { this.headersElement.addEventListener("mousewheel", (event: WheelEvent) => { this.headersElement.scrollLeft = this.headersElement.scrollLeft + event.deltaY; }, {passive: true}); + this.headersElement.parentElement.addEventListener("click", (event) => { let target = event.target as HTMLElement; while (target && !target.isEqualNode(this.headersElement)) { @@ -122,28 +127,11 @@ export class Wnd { target = target.parentElement; } }); - const dragElement = this.element.querySelector(".layout-tab-container__drag") as HTMLElement; - if (!dragElement) { - return; - } - this.element.addEventListener("dragenter", (event: DragEvent & { target: HTMLElement }) => { - if (event.dataTransfer.types.includes(Constants.SIYUAN_DROP_TAB)) { - const tabHeadersElement = hasClosestByClassName(event.target, "layout-tab-bar"); - if (tabHeadersElement) { - return; - } - const tabPanelsElement = hasClosestByClassName(event.target, "layout-tab-container", true); - if (tabPanelsElement) { - dragElement.classList.remove("fn__none"); - dragElement.setAttribute("style", "height:100%;width:100%;right:auto;bottom:auto"); - } - } - }); - this.headersElement.addEventListener("dragover", function (event: DragEvent & { target: HTMLElement }) { + this.headersElement.parentElement.addEventListener("dragover", function (event: DragEvent & { target: HTMLElement }) { const it = this as HTMLElement; if (event.dataTransfer.types.includes(Constants.SIYUAN_DROP_FILE)) { event.preventDefault(); - it.style.opacity = ".1"; + it.classList.add("layout-tab-bars--drag"); return; } // 不能使用 !window.siyuan.dragElement,因为移动页签到新窗口后,再把主窗口页签拖拽新窗口页签上时,该值为空 @@ -151,35 +139,35 @@ export class Wnd { return; } event.preventDefault(); - const newTabHeaderElement = hasClosestByTag(event.target, "LI"); let oldTabHeaderElement = window.siyuan.dragElement; let exitDrag = false; - Array.from(it.childNodes).find((item: HTMLElement) => { + Array.from(it.firstElementChild.childNodes).find((item: HTMLElement) => { if (item.style.opacity === "0.1") { oldTabHeaderElement = item; exitDrag = true; return true; } }); - if (!newTabHeaderElement && oldTabHeaderElement && !oldTabHeaderElement.classList.contains("item--pin")) { - it.classList.add("layout-tab-bar--drag"); - } if (!exitDrag && oldTabHeaderElement) { if (oldTabHeaderElement.classList.contains("item--pin")) { return; } oldTabHeaderElement = oldTabHeaderElement.cloneNode(true) as HTMLElement; oldTabHeaderElement.setAttribute("data-clone", "true"); - it.append(oldTabHeaderElement); + it.firstElementChild.append(oldTabHeaderElement); return; } else if (!exitDrag && !oldTabHeaderElement) { // 拖拽到新窗口 oldTabHeaderElement = document.createElement("li"); oldTabHeaderElement.style.opacity = "0.1"; oldTabHeaderElement.innerHTML = ''; oldTabHeaderElement.setAttribute("data-clone", "true"); - it.append(oldTabHeaderElement); + it.firstElementChild.append(oldTabHeaderElement); } + const newTabHeaderElement = hasClosestByAttribute(event.target, "data-type", "tab-header"); if (!newTabHeaderElement) { + if (!oldTabHeaderElement.classList.contains("item--pin")) { + it.classList.add("layout-tab-bars--drag"); + } return; } if (!newTabHeaderElement.isSameNode(oldTabHeaderElement) && @@ -194,7 +182,7 @@ export class Wnd { } }); let dragleaveTimeout: number; - this.headersElement.addEventListener("dragleave", function () { + this.headersElement.parentElement.addEventListener("dragleave", function () { clearTimeout(dragleaveTimeout); // 窗口拖拽到新窗口时,不 drop 无法移除 clone 的元素 dragleaveTimeout = window.setTimeout(() => { @@ -203,14 +191,13 @@ export class Wnd { }); }, 1000); const it = this as HTMLElement; - it.classList.remove("layout-tab-bar--drag"); - it.style.opacity = ""; + it.classList.remove("layout-tab-bars--drag"); }); - this.headersElement.addEventListener("drop", function (event: DragEvent & { target: HTMLElement }) { + this.headersElement.parentElement.addEventListener("drop", function (event: DragEvent & { target: HTMLElement }) { const it = this as HTMLElement; if (event.dataTransfer.types.includes(Constants.SIYUAN_DROP_FILE)) { // 文档树拖拽 - setPanelFocus(it.parentElement.parentElement); + setPanelFocus(it.parentElement); event.dataTransfer.getData(Constants.SIYUAN_DROP_FILE).split(",").forEach(item => { if (item) { openFileById({ @@ -220,14 +207,14 @@ export class Wnd { } }); window.siyuan.dragElement = undefined; - it.style.opacity = ""; + it.classList.remove("layout-tab-bars--drag"); return; } const tabId = event.dataTransfer.getData(Constants.SIYUAN_DROP_TAB); let oldTab = getInstanceById(tabId) as Tab; + const wnd = getInstanceById(it.parentElement.getAttribute("data-id")) as Wnd; /// #if !BROWSER if (!oldTab) { // 从主窗口拖拽到页签新窗口 - const wnd = getInstanceById(this.parentElement.parentElement.getAttribute("data-id")); if (wnd instanceof Wnd) { JSONToCenter(JSON.parse(event.dataTransfer.getData(Constants.SIYUAN_DROP_TABTOWINDOW)), wnd); oldTab = wnd.children[wnd.children.length - 1]; @@ -237,12 +224,12 @@ export class Wnd { } } /// #endif + it.classList.remove("layout-tab-bars--drag"); if (!oldTab) { return; } - it.classList.remove("layout-tab-bar--drag"); - const nextTabHeaderElement = (Array.from(it.childNodes).find((item: HTMLElement) => { + const nextTabHeaderElement = (Array.from(it.firstElementChild.childNodes).find((item: HTMLElement) => { if (item.style.opacity === "0.1") { return true; } @@ -264,8 +251,7 @@ export class Wnd { } } // 对象顺序 - const newWnd = getInstanceById(it.parentElement.parentElement.getAttribute("data-id")) as Wnd; - newWnd.moveTab(oldTab, nextTabHeaderElement ? nextTabHeaderElement.getAttribute("data-id") : undefined); + wnd.moveTab(oldTab, nextTabHeaderElement ? nextTabHeaderElement.getAttribute("data-id") : undefined); resizeTabs(); return; } @@ -288,6 +274,21 @@ export class Wnd { oldTab.parent.children.push(tempTab); } }); + + this.element.addEventListener("dragenter", (event: DragEvent & { target: HTMLElement }) => { + if (event.dataTransfer.types.includes(Constants.SIYUAN_DROP_TAB)) { + const tabHeadersElement = hasClosestByClassName(event.target, "layout-tab-bar"); + if (tabHeadersElement) { + return; + } + const tabPanelsElement = hasClosestByClassName(event.target, "layout-tab-container", true); + if (tabPanelsElement) { + dragElement.classList.remove("fn__none"); + dragElement.setAttribute("style", "height:100%;width:100%;right:auto;bottom:auto"); + } + } + }); + dragElement.addEventListener("dragover", (event: DragEvent & { layerX: number, layerY: number }) => { event.preventDefault(); if (!dragElement.nextElementSibling) {