Files
desktop/src/browser/base/zen-components/ZenFolders.mjs

121 lines
3.5 KiB
JavaScript

{
class ZenFolders {
constructor() {
this.#initEventListeners();
}
#initEventListeners() {
document.addEventListener('TabGrouped', this.#onTabGrouped.bind(this));
document.addEventListener('TabUngrouped', this.#onTabUngrouped.bind(this));
document.addEventListener('TabGroupRemoved', this.#onTabGroupRemoved.bind(this));
document.addEventListener('TabGroupCreate', this.#onTabGroupCreate.bind(this));
document.addEventListener('TabPinned', this.#onTabPinned.bind(this));
document.addEventListener('TabUnpinned', this.#onTabUnpinned.bind(this));
}
#onTabGrouped(event) {
const tab = event.target;
const group = tab.group;
group.pinned = tab.pinned;
if (group.hasAttribute('split-view-group') && group.hasAttribute('zen-pinned-changed')) {
// zen-pinned-changed remove it and set it to had-zen-pinned-changed to keep
// track of the original pinned state
group.removeAttribute('zen-pinned-changed');
group.setAttribute('had-zen-pinned-changed', true);
}
}
#onTabUngrouped(event) {
const tab = event.target;
const group = event.detail;
if (group.hasAttribute('split-view-group') && tab.hasAttribute('had-zen-pinned-changed')) {
tab.setAttribute('zen-pinned-changed', true);
tab.removeAttribute('had-zen-pinned-changed');
}
}
#onTabGroupCreate(event) {
const group = event.target;
const tabs = group.tabs;
if (!group.pinned) {
return;
}
for (const tab of tabs) {
if (tab.hasAttribute('zen-pinned-changed')) {
tab.removeAttribute('zen-pinned-changed');
tab.setAttribute('had-zen-pinned-changed', true);
}
}
}
#onTabGroupRemoved(event) {}
#onTabPinned(event) {
const tab = event.target;
const group = tab.group;
if (group && group.hasAttribute('split-view-group')) {
group.pinned = true;
}
}
#onTabUnpinned(event) {
const tab = event.target;
const group = tab.group;
if (group && group.hasAttribute('split-view-group')) {
group.pinned = false;
}
}
expandGroupTabs(group) {
for (const tab of group.tabs.reverse()) {
gBrowser.ungroupTab(tab);
}
}
handleTabPin(tab) {
const group = tab.group;
if (!group) {
return false;
}
if (group.hasAttribute('split-view-group') && !this._piningFolder) {
this._piningFolder = true;
for (const otherTab of group.tabs) {
if (tab === otherTab) {
continue;
}
gBrowser.pinTab(otherTab);
}
this._piningFolder = false;
gBrowser.verticalPinnedTabsContainer.insertBefore(group, gBrowser.verticalPinnedTabsContainer.lastChild);
gBrowser.tabContainer._invalidateCachedTabs();
return true;
}
return this._piningFolder;
}
handleTabUnpin(tab) {
const group = tab.group;
if (!group) {
return false;
}
if (group.hasAttribute('split-view-group') && !this._piningFolder) {
this._piningFolder = true;
for (const otherTab of group.tabs) {
if (tab === otherTab) {
continue;
}
gBrowser.unpinTab(otherTab);
}
this._piningFolder = false;
ZenWorkspaces.activeWorkspaceStrip.prepend(group);
gBrowser.tabContainer._invalidateCachedTabs();
return true;
}
return this._piningFolder;
}
}
window.gZenFolders = new ZenFolders();
}