From c63cfebd4f4c18889536a96ed230c7cb15eb601f Mon Sep 17 00:00:00 2001 From: Mauro Balades Date: Sat, 13 Jul 2024 17:53:22 +0200 Subject: [PATCH] Started working on workspaces --- docs/workspaces.md | 19 +++++++ src/browser/base/content/ZenUIManager.mjs | 8 ++- src/browser/base/content/ZenWorkspaces.mjs | 56 ++++++++++++------- .../content/appmenu-viewcache-inc-xhtml.patch | 11 ---- .../base/content/zen-panels-ui.inc.xhtml | 18 ------ .../base/content/zen-popupset.inc.xhtml | 19 +++++++ 6 files changed, 81 insertions(+), 50 deletions(-) create mode 100644 docs/workspaces.md delete mode 100644 src/browser/base/content/appmenu-viewcache-inc-xhtml.patch delete mode 100644 src/browser/base/content/zen-panels-ui.inc.xhtml diff --git a/docs/workspaces.md b/docs/workspaces.md new file mode 100644 index 00000000..13fd78ae --- /dev/null +++ b/docs/workspaces.md @@ -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. diff --git a/src/browser/base/content/ZenUIManager.mjs b/src/browser/base/content/ZenUIManager.mjs index 398dc179..e298d98a 100644 --- a/src/browser/base/content/ZenUIManager.mjs +++ b/src/browser/base/content/ZenUIManager.mjs @@ -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) + ); + }, }; diff --git a/src/browser/base/content/ZenWorkspaces.mjs b/src/browser/base/content/ZenWorkspaces.mjs index 8ad9dae7..37f9e774 100644 --- a/src/browser/base/content/ZenWorkspaces.mjs +++ b/src/browser/base/content/ZenWorkspaces.mjs @@ -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); }, }; diff --git a/src/browser/base/content/appmenu-viewcache-inc-xhtml.patch b/src/browser/base/content/appmenu-viewcache-inc-xhtml.patch deleted file mode 100644 index c58ade66..00000000 --- a/src/browser/base/content/appmenu-viewcache-inc-xhtml.patch +++ /dev/null @@ -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 @@ - - - -+#include zen-panels-ui.inc.xhtml - #include ../../components/reportbrokensite/content/reportBrokenSitePanel.inc.xhtml - diff --git a/src/browser/base/content/zen-panels-ui.inc.xhtml b/src/browser/base/content/zen-panels-ui.inc.xhtml deleted file mode 100644 index d00928d3..00000000 --- a/src/browser/base/content/zen-panels-ui.inc.xhtml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - -

-
- - - - - - - -
-
\ No newline at end of file diff --git a/src/browser/base/content/zen-popupset.inc.xhtml b/src/browser/base/content/zen-popupset.inc.xhtml index b253ebc8..0abd8ce6 100644 --- a/src/browser/base/content/zen-popupset.inc.xhtml +++ b/src/browser/base/content/zen-popupset.inc.xhtml @@ -56,3 +56,22 @@ + + + + + + + + +

+
+ + + + + + + +
+