diff options
-rw-r--r-- | ext/bg/js/options.js | 2 | ||||
-rw-r--r-- | ext/bg/js/util.js | 3 | ||||
-rw-r--r-- | ext/bg/options.html | 13 | ||||
-rw-r--r-- | ext/fg/js/display-frame.js | 22 | ||||
-rw-r--r-- | ext/fg/js/driver.js | 4 | ||||
-rw-r--r-- | ext/manifest.json | 5 | ||||
-rw-r--r-- | ext/mixed/js/display.js | 2 |
7 files changed, 44 insertions, 7 deletions
diff --git a/ext/bg/js/options.js b/ext/bg/js/options.js index 2089cc53..75f39d24 100644 --- a/ext/bg/js/options.js +++ b/ext/bg/js/options.js @@ -26,6 +26,7 @@ function formRead() { const optionsNew = $.extend(true, {}, optionsOld); optionsNew.general.audioPlayback = $('#audio-playback-buttons').prop('checked'); + optionsNew.general.audioVolume = $('#audio-playback-volume').val(); optionsNew.general.groupResults = $('#group-terms-results').prop('checked'); optionsNew.general.softKatakana = $('#soft-katakana-search').prop('checked'); optionsNew.general.showAdvanced = $('#show-advanced-options').prop('checked'); @@ -111,6 +112,7 @@ $(document).ready(() => { optionsLoad().then(options => { $('#audio-playback-buttons').prop('checked', options.general.audioPlayback); + $('#audio-playback-volume').val(options.general.audioVolume); $('#group-terms-results').prop('checked', options.general.groupResults); $('#soft-katakana-search').prop('checked', options.general.softKatakana); $('#show-advanced-options').prop('checked', options.general.showAdvanced); diff --git a/ext/bg/js/util.js b/ext/bg/js/util.js index d1099262..78258c97 100644 --- a/ext/bg/js/util.js +++ b/ext/bg/js/util.js @@ -85,6 +85,7 @@ function optionsSetDefaults(options) { general: { enable: true, audioPlayback: true, + audioVolume: 100, groupResults: true, softKatakana: true, maxResults: 32, @@ -375,7 +376,7 @@ function dictTermsGroup(definitions, dictionaries) { expression: firstDef.expression, reading: firstDef.reading, reasons: firstDef.reasons, - score: groupDefs.reduce((x, y) => x.score > y.score ? x.score : y.score, Number.MIN_SAFE_INTEGER), + score: groupDefs.reduce((p, v) => v.score > p ? v.score : p, Number.MIN_SAFE_INTEGER), source: firstDef.source }); } diff --git a/ext/bg/options.html b/ext/bg/options.html index 3e457d2d..c483c656 100644 --- a/ext/bg/options.html +++ b/ext/bg/options.html @@ -26,10 +26,6 @@ <h3>General Options</h3> <div class="checkbox"> - <label><input type="checkbox" id="audio-playback-buttons"> Audio playback buttons</label> - </div> - - <div class="checkbox"> <label><input type="checkbox" id="group-terms-results"> Group term results</label> </div> @@ -41,6 +37,15 @@ <label><input type="checkbox" id="soft-katakana-search"> Soft Katakana search</label> </div> + <div class="checkbox"> + <label><input type="checkbox" id="audio-playback-buttons"> Audio playback buttons</label> + </div> + + <div class="form-group options-advanced"> + <label for="audio-playback-volume">Audio playback volume (percent)</label> + <input type="number" min="0" max="100" id="audio-playback-volume" class="form-control"> + </div> + <div class="form-group options-advanced"> <label for="max-displayed-results">Maximum displayed results</label> <input type="number" min="1" id="max-displayed-results" class="form-control"> diff --git a/ext/fg/js/display-frame.js b/ext/fg/js/display-frame.js index 59032d0c..9fd09e74 100644 --- a/ext/fg/js/display-frame.js +++ b/ext/fg/js/display-frame.js @@ -51,6 +51,10 @@ window.displayFrame = new class extends Display { window.parent.postMessage('popupClose', '*'); } + selectionCopy() { + window.parent.postMessage('selectionCopy', '*'); + } + showOrphaned() { $('#content').hide(); $('#orphan').show(); @@ -77,4 +81,22 @@ window.displayFrame = new class extends Display { handler(params); } } + + onKeyDown(e) { + const handlers = { + 67: /* c */ () => { + if (e.ctrlKey && window.getSelection().toString() === '') { + this.selectionCopy(); + return true; + } + } + }; + + const handler = handlers[e.keyCode]; + if (handler && handler()) { + e.preventDefault(); + } else { + super.onKeyDown(e); + } + } }; diff --git a/ext/fg/js/driver.js b/ext/fg/js/driver.js index 5191f18d..d4cb1532 100644 --- a/ext/fg/js/driver.js +++ b/ext/fg/js/driver.js @@ -106,6 +106,10 @@ window.driver = new class { const handlers = { popupClose: () => { this.searchClear(); + }, + + selectionCopy: () => { + document.execCommand('copy'); } }; diff --git a/ext/manifest.json b/ext/manifest.json index c3f103ed..480dd176 100644 --- a/ext/manifest.json +++ b/ext/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 2, "name": "Yomichan", - "version": "1.1.9", + "version": "1.1.10", "description": "Japanese dictionary with Anki integration", "icons": {"16": "mixed/img/icon16.png", "48": "mixed/img/icon48.png", "128": "mixed/img/icon128.png"}, @@ -29,7 +29,8 @@ }, "permissions": [ "<all_urls>", - "storage" + "storage", + "clipboardWrite" ], "commands": { "toggle": { diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index 9738319a..36609525 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -343,6 +343,7 @@ class Display { let audio = this.audioCache[url]; if (audio) { audio.currentTime = 0; + audio.volume = this.options.general.audioVolume / 100.0; audio.play(); } else { audio = new Audio(url); @@ -352,6 +353,7 @@ class Display { } this.audioCache[url] = audio; + audio.volume = this.options.general.audioVolume / 100.0; audio.play(); }; } |