Started working on workspaces

This commit is contained in:
Mauro Balades 2024-07-13 17:53:22 +02:00
parent c76492571b
commit c63cfebd4f
6 changed files with 81 additions and 50 deletions

19
docs/workspaces.md Normal file
View file

@ -0,0 +1,19 @@
# Workspaces Layout
```
{
"workspaces": [
{
"uuid": "uuid1",
"name": "workspace1",
"icon": "icon1",
"default": true
},
...
]
}
```
To save the tabs and identity them, they will contain a `zen-workspace-uuid` attribute with the workspace uuid.
We will make use of firefox's builtin session restore feature to save the tabs and windows after the user closes the browser.

View file

@ -8,5 +8,11 @@ var gZenUIManager = {
}
let tab = window.gBrowser.addTrustedTab(url, options);
window.gBrowser.selectedTab = tab;
}
},
generateUuidv4() {
return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, c =>
(+c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> +c / 4).toString(16)
);
},
};

View file

@ -25,20 +25,30 @@ var ZenWorkspaces = {
}
},
async saveWorkspace(workspaceData, windowID) {
async saveWorkspace(workspaceData) {
let json = await IOUtils.readJSON(this._storeFile);
json[windowID] = workspaceData;
if (!json.workspaces) {
json.workspaces = [];
}
json.workspaces.push(workspaceData);
console.log("Saving workspace", workspaceData);
await IOUtils.writeJSON(this._storeFile, json);
},
async loadWorkspace(windowID) {
let json = await IOUtils.readJSON(this._storeFile);
return json[windowID];
if (!json.workspaces) {
return [];
}
return json.workspaces.filter(workspace => workspace.uuid === windowID);
},
async removeWorkspace(windowID) {
let json = await IOUtils.readJSON(this._storeFile);
delete json[windowID];
if (!json.workspaces) {
return;
}
json.workspaces = json.workspaces.filter(workspace => workspace.uuid !== windowID);
await IOUtils.writeJSON(this._storeFile, json);
},
@ -47,27 +57,33 @@ var ZenWorkspaces = {
return json;
},
async getWorkspace(windowID) {
let json = await IOUtils.readJSON(this._storeFile);
return json[windowID];
},
// Workspaces dialog UI management
// Workspaces management
_createWorkspaceData(windowID) {
let window = Services.wm.getOuterWindowWithId(windowID);
let tabs = Array.from(window.gBrowser.tabs).map(tab => ({
url: tab.linkedBrowser.currentURI.spec,
title: tab.label,
}));
return {
tabs,
};
_prepareNewWorkspace(window) {
for (let tab of window.gBrowser.tabs) {
tab.addAttribute("zen-workspace-id", window.uuid);
}
window.document.documentElement.setAttribute("zen-workspace-id", window.uuid);
},
async saveCurrentWorkspace(windowID) {
let workspaceData = this._createWorkspaceData(windowID);
await this.saveWorkspace(workspaceData, windowID);
_createWorkspaceData() {
let window = {
uuid: gZenUIManager.generateUuidv4(),
default: false,
icon: "",
name: `New Workspace`,
};
this._prepareNewWorkspace(window);
return window;
},
async createAndSaveWorkspace() {
let workspaceData = this._createWorkspaceData();
await this.saveWorkspace(workspaceData);
},
};

View file

@ -1,11 +0,0 @@
diff --git a/browser/base/content/appmenu-viewcache.inc.xhtml b/browser/base/content/appmenu-viewcache.inc.xhtml
index 07b1765f18236835363fb74c898d3a690659cc9b..7b58cbb5de147ed29fbc48c0093c731fe5cca90b 100644
--- a/browser/base/content/appmenu-viewcache.inc.xhtml
+++ b/browser/base/content/appmenu-viewcache.inc.xhtml
@@ -765,5 +765,6 @@
</vbox>
</panelview>
+#include zen-panels-ui.inc.xhtml
#include ../../components/reportbrokensite/content/reportBrokenSitePanel.inc.xhtml
</html:template>

View file

@ -1,18 +0,0 @@
<panelview id="PanelUI-zen-profiles" position="bottomleft topleft" mainview="true" side="right">
<vbox>
<html:div id="PanelUI-zen-profiles-header">
<html:div id="PanelUI-zen-profiles-user-picture"></html:div>
</html:div>
<vbox id="PanelUI-zen-profiles-current-info">
<label id="PanelUI-zen-profiles-current-name"></label>
<p id="PanelUI-zen-profiles-current-profile-current" data-l10n-id="zen-panel-ui-current-profile-text"></p>
</vbox>
<hbox id="PanelUI-zen-profiles-actions">
<toolbarbutton id="PanelUI-zen-profiles-managePrfs" oncommand="switchToTabHavingURI('about:profiles', true);" data-l10n-id="appmenu-manage-profiles" class="subviewbutton"></toolbarbutton>
<toolbarbutton id="PanelUI-zen-profiles-privateWin" command="Tools:PrivateBrowsing" data-l10n-id="appmenuitem-new-private-window" class="subviewbutton"></toolbarbutton>
<toolbarbutton id="PanelUI-zen-profiles-newProfile" oncommand="ZenProfileDialogUI.createProfileWizard();" data-l10n-id="appmenu-create-profile" class="subviewbutton"></toolbarbutton>
</hbox>
<vbox id="PanelUI-zen-profiles-list">
</vbox>
</vbox>
</panelview>

View file

@ -56,3 +56,22 @@
</panelmultiview>
</panel>
</html:template>
<panelview id="PanelUI-zen-profiles" position="bottomleft topleft" mainview="true" side="right">
<vbox>
<html:div id="PanelUI-zen-profiles-header">
<html:div id="PanelUI-zen-profiles-user-picture"></html:div>
</html:div>
<vbox id="PanelUI-zen-profiles-current-info">
<label id="PanelUI-zen-profiles-current-name"></label>
<p id="PanelUI-zen-profiles-current-profile-current" data-l10n-id="zen-panel-ui-current-profile-text"></p>
</vbox>
<hbox id="PanelUI-zen-profiles-actions">
<toolbarbutton id="PanelUI-zen-profiles-managePrfs" oncommand="switchToTabHavingURI('about:profiles', true);" data-l10n-id="appmenu-manage-profiles" class="subviewbutton"></toolbarbutton>
<toolbarbutton id="PanelUI-zen-profiles-privateWin" command="Tools:PrivateBrowsing" data-l10n-id="appmenuitem-new-private-window" class="subviewbutton"></toolbarbutton>
<toolbarbutton id="PanelUI-zen-profiles-newProfile" oncommand="ZenProfileDialogUI.createProfileWizard();" data-l10n-id="appmenu-create-profile" class="subviewbutton"></toolbarbutton>
</hbox>
<vbox id="PanelUI-zen-profiles-list">
</vbox>
</vbox>
</panelview>