mirror of
https://github.com/zen-browser/desktop.git
synced 2025-10-07 02:16:36 +00:00
Enhance tab selection handling and improve drag-and-drop functionality in ZenViewSplitter
This commit is contained in:
@@ -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,
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user