Issue #74: pinned tabs sorted
This commit is contained in:
parent
a6bfaabb9c
commit
bc7556d028
1 changed files with 38 additions and 29 deletions
67
index.js
67
index.js
|
@ -177,42 +177,51 @@ let ContainerService = {
|
||||||
},
|
},
|
||||||
|
|
||||||
sortTabs() {
|
sortTabs() {
|
||||||
return new Promise(resolve => {
|
function sortTabsInternal(window, pinnedTabs) {
|
||||||
for (let window of windows.browserWindows) {
|
// From model to XUL window.
|
||||||
// From model to XUL window.
|
const xulWindow = viewFor(window);
|
||||||
window = viewFor(window);
|
|
||||||
|
|
||||||
let tabs = tabsUtils.getTabs(window);
|
const tabs = tabsUtils.getTabs(xulWindow);
|
||||||
|
let pos = 0;
|
||||||
|
|
||||||
let pos = 0;
|
// Let's collect UCIs/tabs for this window.
|
||||||
|
let map = new Map;
|
||||||
// Let"s collect UCIs/tabs for this window.
|
for (const tab of tabs) {
|
||||||
let map = new Map;
|
if (pinnedTabs && !tabsUtils.isPinned(tab)) {
|
||||||
for (let tab of tabs) {
|
// We don't have, or we already handled all the pinned tabs.
|
||||||
if (tabsUtils.isPinned(tab)) {
|
break;
|
||||||
// pinned tabs must be consider as taken positions.
|
|
||||||
++pos;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let userContextId = parseInt(tab.getAttribute("usercontextid") || 0, 10);
|
|
||||||
if (!map.has(userContextId)) {
|
|
||||||
map.set(userContextId, []);
|
|
||||||
}
|
|
||||||
map.get(userContextId).push(tab);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Let"s sort the map.
|
if (!pinnedTabs && tabsUtils.isPinned(tab)) {
|
||||||
let sortMap = new Map([...map.entries()].sort((a, b) => a[0] > b[0]));
|
// pinned tabs must be consider as taken positions.
|
||||||
|
++pos;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Let"s move tabs.
|
let userContextId = parseInt(tab.getAttribute("usercontextid") || 0, 10);
|
||||||
sortMap.forEach(tabs => {
|
if (!map.has(userContextId)) {
|
||||||
for (let tab of tabs) {
|
map.set(userContextId, []);
|
||||||
window.gBrowser.moveTabTo(tab, pos++);
|
}
|
||||||
}
|
map.get(userContextId).push(tab);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Let's sort the map.
|
||||||
|
const sortMap = new Map([...map.entries()].sort((a, b) => a[0] > b[0]));
|
||||||
|
|
||||||
|
// Let's move tabs.
|
||||||
|
sortMap.forEach(tabs => {
|
||||||
|
for (const tab of tabs) {
|
||||||
|
xulWindow.gBrowser.moveTabTo(tab, pos++);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Promise(resolve => {
|
||||||
|
for (let window of windows.browserWindows) {
|
||||||
|
// First the pinned tabs, then the normal ones.
|
||||||
|
sortTabsInternal(window, true);
|
||||||
|
sortTabsInternal(window, false);
|
||||||
|
}
|
||||||
resolve(null);
|
resolve(null);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
Loading…
Add table
Reference in a new issue