From f73a4ee619ef2552c1d756eb33b5bbf7ac612814 Mon Sep 17 00:00:00 2001 From: kkapsner Date: Wed, 12 Sep 2018 23:43:48 +0200 Subject: [PATCH] Save state of the arrow menu in options page Fixes #251 --- lib/settingDefinitions.js | 5 +++++ lib/settings.js | 38 +++++++++++++++++++++++++++++++++++++- options/options.js | 28 +++++++++++++++++++++++++++- options/optionsGui.js | 9 ++++++--- releaseNotes.txt | 2 ++ 5 files changed, 77 insertions(+), 5 deletions(-) diff --git a/lib/settingDefinitions.js b/lib/settingDefinitions.js index 3db615b..5df64d3 100644 --- a/lib/settingDefinitions.js +++ b/lib/settingDefinitions.js @@ -23,6 +23,11 @@ hideContainer: true, defaultValue: {} }, + { + name: "expandStatus", + expandContainer: true, + defaultValue: {} + }, { name: "displayHiddenSettings", defaultValue: false diff --git a/lib/settings.js b/lib/settings.js index b6ce52f..23aa901 100644 --- a/lib/settings.js +++ b/lib/settings.js @@ -40,6 +40,7 @@ const settings = {}; let urlContainer; let hideContainer; + let expandContainer; function isDefinitionInvalid(settingDefinition, newValue){ if (newValue === undefined && settingDefinition.optional){ @@ -351,6 +352,40 @@ }); settingDefinition.hideAble = false; } + + if (settingDefinition.expandContainer){ + expandContainer = settingDefinition; + let changeListeners = {}; + settingDefinition.setExpandByName = function(name, value){ + logging.verbose("set expand of", name, "to", value); + const expandStore = settingDefinition.get(); + expandStore[name] = value; + settingDefinition.set(expandStore); + (changeListeners[name] || []).forEach(function(listener){ + listener(value); + }); + }; + settingDefinition.getExpandByName = function(name){ + const expandStore = settingDefinition.get(); + return expandStore[name] || false; + }; + settingDefinition.onExpandChange = function(name, listener){ + if (!changeListeners[name]){ + changeListeners[name] = []; + } + changeListeners[name].push(listener); + }; + settingDefinition.on(function(event){ + const value = event.newValue; + Object.keys(value).forEach(function(name){ + if (value[name]){ + (changeListeners[name] || []).forEach(function(listener){ + listener(true); + }); + } + }); + }); + } }); scope.getDefinition = function(name){ @@ -366,7 +401,8 @@ scope.getContainers = function(){ return { url: Object.create(urlContainer), - hide: Object.create(hideContainer) + hide: Object.create(hideContainer), + expand: Object.create(expandContainer) }; }; diff --git a/options/options.js b/options/options.js index 089d053..6ff28fa 100644 --- a/options/options.js +++ b/options/options.js @@ -212,7 +212,7 @@ }; addSection(); - const {hide: hideContainer} = settings.getContainers(); + const {hide: hideContainer, expand: expandContainer} = settings.getContainers(); settingsDisplay.forEach(function(display){ if (typeof display === "string"){ addSection(display); @@ -248,6 +248,7 @@ } if (setting){ setting.display = display; + let hideChangeListeners = []; setting.setHide = function setHide(value){ if (hideContainer){ @@ -279,6 +280,31 @@ }); } + let expandChangeListeners = []; + setting.setExpand = function setExpand(value){ + if (expandContainer){ + expandContainer.setExpandByName(display.name, value); + } + }; + setting.onExpandChange = function(listener){ + expandChangeListeners.push(listener); + }; + setting.getExpand = function getExpand(){ + if (expandContainer){ + return expandContainer.getExpandByName(display.name); + } + else { + return false; + } + }; + if (expandContainer){ + expandContainer.onExpandChange(display.name, function(value){ + expandChangeListeners.forEach(function(listener){ + listener(value); + }); + }); + } + var row = optionsGui.createSettingRow(setting); let section = lastSection; section.addRow(row); diff --git a/options/optionsGui.js b/options/optionsGui.js index f16f54d..9972ab8 100644 --- a/options/optionsGui.js +++ b/options/optionsGui.js @@ -198,14 +198,17 @@ if (setting.urlSpecific && url === ""){ let container = document.createElement("div"); - container.className = "urlValues collapsed"; + container.className = "urlValues " + (setting.getExpand()? "expanded": "collapsed"); container.appendChild(input); var collapser = document.createElement("span"); collapser.classList.add("collapser"); container.appendChild(collapser); collapser.addEventListener("click", function(){ - container.classList.toggle("collapsed"); - container.classList.toggle("expanded"); + setting.setExpand(!setting.getExpand()); + }); + setting.onExpandChange(function(value){ + container.classList[value? "remove": "add"]("collapsed"); + container.classList[value? "add": "remove"]("expanded"); }); let urlTable = document.createElement("table"); let caption = document.createElement("caption"); diff --git a/releaseNotes.txt b/releaseNotes.txt index aa616c5..8a9250b 100644 --- a/releaseNotes.txt +++ b/releaseNotes.txt @@ -2,11 +2,13 @@ Version 0.5.4: changes: - converted "API whitelist" to "protected API features" (automatic settings migration) - notification details are not stored by default + - settings page reorganized new features: - added save/load directly to/from file option - added protection for DOMRect (getClientRects) - added setting to control if notification details should be stored + - state of the arrow for url specific values is saved fixes: - window and audio API were always blocked when using any of the "block ..." modes