diff options
author | siikamiika <siikamiika@users.noreply.github.com> | 2019-11-30 04:49:37 +0200 |
---|---|---|
committer | siikamiika <siikamiika@users.noreply.github.com> | 2019-11-30 04:49:37 +0200 |
commit | ff9510356e61f9548c5c773ac0f9d85f153ad714 (patch) | |
tree | d87ec3631b33103cb0baa1143f1128df832f8236 /ext/mixed/js/display.js | |
parent | e3d96eb67de7ac5066c286511d0d15baa46f9610 (diff) |
rewrite history as a doubly linked list
Diffstat (limited to 'ext/mixed/js/display.js')
-rw-r--r-- | ext/mixed/js/display.js | 85 |
1 files changed, 47 insertions, 38 deletions
diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index dc8766b4..86780764 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -37,8 +37,6 @@ class Display { this.eventListenersActive = false; this.clickScanPrevent = false; - this.poppedContextHistory = []; - this.windowScroll = new WindowScroll(); this.setInteractive(true); @@ -57,31 +55,32 @@ class Display { this.sourceTermView(); } - onHistoryTermView(e) { + onNextTermView(e) { e.preventDefault(); - this.poppedTermView(); + this.nextTermView(); } async onKanjiLookup(e) { try { e.preventDefault(); if (!this.context) { return; } - this.poppedContextHistory = []; + this.context.details.context.next = null; const link = e.target; + const {type, details} = this.context; const context = { source: { - type: 'terms', + type, details: { definitions: this.definitions, - context: Object.assign({}, this.context, { + context: Object.assign({}, details.context, { index: this.entryIndexFind(link), scroll: this.windowScroll.y }) } }, - sentence: this.context.sentence, - url: this.context.url + sentence: details.context.sentence, + url: details.context.url }; this.windowScroll.toY(0); @@ -112,7 +111,7 @@ class Display { async onTermLookup(e, {disableScroll, selectText, disableHistory}={}) { try { if (!this.context) { return; } - this.poppedContextHistory = []; + this.context.details.context.next = null; const termLookupResults = await this.termLookup(e); if (!termLookupResults) { return; } const {textSource, definitions} = termLookupResults; @@ -120,12 +119,13 @@ class Display { const scannedElement = e.target; const sentence = docSentenceExtract(textSource, this.options.anki.sentenceExt); + const {type, details} = this.context; const context = { - source: disableHistory ? this.context.source : { - type: 'terms', + source: disableHistory ? details.context.source : { + type, details: { definitions: this.definitions, - context: Object.assign({}, this.context, { + context: Object.assign({}, details.context, { index: this.entryIndexFind(scannedElement), scroll: this.windowScroll.y }) @@ -133,7 +133,7 @@ class Display { }, disableScroll, sentence, - url: this.context.url + url: details.context.url }; this.setContentTerms(definitions, context); @@ -226,7 +226,7 @@ class Display { this.sourceTermView(); e.preventDefault(); } else if (delta < 0) { - this.poppedTermView(); + this.nextTermView(); e.preventDefault(); } } @@ -310,7 +310,7 @@ class Display { this.addEventListeners('.action-play-audio', 'click', this.onAudioPlay.bind(this)); this.addEventListeners('.kanji-link', 'click', this.onKanjiLookup.bind(this)); this.addEventListeners('.source-term', 'click', this.onSourceTermView.bind(this)); - this.addEventListeners('.history-term', 'click', this.onHistoryTermView.bind(this)); + this.addEventListeners('.next-term', 'click', this.onNextTermView.bind(this)); if (this.options.scanning.enablePopupSearch) { this.addEventListeners('.glossary-item', 'mouseup', this.onGlossaryMouseUp.bind(this)); this.addEventListeners('.glossary-item', 'mousedown', this.onGlossaryMouseDown.bind(this)); @@ -351,7 +351,9 @@ class Display { if (context.clearHistoryOnce) { delete context.clearHistoryOnce; - this.poppedContextHistory = []; + if (this.context !== null) { + this.context.details.context.next = null; + } } if (context.focus !== false) { @@ -359,14 +361,16 @@ class Display { } this.definitions = definitions; - context.type = 'terms'; - this.context = context; + this.context = { + type: 'terms', + details: {definitions, context} + }; const sequence = ++this.sequence; const params = { definitions, source: context.source, - history: this.poppedContextHistory.length > 0, + next: context.next, addable: options.anki.enable, grouped: options.general.resultOutputMode === 'group', merged: options.general.resultOutputMode === 'merge', @@ -412,7 +416,9 @@ class Display { if (context.clearHistoryOnce) { delete context.clearHistoryOnce; - this.poppedContextHistory = []; + if (this.context !== null) { + this.context.details.context.next = null; + } } if (context.focus !== false) { @@ -420,14 +426,16 @@ class Display { } this.definitions = definitions; - context.type = 'kanji'; - this.context = context; + this.context = { + type: 'kanji', + details: {definitions, context} + }; const sequence = ++this.sequence; const params = { definitions, source: context.source, - history: this.poppedContextHistory.length > 0, + next: context.next, addable: options.anki.enable, debug: options.general.debugInfo }; @@ -537,27 +545,28 @@ class Display { } sourceTermView() { - if (!this.context || !this.context.source) { return; } - this.poppedContextHistory.push({ - type: this.context.type, + if (!this.context || !this.context.details.context.source) { return; } + const {type, details} = this.context; + const sourceContext = details.context.source; + sourceContext.details.context.next = { + type, details: { definitions: this.definitions, - context: Object.assign({}, this.context, { + context: Object.assign({}, details.context, { index: this.index, scroll: this.windowScroll.y }) } - }); - const {details} = this.context.source; - this.setContent(details.context.type, details); + }; + this.setContent(sourceContext.type, sourceContext.details); } - poppedTermView() { - if (this.poppedContextHistory.length === 0) { return; } - this.context.index = this.index; - this.context.scroll = this.windowScroll.y; - const {details} = this.poppedContextHistory.pop(); - this.setContent(details.context.type, details); + nextTermView() { + if (!this.context.details.context.next) { return; } + this.context.details.context.index = this.index; + this.context.details.context.scroll = this.windowScroll.y; + const {type, details} = this.context.details.context.next; + this.setContent(type, details); } noteTryAdd(mode) { @@ -835,7 +844,7 @@ Display.onKeyDownHandlers = { 'F': (self, e) => { if (e.altKey) { - self.poppedTermView(); + self.nextTermView(); return true; } return false; |