diff options
| -rw-r--r-- | ext/bg/js/settings/clipboard-popups-controller.js | 52 | ||||
| -rw-r--r-- | ext/bg/js/settings/generic-setting-controller.js | 197 | ||||
| -rw-r--r-- | ext/bg/js/settings/main.js | 202 | ||||
| -rw-r--r-- | ext/bg/settings.html | 2 | 
4 files changed, 260 insertions, 193 deletions
| diff --git a/ext/bg/js/settings/clipboard-popups-controller.js b/ext/bg/js/settings/clipboard-popups-controller.js new file mode 100644 index 00000000..cb9e857f --- /dev/null +++ b/ext/bg/js/settings/clipboard-popups-controller.js @@ -0,0 +1,52 @@ +/* + * 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/>. + */ + +/* globals + * getOptionsContext + * getOptionsMutable + * settingsSaveOptions + */ + +class ClipboardPopupsController { +    prepare() { +        document.querySelector('#enable-clipboard-popups').addEventListener('change', this._onEnableClipboardPopupsChanged.bind(this), false); +    } + +    async _onEnableClipboardPopupsChanged(e) { +        const optionsContext = getOptionsContext(); +        const options = await getOptionsMutable(optionsContext); + +        const enableClipboardPopups = e.target.checked; +        if (enableClipboardPopups) { +            options.general.enableClipboardPopups = await new Promise((resolve) => { +                chrome.permissions.request( +                    {permissions: ['clipboardRead']}, +                    (granted) => { +                        if (!granted) { +                            $('#enable-clipboard-popups').prop('checked', false); +                        } +                        resolve(granted); +                    } +                ); +            }); +        } else { +            options.general.enableClipboardPopups = false; +        } + +        await settingsSaveOptions(); +    } +} diff --git a/ext/bg/js/settings/generic-setting-controller.js b/ext/bg/js/settings/generic-setting-controller.js new file mode 100644 index 00000000..4a20bf65 --- /dev/null +++ b/ext/bg/js/settings/generic-setting-controller.js @@ -0,0 +1,197 @@ +/* + * 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/>. + */ + +/* globals + * getOptionsContext + * getOptionsMutable + * settingsSaveOptions + * utilBackgroundIsolate + */ + +class GenericSettingController { +    prepare() { +        $('input, select, textarea').not('.anki-model').not('.ignore-form-changes *').change(this._onFormOptionsChanged.bind(this)); +    } + +    optionsChanged(options) { +        this._formWrite(options); +    } + +    // Private + +    async _formWrite(options) { +        $('#enable').prop('checked', options.general.enable); +        $('#show-usage-guide').prop('checked', options.general.showGuide); +        $('#compact-tags').prop('checked', options.general.compactTags); +        $('#compact-glossaries').prop('checked', options.general.compactGlossaries); +        $('#result-output-mode').val(options.general.resultOutputMode); +        $('#show-debug-info').prop('checked', options.general.debugInfo); +        $('#show-advanced-options').prop('checked', options.general.showAdvanced); +        $('#max-displayed-results').val(options.general.maxResults); +        $('#popup-display-mode').val(options.general.popupDisplayMode); +        $('#popup-horizontal-text-position').val(options.general.popupHorizontalTextPosition); +        $('#popup-vertical-text-position').val(options.general.popupVerticalTextPosition); +        $('#popup-width').val(options.general.popupWidth); +        $('#popup-height').val(options.general.popupHeight); +        $('#popup-horizontal-offset').val(options.general.popupHorizontalOffset); +        $('#popup-vertical-offset').val(options.general.popupVerticalOffset); +        $('#popup-horizontal-offset2').val(options.general.popupHorizontalOffset2); +        $('#popup-vertical-offset2').val(options.general.popupVerticalOffset2); +        $('#popup-scaling-factor').val(options.general.popupScalingFactor); +        $('#popup-scale-relative-to-page-zoom').prop('checked', options.general.popupScaleRelativeToPageZoom); +        $('#popup-scale-relative-to-visual-viewport').prop('checked', options.general.popupScaleRelativeToVisualViewport); +        $('#show-pitch-accent-downstep-notation').prop('checked', options.general.showPitchAccentDownstepNotation); +        $('#show-pitch-accent-position-notation').prop('checked', options.general.showPitchAccentPositionNotation); +        $('#show-pitch-accent-graph').prop('checked', options.general.showPitchAccentGraph); +        $('#show-iframe-popups-in-root-frame').prop('checked', options.general.showIframePopupsInRootFrame); +        $('#popup-theme').val(options.general.popupTheme); +        $('#popup-outer-theme').val(options.general.popupOuterTheme); +        $('#custom-popup-css').val(options.general.customPopupCss); +        $('#custom-popup-outer-css').val(options.general.customPopupOuterCss); + +        $('#audio-playback-enabled').prop('checked', options.audio.enabled); +        $('#auto-play-audio').prop('checked', options.audio.autoPlay); +        $('#audio-playback-volume').val(options.audio.volume); +        $('#audio-custom-source').val(options.audio.customSourceUrl); +        $('#text-to-speech-voice').val(options.audio.textToSpeechVoice).attr('data-value', options.audio.textToSpeechVoice); + +        $('#middle-mouse-button-scan').prop('checked', options.scanning.middleMouse); +        $('#touch-input-enabled').prop('checked', options.scanning.touchInputEnabled); +        $('#select-matched-text').prop('checked', options.scanning.selectText); +        $('#search-alphanumeric').prop('checked', options.scanning.alphanumeric); +        $('#auto-hide-results').prop('checked', options.scanning.autoHideResults); +        $('#deep-dom-scan').prop('checked', options.scanning.deepDomScan); +        $('#enable-search-within-first-popup').prop('checked', options.scanning.enablePopupSearch); +        $('#enable-scanning-of-popup-expressions').prop('checked', options.scanning.enableOnPopupExpressions); +        $('#enable-scanning-on-search-page').prop('checked', options.scanning.enableOnSearchPage); +        $('#enable-search-tags').prop('checked', options.scanning.enableSearchTags); +        $('#scan-delay').val(options.scanning.delay); +        $('#scan-length').val(options.scanning.length); +        $('#scan-modifier-key').val(options.scanning.modifier); +        $('#popup-nesting-max-depth').val(options.scanning.popupNestingMaxDepth); + +        $('#translation-convert-half-width-characters').val(options.translation.convertHalfWidthCharacters); +        $('#translation-convert-numeric-characters').val(options.translation.convertNumericCharacters); +        $('#translation-convert-alphabetic-characters').val(options.translation.convertAlphabeticCharacters); +        $('#translation-convert-hiragana-to-katakana').val(options.translation.convertHiraganaToKatakana); +        $('#translation-convert-katakana-to-hiragana').val(options.translation.convertKatakanaToHiragana); +        $('#translation-collapse-emphatic-sequences').val(options.translation.collapseEmphaticSequences); + +        $('#parsing-scan-enable').prop('checked', options.parsing.enableScanningParser); +        $('#parsing-mecab-enable').prop('checked', options.parsing.enableMecabParser); +        $('#parsing-term-spacing').prop('checked', options.parsing.termSpacing); +        $('#parsing-reading-mode').val(options.parsing.readingMode); + +        $('#anki-enable').prop('checked', options.anki.enable); +        $('#card-tags').val(options.anki.tags.join(' ')); +        $('#sentence-detection-extent').val(options.anki.sentenceExt); +        $('#interface-server').val(options.anki.server); +        $('#duplicate-scope').val(options.anki.duplicateScope); +        $('#screenshot-format').val(options.anki.screenshot.format); +        $('#screenshot-quality').val(options.anki.screenshot.quality); + +        this._formUpdateVisibility(options); +    } + +    async _formRead(options) { +        options.general.enable = $('#enable').prop('checked'); +        options.general.showGuide = $('#show-usage-guide').prop('checked'); +        options.general.compactTags = $('#compact-tags').prop('checked'); +        options.general.compactGlossaries = $('#compact-glossaries').prop('checked'); +        options.general.resultOutputMode = $('#result-output-mode').val(); +        options.general.debugInfo = $('#show-debug-info').prop('checked'); +        options.general.showAdvanced = $('#show-advanced-options').prop('checked'); +        options.general.maxResults = parseInt($('#max-displayed-results').val(), 10); +        options.general.popupDisplayMode = $('#popup-display-mode').val(); +        options.general.popupHorizontalTextPosition = $('#popup-horizontal-text-position').val(); +        options.general.popupVerticalTextPosition = $('#popup-vertical-text-position').val(); +        options.general.popupWidth = parseInt($('#popup-width').val(), 10); +        options.general.popupHeight = parseInt($('#popup-height').val(), 10); +        options.general.popupHorizontalOffset = parseInt($('#popup-horizontal-offset').val(), 0); +        options.general.popupVerticalOffset = parseInt($('#popup-vertical-offset').val(), 10); +        options.general.popupHorizontalOffset2 = parseInt($('#popup-horizontal-offset2').val(), 0); +        options.general.popupVerticalOffset2 = parseInt($('#popup-vertical-offset2').val(), 10); +        options.general.popupScalingFactor = parseFloat($('#popup-scaling-factor').val()); +        options.general.popupScaleRelativeToPageZoom = $('#popup-scale-relative-to-page-zoom').prop('checked'); +        options.general.popupScaleRelativeToVisualViewport = $('#popup-scale-relative-to-visual-viewport').prop('checked'); +        options.general.showPitchAccentDownstepNotation = $('#show-pitch-accent-downstep-notation').prop('checked'); +        options.general.showPitchAccentPositionNotation = $('#show-pitch-accent-position-notation').prop('checked'); +        options.general.showPitchAccentGraph = $('#show-pitch-accent-graph').prop('checked'); +        options.general.showIframePopupsInRootFrame = $('#show-iframe-popups-in-root-frame').prop('checked'); +        options.general.popupTheme = $('#popup-theme').val(); +        options.general.popupOuterTheme = $('#popup-outer-theme').val(); +        options.general.customPopupCss = $('#custom-popup-css').val(); +        options.general.customPopupOuterCss = $('#custom-popup-outer-css').val(); + +        options.audio.enabled = $('#audio-playback-enabled').prop('checked'); +        options.audio.autoPlay = $('#auto-play-audio').prop('checked'); +        options.audio.volume = parseFloat($('#audio-playback-volume').val()); +        options.audio.customSourceUrl = $('#audio-custom-source').val(); +        options.audio.textToSpeechVoice = $('#text-to-speech-voice').val(); + +        options.scanning.middleMouse = $('#middle-mouse-button-scan').prop('checked'); +        options.scanning.touchInputEnabled = $('#touch-input-enabled').prop('checked'); +        options.scanning.selectText = $('#select-matched-text').prop('checked'); +        options.scanning.alphanumeric = $('#search-alphanumeric').prop('checked'); +        options.scanning.autoHideResults = $('#auto-hide-results').prop('checked'); +        options.scanning.deepDomScan = $('#deep-dom-scan').prop('checked'); +        options.scanning.enablePopupSearch = $('#enable-search-within-first-popup').prop('checked'); +        options.scanning.enableOnPopupExpressions = $('#enable-scanning-of-popup-expressions').prop('checked'); +        options.scanning.enableOnSearchPage = $('#enable-scanning-on-search-page').prop('checked'); +        options.scanning.enableSearchTags = $('#enable-search-tags').prop('checked'); +        options.scanning.delay = parseInt($('#scan-delay').val(), 10); +        options.scanning.length = parseInt($('#scan-length').val(), 10); +        options.scanning.modifier = $('#scan-modifier-key').val(); +        options.scanning.popupNestingMaxDepth = parseInt($('#popup-nesting-max-depth').val(), 10); + +        options.translation.convertHalfWidthCharacters = $('#translation-convert-half-width-characters').val(); +        options.translation.convertNumericCharacters = $('#translation-convert-numeric-characters').val(); +        options.translation.convertAlphabeticCharacters = $('#translation-convert-alphabetic-characters').val(); +        options.translation.convertHiraganaToKatakana = $('#translation-convert-hiragana-to-katakana').val(); +        options.translation.convertKatakanaToHiragana = $('#translation-convert-katakana-to-hiragana').val(); +        options.translation.collapseEmphaticSequences = $('#translation-collapse-emphatic-sequences').val(); + +        options.parsing.enableScanningParser = $('#parsing-scan-enable').prop('checked'); +        options.parsing.enableMecabParser = $('#parsing-mecab-enable').prop('checked'); +        options.parsing.termSpacing = $('#parsing-term-spacing').prop('checked'); +        options.parsing.readingMode = $('#parsing-reading-mode').val(); + +        options.anki.enable = $('#anki-enable').prop('checked'); +        options.anki.tags = utilBackgroundIsolate($('#card-tags').val().split(/[,; ]+/)); +        options.anki.sentenceExt = parseInt($('#sentence-detection-extent').val(), 10); +        options.anki.server = $('#interface-server').val(); +        options.anki.duplicateScope = $('#duplicate-scope').val(); +        options.anki.screenshot.format = $('#screenshot-format').val(); +        options.anki.screenshot.quality = parseInt($('#screenshot-quality').val(), 10); +    } + +    async _onFormOptionsChanged() { +        const optionsContext = getOptionsContext(); +        const options = await getOptionsMutable(optionsContext); + +        await this._formRead(options); +        await settingsSaveOptions(); +        this._formUpdateVisibility(options); +    } + +    _formUpdateVisibility(options) { +        document.documentElement.dataset.optionsAnkiEnable = `${!!options.anki.enable}`; +        document.documentElement.dataset.optionsGeneralDebugInfo = `${!!options.general.debugInfo}`; +        document.documentElement.dataset.optionsGeneralShowAdvanced = `${!!options.general.showAdvanced}`; +        document.documentElement.dataset.optionsGeneralResultOutputMode = `${options.general.resultOutputMode}`; +    } +} diff --git a/ext/bg/js/settings/main.js b/ext/bg/js/settings/main.js index b84824e6..d6f55bde 100644 --- a/ext/bg/js/settings/main.js +++ b/ext/bg/js/settings/main.js @@ -19,7 +19,9 @@   * AnkiController   * AnkiTemplatesController   * AudioController + * ClipboardPopupsController   * DictionaryController + * GenericSettingController   * PopupPreviewController   * ProfileController   * SettingsBackup @@ -55,197 +57,6 @@ function getOptionsFullMutable() {      return utilBackend().getFullOptions();  } -async function formRead(options) { -    options.general.enable = $('#enable').prop('checked'); -    options.general.showGuide = $('#show-usage-guide').prop('checked'); -    options.general.compactTags = $('#compact-tags').prop('checked'); -    options.general.compactGlossaries = $('#compact-glossaries').prop('checked'); -    options.general.resultOutputMode = $('#result-output-mode').val(); -    options.general.debugInfo = $('#show-debug-info').prop('checked'); -    options.general.showAdvanced = $('#show-advanced-options').prop('checked'); -    options.general.maxResults = parseInt($('#max-displayed-results').val(), 10); -    options.general.popupDisplayMode = $('#popup-display-mode').val(); -    options.general.popupHorizontalTextPosition = $('#popup-horizontal-text-position').val(); -    options.general.popupVerticalTextPosition = $('#popup-vertical-text-position').val(); -    options.general.popupWidth = parseInt($('#popup-width').val(), 10); -    options.general.popupHeight = parseInt($('#popup-height').val(), 10); -    options.general.popupHorizontalOffset = parseInt($('#popup-horizontal-offset').val(), 0); -    options.general.popupVerticalOffset = parseInt($('#popup-vertical-offset').val(), 10); -    options.general.popupHorizontalOffset2 = parseInt($('#popup-horizontal-offset2').val(), 0); -    options.general.popupVerticalOffset2 = parseInt($('#popup-vertical-offset2').val(), 10); -    options.general.popupScalingFactor = parseFloat($('#popup-scaling-factor').val()); -    options.general.popupScaleRelativeToPageZoom = $('#popup-scale-relative-to-page-zoom').prop('checked'); -    options.general.popupScaleRelativeToVisualViewport = $('#popup-scale-relative-to-visual-viewport').prop('checked'); -    options.general.showPitchAccentDownstepNotation = $('#show-pitch-accent-downstep-notation').prop('checked'); -    options.general.showPitchAccentPositionNotation = $('#show-pitch-accent-position-notation').prop('checked'); -    options.general.showPitchAccentGraph = $('#show-pitch-accent-graph').prop('checked'); -    options.general.showIframePopupsInRootFrame = $('#show-iframe-popups-in-root-frame').prop('checked'); -    options.general.popupTheme = $('#popup-theme').val(); -    options.general.popupOuterTheme = $('#popup-outer-theme').val(); -    options.general.customPopupCss = $('#custom-popup-css').val(); -    options.general.customPopupOuterCss = $('#custom-popup-outer-css').val(); - -    options.audio.enabled = $('#audio-playback-enabled').prop('checked'); -    options.audio.autoPlay = $('#auto-play-audio').prop('checked'); -    options.audio.volume = parseFloat($('#audio-playback-volume').val()); -    options.audio.customSourceUrl = $('#audio-custom-source').val(); -    options.audio.textToSpeechVoice = $('#text-to-speech-voice').val(); - -    options.scanning.middleMouse = $('#middle-mouse-button-scan').prop('checked'); -    options.scanning.touchInputEnabled = $('#touch-input-enabled').prop('checked'); -    options.scanning.selectText = $('#select-matched-text').prop('checked'); -    options.scanning.alphanumeric = $('#search-alphanumeric').prop('checked'); -    options.scanning.autoHideResults = $('#auto-hide-results').prop('checked'); -    options.scanning.deepDomScan = $('#deep-dom-scan').prop('checked'); -    options.scanning.enablePopupSearch = $('#enable-search-within-first-popup').prop('checked'); -    options.scanning.enableOnPopupExpressions = $('#enable-scanning-of-popup-expressions').prop('checked'); -    options.scanning.enableOnSearchPage = $('#enable-scanning-on-search-page').prop('checked'); -    options.scanning.enableSearchTags = $('#enable-search-tags').prop('checked'); -    options.scanning.delay = parseInt($('#scan-delay').val(), 10); -    options.scanning.length = parseInt($('#scan-length').val(), 10); -    options.scanning.modifier = $('#scan-modifier-key').val(); -    options.scanning.popupNestingMaxDepth = parseInt($('#popup-nesting-max-depth').val(), 10); - -    options.translation.convertHalfWidthCharacters = $('#translation-convert-half-width-characters').val(); -    options.translation.convertNumericCharacters = $('#translation-convert-numeric-characters').val(); -    options.translation.convertAlphabeticCharacters = $('#translation-convert-alphabetic-characters').val(); -    options.translation.convertHiraganaToKatakana = $('#translation-convert-hiragana-to-katakana').val(); -    options.translation.convertKatakanaToHiragana = $('#translation-convert-katakana-to-hiragana').val(); -    options.translation.collapseEmphaticSequences = $('#translation-collapse-emphatic-sequences').val(); - -    options.parsing.enableScanningParser = $('#parsing-scan-enable').prop('checked'); -    options.parsing.enableMecabParser = $('#parsing-mecab-enable').prop('checked'); -    options.parsing.termSpacing = $('#parsing-term-spacing').prop('checked'); -    options.parsing.readingMode = $('#parsing-reading-mode').val(); - -    options.anki.enable = $('#anki-enable').prop('checked'); -    options.anki.tags = utilBackgroundIsolate($('#card-tags').val().split(/[,; ]+/)); -    options.anki.sentenceExt = parseInt($('#sentence-detection-extent').val(), 10); -    options.anki.server = $('#interface-server').val(); -    options.anki.duplicateScope = $('#duplicate-scope').val(); -    options.anki.screenshot.format = $('#screenshot-format').val(); -    options.anki.screenshot.quality = parseInt($('#screenshot-quality').val(), 10); -} - -async function formWrite(options) { -    $('#enable').prop('checked', options.general.enable); -    $('#show-usage-guide').prop('checked', options.general.showGuide); -    $('#compact-tags').prop('checked', options.general.compactTags); -    $('#compact-glossaries').prop('checked', options.general.compactGlossaries); -    $('#result-output-mode').val(options.general.resultOutputMode); -    $('#show-debug-info').prop('checked', options.general.debugInfo); -    $('#show-advanced-options').prop('checked', options.general.showAdvanced); -    $('#max-displayed-results').val(options.general.maxResults); -    $('#popup-display-mode').val(options.general.popupDisplayMode); -    $('#popup-horizontal-text-position').val(options.general.popupHorizontalTextPosition); -    $('#popup-vertical-text-position').val(options.general.popupVerticalTextPosition); -    $('#popup-width').val(options.general.popupWidth); -    $('#popup-height').val(options.general.popupHeight); -    $('#popup-horizontal-offset').val(options.general.popupHorizontalOffset); -    $('#popup-vertical-offset').val(options.general.popupVerticalOffset); -    $('#popup-horizontal-offset2').val(options.general.popupHorizontalOffset2); -    $('#popup-vertical-offset2').val(options.general.popupVerticalOffset2); -    $('#popup-scaling-factor').val(options.general.popupScalingFactor); -    $('#popup-scale-relative-to-page-zoom').prop('checked', options.general.popupScaleRelativeToPageZoom); -    $('#popup-scale-relative-to-visual-viewport').prop('checked', options.general.popupScaleRelativeToVisualViewport); -    $('#show-pitch-accent-downstep-notation').prop('checked', options.general.showPitchAccentDownstepNotation); -    $('#show-pitch-accent-position-notation').prop('checked', options.general.showPitchAccentPositionNotation); -    $('#show-pitch-accent-graph').prop('checked', options.general.showPitchAccentGraph); -    $('#show-iframe-popups-in-root-frame').prop('checked', options.general.showIframePopupsInRootFrame); -    $('#popup-theme').val(options.general.popupTheme); -    $('#popup-outer-theme').val(options.general.popupOuterTheme); -    $('#custom-popup-css').val(options.general.customPopupCss); -    $('#custom-popup-outer-css').val(options.general.customPopupOuterCss); - -    $('#audio-playback-enabled').prop('checked', options.audio.enabled); -    $('#auto-play-audio').prop('checked', options.audio.autoPlay); -    $('#audio-playback-volume').val(options.audio.volume); -    $('#audio-custom-source').val(options.audio.customSourceUrl); -    $('#text-to-speech-voice').val(options.audio.textToSpeechVoice).attr('data-value', options.audio.textToSpeechVoice); - -    $('#middle-mouse-button-scan').prop('checked', options.scanning.middleMouse); -    $('#touch-input-enabled').prop('checked', options.scanning.touchInputEnabled); -    $('#select-matched-text').prop('checked', options.scanning.selectText); -    $('#search-alphanumeric').prop('checked', options.scanning.alphanumeric); -    $('#auto-hide-results').prop('checked', options.scanning.autoHideResults); -    $('#deep-dom-scan').prop('checked', options.scanning.deepDomScan); -    $('#enable-search-within-first-popup').prop('checked', options.scanning.enablePopupSearch); -    $('#enable-scanning-of-popup-expressions').prop('checked', options.scanning.enableOnPopupExpressions); -    $('#enable-scanning-on-search-page').prop('checked', options.scanning.enableOnSearchPage); -    $('#enable-search-tags').prop('checked', options.scanning.enableSearchTags); -    $('#scan-delay').val(options.scanning.delay); -    $('#scan-length').val(options.scanning.length); -    $('#scan-modifier-key').val(options.scanning.modifier); -    $('#popup-nesting-max-depth').val(options.scanning.popupNestingMaxDepth); - -    $('#translation-convert-half-width-characters').val(options.translation.convertHalfWidthCharacters); -    $('#translation-convert-numeric-characters').val(options.translation.convertNumericCharacters); -    $('#translation-convert-alphabetic-characters').val(options.translation.convertAlphabeticCharacters); -    $('#translation-convert-hiragana-to-katakana').val(options.translation.convertHiraganaToKatakana); -    $('#translation-convert-katakana-to-hiragana').val(options.translation.convertKatakanaToHiragana); -    $('#translation-collapse-emphatic-sequences').val(options.translation.collapseEmphaticSequences); - -    $('#parsing-scan-enable').prop('checked', options.parsing.enableScanningParser); -    $('#parsing-mecab-enable').prop('checked', options.parsing.enableMecabParser); -    $('#parsing-term-spacing').prop('checked', options.parsing.termSpacing); -    $('#parsing-reading-mode').val(options.parsing.readingMode); - -    $('#anki-enable').prop('checked', options.anki.enable); -    $('#card-tags').val(options.anki.tags.join(' ')); -    $('#sentence-detection-extent').val(options.anki.sentenceExt); -    $('#interface-server').val(options.anki.server); -    $('#duplicate-scope').val(options.anki.duplicateScope); -    $('#screenshot-format').val(options.anki.screenshot.format); -    $('#screenshot-quality').val(options.anki.screenshot.quality); - -    formUpdateVisibility(options); -} - -function formSetupEventListeners() { -    document.querySelector('#enable-clipboard-popups').addEventListener('change', onEnableClipboardPopupsChanged, false); -    $('input, select, textarea').not('.anki-model').not('.ignore-form-changes *').change(onFormOptionsChanged); -} - -function formUpdateVisibility(options) { -    document.documentElement.dataset.optionsAnkiEnable = `${!!options.anki.enable}`; -    document.documentElement.dataset.optionsGeneralDebugInfo = `${!!options.general.debugInfo}`; -    document.documentElement.dataset.optionsGeneralShowAdvanced = `${!!options.general.showAdvanced}`; -    document.documentElement.dataset.optionsGeneralResultOutputMode = `${options.general.resultOutputMode}`; -} - -async function onFormOptionsChanged() { -    const optionsContext = getOptionsContext(); -    const options = await getOptionsMutable(optionsContext); - -    await formRead(options); -    await settingsSaveOptions(); -    formUpdateVisibility(options); -} - -async function onEnableClipboardPopupsChanged(e) { -    const optionsContext = getOptionsContext(); -    const options = await getOptionsMutable(optionsContext); - -    const enableClipboardPopups = e.target.checked; -    if (enableClipboardPopups) { -        options.general.enableClipboardPopups = await new Promise((resolve) => { -            chrome.permissions.request( -                {permissions: ['clipboardRead']}, -                (granted) => { -                    if (!granted) { -                        $('#enable-clipboard-popups').prop('checked', false); -                    } -                    resolve(granted); -                } -            ); -        }); -    } else { -        options.general.enableClipboardPopups = false; -    } - -    await settingsSaveOptions(); -} -  function settingsGetSource() {      return new Promise((resolve) => { @@ -276,7 +87,9 @@ async function onOptionsUpdated({source}) {          ankiController.optionsChanged();      } -    await formWrite(options); +    if (genericSettingController !== null) { +        genericSettingController.optionsChanged(options); +    }  } @@ -314,6 +127,7 @@ async function setupEnvironmentInfo() {  let ankiController = null;  let ankiTemplatesController = null;  let dictionaryController = null; +let genericSettingController = null;  async function onReady() {      api.forwardLogsToBackend(); @@ -329,7 +143,9 @@ async function onReady() {      storageController.prepare();      await settingsPopulateModifierKeys(); -    formSetupEventListeners(); +    genericSettingController = new GenericSettingController(); +    genericSettingController.prepare(); +    new ClipboardPopupsController().prepare();      new PopupPreviewController().prepare();      new AudioController().prepare();      await (new ProfileController()).prepare(); diff --git a/ext/bg/settings.html b/ext/bg/settings.html index 4856b0b4..bab62519 100644 --- a/ext/bg/settings.html +++ b/ext/bg/settings.html @@ -1141,8 +1141,10 @@          <script src="/bg/js/settings/anki-templates.js"></script>          <script src="/bg/js/settings/audio.js"></script>          <script src="/bg/js/settings/backup.js"></script> +        <script src="/bg/js/settings/clipboard-popups-controller.js"></script>          <script src="/bg/js/settings/conditions-ui.js"></script>          <script src="/bg/js/settings/dictionaries.js"></script> +        <script src="/bg/js/settings/generic-setting-controller.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> |