Enhance tab selection handling and improve drag-and-drop functionality in ZenViewSplitter

This commit is contained in:
mr. M
2025-03-03 00:11:31 +01:00
parent 7ca57da6fe
commit 8aaccf06b2
2 changed files with 36 additions and 6 deletions

View File

@@ -69,6 +69,8 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
_edgeHoverSize; _edgeHoverSize;
minResizeWidth; minResizeWidth;
_lastOpenedTab = null;
MAX_TABS = 4; MAX_TABS = 4;
init() { init() {
@@ -81,6 +83,7 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
ChromeUtils.defineLazyGetter(this, 'dropZone', () => document.getElementById('zen-splitview-dropzone')); ChromeUtils.defineLazyGetter(this, 'dropZone', () => document.getElementById('zen-splitview-dropzone'));
window.addEventListener('TabClose', this.handleTabClose.bind(this)); window.addEventListener('TabClose', this.handleTabClose.bind(this));
window.addEventListener('TabSelect', this.onTabSelect.bind(this));
this.initializeContextMenu(); this.initializeContextMenu();
this.insertPageActionButton(); this.insertPageActionButton();
this.insertIntoContextMenu(); this.insertIntoContextMenu();
@@ -107,6 +110,9 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
*/ */
handleTabClose(event) { handleTabClose(event) {
const tab = event.target; const tab = event.target;
if (tab === this._lastOpenedTab) {
this._lastOpenedTab = null;
}
const groupIndex = this._data.findIndex((group) => group.tabs.includes(tab)); const groupIndex = this._data.findIndex((group) => group.tabs.includes(tab));
if (groupIndex < 0) { if (groupIndex < 0) {
return; return;
@@ -114,6 +120,18 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
this.removeTabFromGroup(tab, groupIndex, event.forUnsplit); this.removeTabFromGroup(tab, groupIndex, event.forUnsplit);
} }
/**
* @param {Event} event - The event that triggered the tab select.
* @description Handles the tab select event.
* @returns {void}
*/
onTabSelect(event) {
const previousTab = event.detail.previousTab;
if (previousTab) {
this._lastOpenedTab = previousTab;
}
}
/** /**
* Removes a tab from a group. * Removes a tab from a group.
* *
@@ -160,7 +178,7 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
} }
draggedTab.container._finishMoveTogetherSelectedTabs(draggedTab); draggedTab.container._finishMoveTogetherSelectedTabs(draggedTab);
} }
if (!draggedTab || this._canDrop || this._hasAnimated || this.fakeBrowser) { if (!draggedTab || this._canDrop || this._hasAnimated || this.fakeBrowser || !this._lastOpenedTab) {
return; return;
} }
if (draggedTab.splitView) { if (draggedTab.splitView) {
@@ -170,7 +188,11 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
if (currentView?.tabs.length >= this.MAX_TABS) { if (currentView?.tabs.length >= this.MAX_TABS) {
return; return;
} }
const oldTab = this._lastOpenedTab;
this._canDrop = true; this._canDrop = true;
this._draggingTab = draggedTab;
gBrowser.selectedTab = oldTab;
draggedTab._visuallySelected = true;
// wait some time before showing the split view // wait some time before showing the split view
this._showSplitViewTimeout = setTimeout(() => { this._showSplitViewTimeout = setTimeout(() => {
this._hasAnimated = true; this._hasAnimated = true;
@@ -214,11 +236,12 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
} }
const panelsRect = gBrowser.tabbox.getBoundingClientRect(); const panelsRect = gBrowser.tabbox.getBoundingClientRect();
// this event is fired even though we are still in the "allowed" area // this event is fired even though we are still in the "allowed" area
console.log(event.target);
if (event.target !== gBrowser.tabbox && event.target !== this.fakeBrowser) { if (event.target !== gBrowser.tabbox && event.target !== this.fakeBrowser) {
return; return;
} }
this._canDrop = false; this._canDrop = false;
gBrowser.selectedTab = this._draggingTab;
this._draggingTab = null;
if (this._showSplitViewTimeout) { if (this._showSplitViewTimeout) {
clearTimeout(this._showSplitViewTimeout); clearTimeout(this._showSplitViewTimeout);
} }
@@ -824,7 +847,8 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
* @param {string} gridType - The type of grid layout. * @param {string} gridType - The type of grid layout.
*/ */
splitTabs(tabs, gridType, initialIndex = 0) { splitTabs(tabs, gridType, initialIndex = 0) {
tabs = tabs.filter((t) => !t.hidden && !t.hasAttribute('zen-empty-tab')); // TODO: Add support for splitting essential tabs
tabs = tabs.filter((t) => !t.hidden && !t.hasAttribute('zen-empty-tab') && !t.hasAttribute('zen-essential'));
if (tabs.length < 2 || tabs.length > this.MAX_TABS) { if (tabs.length < 2 || tabs.length > this.MAX_TABS) {
return; return;
} }
@@ -1416,6 +1440,8 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
gBrowser.tabbox.removeAttribute('style'); gBrowser.tabbox.removeAttribute('style');
delete this._canDrop; delete this._canDrop;
delete this._hasAnimated; delete this._hasAnimated;
gBrowser.selectedTab = this._draggingTab;
this._draggingTab = null;
} }
} }
@@ -1426,7 +1452,11 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
* @returns {boolean} true if the tab was moved to the split view * @returns {boolean} true if the tab was moved to the split view
*/ */
moveTabToSplitView(event, draggedTab) { moveTabToSplitView(event, draggedTab) {
const canDrop = this._canDrop;
this._mayabeRemoveFakeBrowser(); this._mayabeRemoveFakeBrowser();
if (!canDrop) {
return false;
}
const dropTarget = document.elementFromPoint(event.clientX, event.clientY); const dropTarget = document.elementFromPoint(event.clientX, event.clientY);
const browser = dropTarget?.closest('browser'); const browser = dropTarget?.closest('browser');
@@ -1500,7 +1530,7 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
}, },
{ {
type: 'spring', type: 'spring',
bounce: 0.6, bounce: 0.5,
duration: 0.5, duration: 0.5,
delay: 0.1, delay: 0.1,
} }

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
index fa96568d366fd3608f9bd583fa793150bd815c8b..37644a42ac426c2a48e28056654eb654ffa660e4 100644 index fa96568d366fd3608f9bd583fa793150bd815c8b..2e28e3eba422e176c0536e6a6d0386de9d5b6d33 100644
--- a/browser/components/tabbrowser/content/tabs.js --- a/browser/components/tabbrowser/content/tabs.js
+++ b/browser/components/tabbrowser/content/tabs.js +++ b/browser/components/tabbrowser/content/tabs.js
@@ -94,7 +94,7 @@ @@ -94,7 +94,7 @@
@@ -103,7 +103,7 @@ index fa96568d366fd3608f9bd583fa793150bd815c8b..37644a42ac426c2a48e28056654eb654
- this._finishMoveTogetherSelectedTabs(draggedTab); - this._finishMoveTogetherSelectedTabs(draggedTab);
this._finishAnimateTabMove(); this._finishAnimateTabMove();
+ if ((event.ctrlKey || event.metaKey) && !dt.mozUserCancelled && dt.dropEffect == "none" && !this._isCustomizing) { + if (!dt.mozUserCancelled && dt.dropEffect == "none" && !this._isCustomizing) {
+ const moved = gZenViewSplitter.moveTabToSplitView(event, draggedTab); + const moved = gZenViewSplitter.moveTabToSplitView(event, draggedTab);
+ if (moved) { + if (moved) {
+ delete draggedTab._dragData; + delete draggedTab._dragData;