diff options
-rw-r--r-- | ext/js/display/search-display-controller.js | 55 | ||||
-rw-r--r-- | ext/search.html | 5 |
2 files changed, 60 insertions, 0 deletions
diff --git a/ext/js/display/search-display-controller.js b/ext/js/display/search-display-controller.js index 49c69520..ed2061e2 100644 --- a/ext/js/display/search-display-controller.js +++ b/ext/js/display/search-display-controller.js @@ -115,6 +115,10 @@ export class SearchDisplayController { if (displayOptions !== null) { this._onDisplayOptionsUpdated({options: displayOptions}); } + + const {profiles, profileCurrent} = await this._display.application.api.optionsGetFull(); + + this._updateProfileSelect(profiles, profileCurrent); } /** @@ -314,6 +318,33 @@ export class SearchDisplayController { } /** + * @param {Event} event + */ + async _onProfileSelectChange(event) { + const node = /** @type {HTMLInputElement} */ (event.currentTarget); + const value = parseInt(node.value, 10); + const optionsFull = await this._display.application.api.optionsGetFull(); + if (typeof value === 'number' && Number.isFinite(value) && value >= 0 && value <= optionsFull.profiles.length) { + this._setPrimaryProfileIndex(value); + } + } + + /** + * @param {number} value + */ + async _setPrimaryProfileIndex(value) { + /** @type {import('settings-modifications').ScopedModificationSet} */ + const modification = { + action: 'set', + path: 'profileCurrent', + value, + scope: 'global', + optionsContext: null + }; + await this._display.application.api.modifySettings([modification], 'search'); + } + + /** * @param {boolean} enabled */ _setWanakanaEnabled(enabled) { @@ -546,4 +577,28 @@ export class SearchDisplayController { if (element instanceof HTMLElement && element.isContentEditable) { return true; } return false; } + + /** + * @param {import('settings').Profile[]} profiles + * @param {number} profileCurrent + */ + _updateProfileSelect(profiles, profileCurrent) { + /** @type {HTMLSelectElement} */ + const select = querySelectorNotNull(document, '#profile-select'); + /** @type {HTMLElement} */ + const optionGroup = querySelectorNotNull(document, '#profile-select-option-group'); + const fragment = document.createDocumentFragment(); + for (let i = 0, ii = profiles.length; i < ii; ++i) { + const {name} = profiles[i]; + const option = document.createElement('option'); + option.textContent = name; + option.value = `${i}`; + fragment.appendChild(option); + } + optionGroup.textContent = ''; + optionGroup.appendChild(fragment); + select.value = `${profileCurrent}`; + + select.addEventListener('change', this._onProfileSelectChange.bind(this), false); + } } diff --git a/ext/search.html b/ext/search.html index 8c595cc4..1deadd3c 100644 --- a/ext/search.html +++ b/ext/search.html @@ -47,6 +47,11 @@ <span class="search-option-pre-label">Parser:</span> <select id="query-parser-mode-select"></select> </div> + <div class="search-option" id="search-option-profile-select"> + <span class="profile-select-container"><select class="profile-select" id="profile-select"> + <optgroup label="Primary Profile" id="profile-select-option-group"></optgroup> + </select></span> + </div> </div> <div class="search-textbox-container"> <textarea id="search-textbox" class="scrollbar" placeholder="Input a term, expression, sentence, or block of text" autocomplete="off" lang="ja" autofocus></textarea> |