Enhance tab management by updating tab close handling and improving tab drag-and-drop functionality

This commit is contained in:
mr. M
2025-02-02 14:25:05 +01:00
parent b55e0eb1d3
commit 61190233fc
7 changed files with 69 additions and 36 deletions

View File

@@ -350,13 +350,6 @@
this.#currentBrowser.setAttribute('zen-glance-selected', true);
this.fillOverlay(this.#currentBrowser);
this.#currentParentTab._visuallySelected = true;
setTimeout(() => {
setTimeout(() => {
// just to make sure
parentBrowserContainer.classList.add('deck-selected');
this.#currentParentTab._visuallySelected = true;
}, 0);
}, 0);
this.overlay.classList.add('deck-selected');
this.overlay.classList.add('zen-glance-overlay');
@@ -367,6 +360,9 @@
quickCloseGlance({ closeCurrentTab = true, closeParentTab = true, justAnimateParent = false, clearID = true } = {}) {
const parentHasBrowser = !!this.#currentParentTab.linkedBrowser;
this.hideSidebarButtons();
if (parentHasBrowser) {
this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('zen-glance-background');
}
if (!justAnimateParent && this.overlay) {
if (parentHasBrowser) {
if (closeParentTab) {
@@ -389,9 +385,6 @@
this.#currentBrowser.removeAttribute('zen-glance-selected');
this.overlay.classList.remove('zen-glance-overlay');
}
if (parentHasBrowser) {
this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('zen-glance-background');
}
if (clearID) {
this.#currentGlanceID = null;
}

View File

@@ -673,7 +673,7 @@
}
}
// Check for normal tabs container
else if (tabsTarget) {
else if (tabsTarget || event.target.id === 'zen-browser-tabs-wrapper') {
if (draggedTab.pinned && !draggedTab.hasAttribute('zen-essential')) {
gBrowser.unpinTab(draggedTab);
moved = true;

View File

@@ -173,7 +173,7 @@
}
handleTabClose(tab) {
// Nothing yet
tab.lastActivity = null;
}
handleTabOpen(tab) {

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js
index 60061540d79843281f3ee2ce905824b224da6f46..c01f8a7f18921588ecdc635c281cf01041ef627b 100644
index d41c486c02a6f09dcff5741a59ad8b617294c481..855152a13afdf58433c228e3675e2e0eebe3892e 100644
--- a/browser/components/tabbrowser/content/tab.js
+++ b/browser/components/tabbrowser/content/tab.js
@@ -39,6 +39,7 @@
@@ -37,6 +37,7 @@
</hbox>
</vbox>
<image class="tab-close-button close-icon" role="button" data-l10n-id="tabbrowser-close-tabs-button" data-l10n-args='{"tabCount": 1}' keyNav="false"/>
@@ -10,7 +10,16 @@ index 60061540d79843281f3ee2ce905824b224da6f46..c01f8a7f18921588ecdc635c281cf010
</hbox>
</stack>
`;
@@ -447,6 +448,7 @@
@@ -168,7 +169,7 @@
}
set _visuallySelected(val) {
- if (val == this.hasAttribute("visuallyselected")) {
+ if (val == this.hasAttribute("visuallyselected") || (!val && this.linkedBrowser?.closest('.browserSidebarContainer').classList.contains('zen-glance-background'))) {
return;
}
@@ -451,6 +452,7 @@
this.style.MozUserFocus = "ignore";
} else if (
event.target.classList.contains("tab-close-button") ||
@@ -18,7 +27,7 @@ index 60061540d79843281f3ee2ce905824b224da6f46..c01f8a7f18921588ecdc635c281cf010
event.target.classList.contains("tab-icon-overlay")
) {
eventMaySelectTab = false;
@@ -549,6 +551,11 @@
@@ -553,6 +555,11 @@
// (see tabbrowser-tabs 'click' handler).
gBrowser.tabContainer._blockDblClick = true;
}

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..9aaa4b0cd8a8bb76c59415f2322d739cbe00302e 100644
index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..8063e0149827bb3da06b25079efa2a5a6fdfbb3a 100644
--- a/browser/components/tabbrowser/content/tabbrowser.js
+++ b/browser/components/tabbrowser/content/tabbrowser.js
@@ -406,11 +406,39 @@
@@ -268,7 +268,17 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..9aaa4b0cd8a8bb76c59415f2322d739c
aTab.selected ||
aTab.closing ||
// Tabs that are sharing the screen, microphone or camera cannot be hidden.
@@ -7443,6 +7532,7 @@
@@ -5727,6 +5816,9 @@
this.tabContainer.insertBefore(aTab, neighbor);
}
});
+ if (aTab.hasAttribute("glance-id")) {
+ this.moveTabTo(aTab.querySelector("tab[glance-id]"), aIndex, options);
+ }
}
moveTabToGroup(aTab, aGroup) {
@@ -7443,6 +7535,7 @@
aWebProgress.isTopLevel
) {
this.mTab.setAttribute("busy", "true");
@@ -276,7 +286,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..9aaa4b0cd8a8bb76c59415f2322d739c
gBrowser._tabAttrModified(this.mTab, ["busy"]);
this.mTab._notselectedsinceload = !this.mTab.selected;
gBrowser.syncThrobberAnimations(this.mTab);
@@ -8411,7 +8501,7 @@ var TabContextMenu = {
@@ -8411,7 +8504,7 @@ var TabContextMenu = {
);
contextUnpinSelectedTabs.hidden =
!this.contextTab.pinned || !multiselectionContext;
@@ -285,7 +295,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..9aaa4b0cd8a8bb76c59415f2322d739c
// Move Tab items
let contextMoveTabOptions = document.getElementById(
"context_moveTabOptions"
@@ -8444,7 +8534,7 @@ var TabContextMenu = {
@@ -8444,7 +8537,7 @@ var TabContextMenu = {
let contextMoveTabToStart = document.getElementById("context_moveToStart");
let isFirstTab =
tabsToMove[0] == visibleTabs[0] ||
@@ -294,7 +304,7 @@ index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..9aaa4b0cd8a8bb76c59415f2322d739c
contextMoveTabToStart.disabled = isFirstTab && allSelectedTabsAdjacent;
document.getElementById("context_openTabInWindow").disabled =
@@ -8677,6 +8767,7 @@ var TabContextMenu = {
@@ -8677,6 +8770,7 @@ var TabContextMenu = {
if (this.contextTab.multiselected) {
gBrowser.removeMultiSelectedTabs();
} else {

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
index 8aeb244ffca9f48661805f5b7d860b5896055562..566fe3b925738589910598d0242931dd680a8d1e 100644
index 8aeb244ffca9f48661805f5b7d860b5896055562..ad28d73fe7cc6eadc4b4724c75d54857a82ff94c 100644
--- a/browser/components/tabbrowser/content/tabs.js
+++ b/browser/components/tabbrowser/content/tabs.js
@@ -94,7 +94,7 @@
@@ -62,15 +62,17 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..566fe3b925738589910598d0242931dd
if (draggedTab && dropEffect == "copy") {
// copy the dropped tab (wherever it's from)
let newIndex = this._getDropIndex(event);
@@ -1010,7 +1022,7 @@
@@ -1010,8 +1022,8 @@
}
} else {
let pinned = draggedTab.pinned;
- let numPinned = gBrowser.pinnedTabCount;
- let tabs = this.visibleTabs.slice(
+ let numPinned = gBrowser._numVisiblePinTabs;
let tabs = this.visibleTabs.slice(
+ let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(
pinned ? 0 : numPinned,
pinned ? numPinned : undefined
);
@@ -1090,7 +1102,7 @@
let postTransitionCleanup = () => {
tab.removeAttribute("tabdrop-samewindow");
@@ -155,6 +157,15 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..566fe3b925738589910598d0242931dd
selectedTab._notselectedsinceload = false;
}
@@ -1843,7 +1867,7 @@
return;
}
- let tabs = this.visibleTabs;
+ let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab"));
if (!tabs.length) {
return;
}
@@ -1879,7 +1903,7 @@
if (isEndTab && !this._hasTabTempMaxWidth) {
return;
@@ -181,8 +192,9 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..566fe3b925738589910598d0242931dd
+ let numPinned = gBrowser._numVisiblePinTabs;
- if (gBrowser.pinnedTabCount !== verticalTabsContainer.children.length) {
- let tabs = this.visibleTabs;
+ if (gBrowser.pinnedTabCount !== (verticalTabsContainer.children.length + document.getElementById("zen-essentials-container").children.length)) {
let tabs = this.visibleTabs;
+ let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab"));
for (let i = 0; i < numPinned; i++) {
tabs[i].style.marginInlineStart = "";
- verticalTabsContainer.appendChild(tabs[i]);
@@ -190,11 +202,13 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..566fe3b925738589910598d0242931dd
}
}
@@ -1993,7 +2017,7 @@
@@ -1992,8 +2016,8 @@
}
_positionPinnedTabs() {
let tabs = this.visibleTabs;
- let tabs = this.visibleTabs;
- let numPinned = gBrowser.pinnedTabCount;
+ let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab"));
+ let numPinned = gBrowser._numVisiblePinTabs;
let absPositionHorizontalTabs =
this.overflowing && tabs.length > numPinned && numPinned > 0;
@@ -204,25 +218,23 @@ index 8aeb244ffca9f48661805f5b7d860b5896055562..566fe3b925738589910598d0242931dd
}
- let tabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount);
+ let tabs = this.visibleTabs.slice(0, gBrowser._numVisiblePinTabs).filter(tab => !tab.hasAttribute("zen-glance-tab"));
+ let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(0, gBrowser._numVisiblePinTabs);
let directionX = screenX > dragData.animLastScreenX;
let directionY = screenY > dragData.animLastScreenY;
@@ -2257,11 +2281,11 @@
@@ -2257,9 +2281,9 @@
}
let pinned = draggedTab.pinned;
- let numPinned = gBrowser.pinnedTabCount;
+ let numPinned = gBrowser._numVisiblePinTabs;
let tabs = this.visibleTabs.slice(
- let tabs = this.visibleTabs.slice(
- pinned ? 0 : numPinned,
+ let numPinned = gBrowser._numVisiblePinTabs;
+ let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(
+ pinned ? gBrowser._numZenEssentials : numPinned,
pinned ? numPinned : undefined
- );
+ ).filter(tab => !tab.hasAttribute("zen-glance-tab"));
);
if (this.#rtlMode) {
tabs.reverse();
@@ -2502,8 +2526,9 @@
);
}

View File

@@ -1,7 +1,16 @@
diff --git a/toolkit/content/widgets/tabbox.js b/toolkit/content/widgets/tabbox.js
index 033582a3badb65d50f58a11f8a259e28eaa04ef3..a2f655f2444bcf638434f39278e1a3de725de4d6 100644
index 033582a3badb65d50f58a11f8a259e28eaa04ef3..fc79b5fb64ad17c3446979aa017fffb7f8ac3467 100644
--- a/toolkit/content/widgets/tabbox.js
+++ b/toolkit/content/widgets/tabbox.js
@@ -210,7 +210,7 @@
) {
this._inAsyncOperation = false;
if (oldPanel != this._selectedPanel) {
- oldPanel?.classList.remove("deck-selected");
+ if (!oldPanel?.classList.contains("zen-glance-background")) oldPanel?.classList.remove("deck-selected");
this._selectedPanel?.classList.add("deck-selected");
}
this.setAttribute("selectedIndex", val);
@@ -820,7 +820,7 @@
if (tab == startTab) {
return null;