summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/bg/js/options.js2
-rw-r--r--ext/bg/js/util.js3
-rw-r--r--ext/bg/options.html13
-rw-r--r--ext/fg/js/display-frame.js22
-rw-r--r--ext/fg/js/driver.js4
-rw-r--r--ext/manifest.json5
-rw-r--r--ext/mixed/js/display.js2
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();
};
}