diff options
Diffstat (limited to 'ext/mixed/js')
| -rw-r--r-- | ext/mixed/js/display.js | 54 | 
1 files changed, 51 insertions, 3 deletions
| diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index ed3d9adc..bd4b13d1 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -37,6 +37,8 @@ class Display {          this.eventListenersActive = false;          this.clickScanPrevent = false; +        this.poppedContextHistory = []; +          this.windowScroll = new WindowScroll();          this.setInteractive(true); @@ -55,10 +57,16 @@ class Display {          this.sourceTermView();      } +    onHistoryTermView(e) { +        e.preventDefault(); +        this.poppedTermView(); +    } +      async onKanjiLookup(e) {          try {              e.preventDefault();              if (!this.context) { return; } +            this.poppedContextHistory = [];              const link = e.target;              const context = { @@ -72,6 +80,7 @@ class Display {                          })                      }                  }, +                type: 'kanji',                  sentence: this.context.sentence,                  url: this.context.url              }; @@ -104,6 +113,7 @@ class Display {      async onTermLookup(e, {disableScroll, selectText, disableHistory}={}) {          try {              if (!this.context) { return; } +            this.poppedContextHistory = [];              const termLookupResults = await this.termLookup(e);              if (!termLookupResults) { return; }              const {textSource, definitions} = termLookupResults; @@ -122,6 +132,7 @@ class Display {                          })                      }                  }, +                type: 'terms',                  disableScroll,                  sentence,                  url: this.context.url @@ -207,12 +218,20 @@ class Display {      onWheel(e) {          if (e.altKey) { -            const delta = e.deltaY; -            if (delta !== 0) { -                this.entryScrollIntoView(this.index + (delta > 0 ? 1 : -1), null, true); +            if (e.deltaY !== 0) { +                this.entryScrollIntoView(this.index + (e.deltaY > 0 ? 1 : -1), null, true);                  e.preventDefault();              }          } +        if (e.shiftKey) { +            const delta = e.deltaX || e.deltaY; +            if (delta > 0) { +                this.sourceTermView(); +                e.preventDefault(); +            } else if (delta < 0) { +                this.poppedTermView(); +            } +        }      }      onRuntimeMessage({action, params}, sender, callback) { @@ -293,6 +312,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));              if (this.options.scanning.enablePopupSearch) {                  this.addEventListeners('.glossary-item', 'mouseup', this.onGlossaryMouseUp.bind(this));                  this.addEventListeners('.glossary-item', 'mousedown', this.onGlossaryMouseDown.bind(this)); @@ -342,6 +362,7 @@ class Display {              const params = {                  definitions,                  source: context.source, +                history: this.poppedContextHistory.length > 0,                  addable: options.anki.enable,                  grouped: options.general.resultOutputMode === 'group',                  merged: options.general.resultOutputMode === 'merge', @@ -396,6 +417,7 @@ class Display {              const params = {                  definitions,                  source: context.source, +                history: this.poppedContextHistory.length > 0,                  addable: options.anki.enable,                  debug: options.general.debugInfo              }; @@ -506,10 +528,28 @@ class Display {      sourceTermView() {          if (!this.context || !this.context.source) { return; } +        this.poppedContextHistory.push({ +            type: this.context.type, +            details: { +                definitions: this.definitions, +                context: Object.assign({}, this.context, { +                    index: this.index, +                    scroll: this.windowScroll.y +                }) +            } +        });          const {type, details} = this.context.source;          this.setContent(type, details);      } +    poppedTermView() { +        if (this.poppedContextHistory.length === 0) { return; } +        this.context.index = this.index; +        this.context.scroll = this.windowScroll.y; +        const {type, details} = this.poppedContextHistory.pop(); +        this.setContent(type, details); +    } +      noteTryAdd(mode) {          const button = this.adderButtonFind(this.index, mode);          if (button !== null && !button.classList.contains('disabled')) { @@ -783,6 +823,14 @@ Display.onKeyDownHandlers = {          return false;      }, +    'F': (self, e) => { +        if (e.altKey) { +            self.poppedTermView(); +            return true; +        } +        return false; +    }, +      'E': (self, e) => {          if (e.altKey) {              self.noteTryAdd('term-kanji'); |