From 6184bcb812686f5498ee982ae89da88792b9a880 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Wed, 19 May 2021 20:09:37 -0400 Subject: Selection clear improvements (#1690) * Update selection clear process * Clean up old clearSelection API * Update clear order * Add clear event handling --- ext/js/app/frontend.js | 19 ++++++++++--------- ext/js/display/display.js | 8 +++++++- ext/js/display/query-parser.js | 5 +++++ ext/js/language/text-scanner.js | 11 ++++++----- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/ext/js/app/frontend.js b/ext/js/app/frontend.js index 7913d7d8..e40b400d 100644 --- a/ext/js/app/frontend.js +++ b/ext/js/app/frontend.js @@ -121,7 +121,7 @@ class Frontend { yomichan.on('closePopups', this._onClosePopups.bind(this)); chrome.runtime.onMessage.addListener(this._onRuntimeMessage.bind(this)); - this._textScanner.on('clearSelection', this._onClearSelection.bind(this)); + this._textScanner.on('clear', this._onTextScannerClear.bind(this)); this._textScanner.on('searched', this._onSearched.bind(this)); yomichan.crossFrame.registerHandlers([ @@ -253,13 +253,8 @@ class Frontend { this._updateContentScale(); } - _onClearSelection({passive}) { - this._stopClearSelectionDelayed(); - if (this._popup !== null) { - this._popup.hide(!passive); - this._popup.clearAutoPlayTimer(); - this._isPointerOverPopup = false; - } + _onTextScannerClear() { + this._clearSelection(false); } _onSearched({type, dictionaryEntries, sentence, inputInfo: {eventType, passive, detail}, textSource, optionsContext, detail: {documentTitle}, error}) { @@ -299,7 +294,12 @@ class Frontend { _clearSelection(passive) { this._stopClearSelectionDelayed(); - this._textScanner.clearSelection(passive); + if (this._popup !== null) { + this._popup.clearAutoPlayTimer(); + this._popup.hide(!passive); + this._isPointerOverPopup = false; + } + this._textScanner.clearSelection(); } _clearSelectionDelayed(delay, restart, passive) { @@ -566,6 +566,7 @@ class Frontend { _updateTextScannerEnabled() { const enabled = (this._options !== null && this._options.general.enable && !this._disabledOverride); this._textScanner.setEnabled(enabled); + this._clearSelection(true); } _updateContentScale() { diff --git a/ext/js/display/display.js b/ext/js/display/display.js index fe5b5c9a..bb089047 100644 --- a/ext/js/display/display.js +++ b/ext/js/display/display.js @@ -1771,6 +1771,7 @@ class Display extends EventDispatcher { if (!options.scanning.enablePopupSearch) { if (this._contentTextScanner !== null) { this._contentTextScanner.setEnabled(false); + this._contentTextScanner.clearSelection(); } return; } @@ -1788,6 +1789,7 @@ class Display extends EventDispatcher { this._contentTextScanner.includeSelector = '.click-scannable,.click-scannable *'; this._contentTextScanner.excludeSelector = '.scan-disable,.scan-disable *'; this._contentTextScanner.prepare(); + this._contentTextScanner.on('clear', this._onContentTextScannerClear.bind(this)); this._contentTextScanner.on('searched', this._onContentTextScannerSearched.bind(this)); } @@ -1821,6 +1823,10 @@ class Display extends EventDispatcher { this._contentTextScanner.setEnabled(true); } + _onContentTextScannerClear() { + this._contentTextScanner.clearSelection(); + } + _onContentTextScannerSearched({type, dictionaryEntries, sentence, textSource, optionsContext, error}) { if (error !== null && !yomichan.isExtensionUnloaded) { log.error(error); @@ -1851,7 +1857,7 @@ class Display extends EventDispatcher { contentOrigin: this.getContentOrigin() } }; - this._contentTextScanner.clearSelection(true); + this._contentTextScanner.clearSelection(); this.setContent(details); } diff --git a/ext/js/display/query-parser.js b/ext/js/display/query-parser.js index 8c5ce331..39b09646 100644 --- a/ext/js/display/query-parser.js +++ b/ext/js/display/query-parser.js @@ -47,6 +47,7 @@ class QueryParser extends EventDispatcher { prepare() { this._textScanner.prepare(); + this._textScanner.on('clear', this._onTextScannerClear.bind(this)); this._textScanner.on('searched', this._onSearched.bind(this)); this._queryParserModeSelect.addEventListener('change', this._onParserChange.bind(this), false); } @@ -86,6 +87,10 @@ class QueryParser extends EventDispatcher { // Private + _onTextScannerClear() { + this._textScanner.clearSelection(); + } + _onSearched(e) { const {error} = e; if (error !== null) { diff --git a/ext/js/language/text-scanner.js b/ext/js/language/text-scanner.js index 2ebf26e2..80887b8e 100644 --- a/ext/js/language/text-scanner.js +++ b/ext/js/language/text-scanner.js @@ -139,8 +139,6 @@ class TextScanner extends EventDispatcher { if (value) { this._hookEvents(); - } else { - this.clearSelection(true); } } @@ -259,7 +257,7 @@ class TextScanner extends EventDispatcher { return (this._textSourceCurrent !== null); } - clearSelection(passive) { + clearSelection() { if (!this._canClearSelection) { return; } if (this._textSourceCurrent !== null) { if (this._textSourceCurrentSelected) { @@ -273,7 +271,6 @@ class TextScanner extends EventDispatcher { this._textSourceCurrentSelected = false; this._inputInfoCurrent = null; } - this.trigger('clearSelection', {passive}); } getCurrentTextSource() { @@ -431,7 +428,7 @@ class TextScanner extends EventDispatcher { case 0: // Primary if (this._searchOnClick) { this._resetPreventNextClickScan(); } this._scanTimerClear(); - this.clearSelection(false); + this._triggerClear('mousedown'); break; case 1: // Middle if (this._preventMiddleMouse) { @@ -1105,4 +1102,8 @@ class TextScanner extends EventDispatcher { } } } + + _triggerClear(reason) { + this.trigger('clear', {reason}); + } } -- cgit v1.2.3