mirror of
https://github.com/zen-browser/desktop.git
synced 2025-10-16 14:56:14 +00:00
121 lines
3.5 KiB
JavaScript
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();
|
|
}
|