diff options
Diffstat (limited to 'ext/mixed/js/display.js')
-rw-r--r-- | ext/mixed/js/display.js | 205 |
1 files changed, 105 insertions, 100 deletions
diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index f02a6e5c..2ab1b871 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -47,18 +47,15 @@ class Display { useCache: true }); this._styleNode = null; - this._eventListeners = new EventListenerCollection(); this._persistentEventListeners = new EventListenerCollection(); this._interactive = false; this._eventListenersActive = false; this._clickScanPrevent = false; this._setContentToken = null; - this._mediaLoader = new MediaLoader(); this._displayGenerator = new DisplayGenerator({mediaLoader: this._mediaLoader}); this._windowScroll = new WindowScroll(); - this._onKeyDownHandlers = new Map([ ['Escape', () => { this.onEscape(); @@ -182,6 +179,111 @@ class Display { throw new Error('Override me'); } + onKeyDown(e) { + const key = DOM.getKeyFromEvent(e); + const handler = this._onKeyDownHandlers.get(key); + if (typeof handler === 'function') { + if (handler(e)) { + e.preventDefault(); + return true; + } + } + return false; + } + + getOptions() { + return this._options; + } + + getOptionsContext() { + return this._optionsContext; + } + + setOptionsContext(optionsContext) { + this._optionsContext = optionsContext; + } + + async updateOptions() { + this._options = await api.optionsGet(this.getOptionsContext()); + this._updateDocumentOptions(this._options); + this._updateTheme(this._options.general.popupTheme); + this.setCustomCss(this._options.general.customPopupCss); + } + + addMultipleEventListeners(selector, type, listener, options) { + for (const node of this._container.querySelectorAll(selector)) { + this._eventListeners.addEventListener(node, type, listener, options); + } + } + + autoPlayAudio() { + if (this._definitions.length === 0) { return; } + + this._audioPlay(this._definitions[0], this._getFirstExpressionIndex(), 0); + } + + async setContent(type, details) { + const token = {}; // Unique identifier token + this._setContentToken = token; + try { + this._mediaLoader.unloadAll(); + + switch (type) { + case 'terms': + await this._setContentTerms(details.definitions, details.context, token); + break; + case 'kanji': + await this._setContentKanji(details.definitions, details.context, token); + break; + case 'extensionUnloaded': + this._setContentExtensionUnloaded(); + break; + } + } catch (e) { + this.onError(e); + } finally { + if (this._setContentToken === token) { + this._setContentToken = null; + } + } + } + + clearContent() { + this._container.textContent = ''; + } + + setCustomCss(css) { + if (this._styleNode === null) { + if (css.length === 0) { return; } + this._styleNode = document.createElement('style'); + } + + this._styleNode.textContent = css; + + const parent = document.head; + if (this._styleNode.parentNode !== parent) { + parent.appendChild(this._styleNode); + } + } + + async getDocumentTitle() { + return document.title; + } + + setSpinnerVisible(visible) { + if (this._spinner !== null) { + this._spinner.hidden = !visible; + } + } + + setOnKeyDownHandlers(handlers) { + for (const [key, handler] of handlers) { + this._onKeyDownHandlers.set(key, handler); + } + } + + // Private + _onSourceTermView(e) { e.preventDefault(); this._sourceTermView(); @@ -335,18 +437,6 @@ class Display { api.noteView(link.dataset.noteId); } - onKeyDown(e) { - const key = DOM.getKeyFromEvent(e); - const handler = this._onKeyDownHandlers.get(key); - if (typeof handler === 'function') { - if (handler(e)) { - e.preventDefault(); - return true; - } - } - return false; - } - _onWheel(e) { if (e.altKey) { if (e.deltaY !== 0) { @@ -372,25 +462,6 @@ class Display { } } - getOptions() { - return this._options; - } - - getOptionsContext() { - return this._optionsContext; - } - - setOptionsContext(optionsContext) { - this._optionsContext = optionsContext; - } - - async updateOptions() { - this._options = await api.optionsGet(this.getOptionsContext()); - this._updateDocumentOptions(this._options); - this._updateTheme(this._options.general.popupTheme); - this.setCustomCss(this._options.general.customPopupCss); - } - _updateDocumentOptions(options) { const data = document.documentElement.dataset; data.ankiEnabled = `${options.anki.enable}`; @@ -407,20 +478,6 @@ class Display { document.documentElement.dataset.yomichanTheme = themeName; } - setCustomCss(css) { - if (this._styleNode === null) { - if (css.length === 0) { return; } - this._styleNode = document.createElement('style'); - } - - this._styleNode.textContent = css; - - const parent = document.head; - if (this._styleNode.parentNode !== parent) { - parent.appendChild(this._styleNode); - } - } - _setInteractive(interactive) { interactive = !!interactive; if (this._interactive === interactive) { return; } @@ -469,38 +526,6 @@ class Display { } } - addMultipleEventListeners(selector, type, listener, options) { - for (const node of this._container.querySelectorAll(selector)) { - this._eventListeners.addEventListener(node, type, listener, options); - } - } - - async setContent(type, details) { - const token = {}; // Unique identifier token - this._setContentToken = token; - try { - this._mediaLoader.unloadAll(); - - switch (type) { - case 'terms': - await this._setContentTerms(details.definitions, details.context, token); - break; - case 'kanji': - await this._setContentKanji(details.definitions, details.context, token); - break; - case 'extensionUnloaded': - this._setContentExtensionUnloaded(); - break; - } - } catch (e) { - this.onError(e); - } finally { - if (this._setContentToken === token) { - this._setContentToken = null; - } - } - } - async _setContentTerms(definitions, context, token) { if (!context) { throw new Error('Context expected'); } @@ -631,10 +656,6 @@ class Display { } } - clearContent() { - this._container.textContent = ''; - } - _updateNavigation(previous, next) { const navigation = document.querySelector('#navigation-header'); if (navigation !== null) { @@ -644,12 +665,6 @@ class Display { } } - autoPlayAudio() { - if (this._definitions.length === 0) { return; } - - this._audioPlay(this._definitions[0], this._getFirstExpressionIndex(), 0); - } - _updateAdderButtons(states) { for (let i = 0; i < states.length; ++i) { let noteId = null; @@ -885,12 +900,6 @@ class Display { return api.broadcastTab('popupSetVisibleOverride', {visible}); } - setSpinnerVisible(visible) { - if (this._spinner !== null) { - this._spinner.hidden = !visible; - } - } - _getEntry(index) { const entries = this._container.querySelectorAll('.entry'); return index >= 0 && index < entries.length ? entries[index] : null; @@ -950,10 +959,6 @@ class Display { } } - async getDocumentTitle() { - return document.title; - } - _indexOf(nodeList, node) { for (let i = 0, ii = nodeList.length; i < ii; ++i) { if (nodeList[i] === node) { |