diff options
| author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2020-05-29 19:45:54 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-29 19:45:54 -0400 | 
| commit | 8537c8f386b7c04f21e62a6b82b179ec9a123ce1 (patch) | |
| tree | 00bcea4ebf85d240ef8203ac14c867c7b9a4446b | |
| parent | 37f0396f1cf4f74833d9a4a364f503f4a7c3e34a (diff) | |
Create class to abstract access, mutation, and events for settings (#565)
| -rw-r--r-- | ext/bg/js/settings/main.js | 4 | ||||
| -rw-r--r-- | ext/bg/js/settings/settings-controller.js | 83 | ||||
| -rw-r--r-- | ext/bg/settings.html | 1 | 
3 files changed, 88 insertions, 0 deletions
| diff --git a/ext/bg/js/settings/main.js b/ext/bg/js/settings/main.js index f96167af..0cb1734e 100644 --- a/ext/bg/js/settings/main.js +++ b/ext/bg/js/settings/main.js @@ -17,6 +17,7 @@  /* global   * SettingsBackup + * SettingsController   * ankiInitialize   * ankiTemplatesInitialize   * ankiTemplatesUpdateValue @@ -292,6 +293,9 @@ async function onReady() {      api.forwardLogsToBackend();      await yomichan.prepare(); +    const settingsController = new SettingsController(); +    settingsController.prepare(); +      showExtensionInformation();      await settingsPopulateModifierKeys(); diff --git a/ext/bg/js/settings/settings-controller.js b/ext/bg/js/settings/settings-controller.js new file mode 100644 index 00000000..61230226 --- /dev/null +++ b/ext/bg/js/settings/settings-controller.js @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2020  Yomichan Authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <https://www.gnu.org/licenses/>. + */ + +/* global + * api + * utilBackend + * utilBackgroundIsolate + */ + +class SettingsController extends EventDispatcher { +    constructor(profileIndex=0) { +        super(); +        this._profileIndex = profileIndex; +        this._source = yomichan.generateId(16); +    } + +    get profileIndex() { +        return this._profileIndex; +    } + +    set profileIndex(value) { +        if (this._profileIndex === value) { return; } +        this._profileIndex = value; +        this.trigger('optionsContextChanged'); +        this._onOptionsUpdatedInternal(); +    } + +    prepare() { +        yomichan.on('optionsUpdated', this._onOptionsUpdated.bind(this)); +    } + +    async save() { +        await api.optionsSave(this._source); +    } + +    async getOptions() { +        const optionsContext = this.getOptionsContext(); +        return await api.optionsGet(optionsContext); +    } + +    async getOptionsFull() { +        return await api.optionsGetFull(); +    } + +    async getOptionsMutable() { +        const optionsContext = this.getOptionsContext(); +        return utilBackend().getOptions(utilBackgroundIsolate(optionsContext)); +    } + +    async getOptionsFullMutable() { +        return utilBackend().getFullOptions(); +    } + +    getOptionsContext() { +        return {index: this._profileIndex}; +    } + +    // Private + +    _onOptionsUpdated({source}) { +        if (source === this._source) { return; } +        this._onOptionsUpdatedInternal(); +    } + +    async _onOptionsUpdatedInternal() { +        const options = await this.getOptions(); +        this.trigger('optionsChanged', {options}); +    } +} diff --git a/ext/bg/settings.html b/ext/bg/settings.html index 7964ab90..c8f5b15c 100644 --- a/ext/bg/settings.html +++ b/ext/bg/settings.html @@ -1147,6 +1147,7 @@          <script src="/bg/js/settings/dictionaries.js"></script>          <script src="/bg/js/settings/popup-preview.js"></script>          <script src="/bg/js/settings/profiles.js"></script> +        <script src="/bg/js/settings/settings-controller.js"></script>          <script src="/bg/js/settings/storage.js"></script>          <script src="/bg/js/settings/main.js"></script> |