From 73dc9e79c257172d869bfbb115da3c8d2684c874 Mon Sep 17 00:00:00 2001 From: brahim <92426196+BrhmDev@users.noreply.github.com> Date: Sat, 14 Sep 2024 15:33:23 +0200 Subject: [PATCH] Resize views in split view (only works in vertical, still has problems) --- src/ZenViewSplitter.mjs | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/ZenViewSplitter.mjs b/src/ZenViewSplitter.mjs index 1bac78d..0703d78 100644 --- a/src/ZenViewSplitter.mjs +++ b/src/ZenViewSplitter.mjs @@ -270,6 +270,7 @@ var gZenViewSplitter = new (class { } this.activateSplitView(splitData, tab); + if (!splitData.sizes) this.applySplitters(splitData); } /** @@ -322,6 +323,27 @@ var gZenViewSplitter = new (class { }); } + applySplitters(splitData) { + const tabs = splitData.tabs; + for (let i = 0; i < tabs.length; i++) { + const tab = tabs[0]; + const container = tab.linkedBrowser.closest('.browserSidebarContainer'); + + if (splitData.gridType === 'vsep' && i != tabs.length - 1) { + let splitter = document.createXULElement('div'); + splitter.className = 'zen-split-view-splitter'; + splitter.setAttribute('orient', 'vertical'); + splitter.addEventListener('mousedown', this.handleSplitterMouseDown); + container.insertAdjacentElement("beforeend", splitter); + } + } + + if (splitData.gridType === 'vsep') { + const w = 100 / tabs.length; + splitData.sizes = tabs.map(t => ({width: w})); + } + } + /** * Calculates the grid areas for the tabs. * @@ -401,6 +423,32 @@ var gZenViewSplitter = new (class { } }; + handleSplitterMouseDown = (event) => { + const container = event.target.parentElement; + const tab = window.gBrowser.tabs.find((t) => t.linkedBrowser.closest('.browserSidebarContainer') === container); + const currentView = this._data[this.currentView]; + + const tabIdx = currentView.tabs.findIndex(t => t === tab); + let dragFunc; + let prevX = event.clientX; + dragFunc = (dEvent) => { + requestAnimationFrame(() => { + const movementX = dEvent.clientX - prevX; + const percentageChange = (movementX / this._tabBrowserPanel.getBoundingClientRect().width) * 100; + currentView.sizes[tabIdx].width += percentageChange; + currentView.sizes[tabIdx + 1].width -= percentageChange; + this._tabBrowserPanel.style['grid-template-columns'] = currentView.tabs.map((t, i) => `${currentView.sizes[i].width}%`).join(' '); + prevX = dEvent.clientX; + }); + } + const stopListeners = () => { + removeEventListener('mousemove', dragFunc); + removeEventListener('mouseup', stopListeners); + } + addEventListener('mousemove', dragFunc); + addEventListener('mouseup', stopListeners); + } + /** * Sets the docshell state for the tabs. *