aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/bg/css/settings.css39
-rw-r--r--ext/bg/data/options-schema.json30
-rw-r--r--ext/bg/js/options.js15
-rw-r--r--ext/bg/js/settings/generic-setting-controller.js27
-rw-r--r--ext/bg/js/settings/scan-inputs-controller.js14
-rw-r--r--ext/bg/settings.html21
6 files changed, 123 insertions, 23 deletions
diff --git a/ext/bg/css/settings.css b/ext/bg/css/settings.css
index a66a0455..17bb4ac0 100644
--- a/ext/bg/css/settings.css
+++ b/ext/bg/css/settings.css
@@ -138,9 +138,6 @@ html:root:not([data-options-general-result-output-mode=merge]) #dict-main-group
width: 100%;
margin-bottom: 8px;
}
-.scan-input-index-cell {
- grid-area: 1/1/4/1;
-}
.scan-input-index {
height: 100%;
width: 40px;
@@ -185,6 +182,9 @@ html:root:not([data-options-general-result-output-mode=merge]) #dict-main-group
.scan-input-prefix-cell[data-property=types] {
grid-area: 3/2/3/2;
}
+.scan-input-prefix-cell[data-property=options] {
+ grid-area: 4/2/4/2;
+}
.scan-input-content-cell[data-property=include] {
grid-area: 1/3/1/3;
}
@@ -194,9 +194,15 @@ html:root:not([data-options-general-result-output-mode=merge]) #dict-main-group
.scan-input-content-cell[data-property=types] {
grid-area: 3/3/3/3;
}
+.scan-input-content-cell[data-property=options] {
+ grid-area: 4/3/4/3;
+}
.scan-input-suffix-cell {
grid-area: 1/4/1/4;
}
+.scan-input-index-cell {
+ grid-area: 1/1/5/1;
+}
.scan-input-suffix-cell>button {
height: 100%;
}
@@ -221,24 +227,33 @@ html:root:not([data-options-general-result-output-mode=merge]) #dict-main-group
padding-top: 5px;
padding-bottom: 5px;
}
+.scan-input-toggle {
+ font-weight: normal;
+ margin: 0;
+}
+.scan-input-toggle>input[type=checkbox] {
+ margin: 0 0.375em 0 0;
+ padding: 0;
+ vertical-align: middle;
+}
+.scan-input-toggle>span {
+ vertical-align: middle;
+}
.scan-input-type-list {
display: flex;
flex-flow: row wrap;
margin-left: -1em;
}
.scan-input-type {
- font-weight: normal;
- margin: 0;
- white-space: nowrap;
margin-left: 1em;
+ white-space: nowrap;
}
-.scan-input-type>input[type=checkbox] {
- margin: 0 0.375em 0 0;
- padding: 0;
- vertical-align: middle;
+.scan-input:not([data-show-advanced=true]) .scan-input-prefix-cell[data-property=options],
+.scan-input:not([data-show-advanced=true]) .scan-input-content-cell[data-property=options] {
+ display: none;
}
-.scan-input-type>span {
- vertical-align: middle;
+.scan-input[data-show-advanced=true] .scan-input-content-cell[data-property=types] .scan-input-input-cell-inner>.scan-input-type-list-container {
+ border-bottom-right-radius: 0;
}
.generic-input-list {
diff --git a/ext/bg/data/options-schema.json b/ext/bg/data/options-schema.json
index e9677e95..9cc8837d 100644
--- a/ext/bg/data/options-schema.json
+++ b/ext/bg/data/options-schema.json
@@ -362,7 +362,8 @@
"required": [
"include",
"exclude",
- "types"
+ "types",
+ "options"
],
"properties": {
"include": {
@@ -394,6 +395,33 @@
"default": true
}
}
+ },
+ "options": {
+ "type": "object",
+ "required": [
+ "showAdvanced",
+ "scanOnPenHover",
+ "scanOnPenPress",
+ "scanOnPenRelease"
+ ],
+ "properties": {
+ "showAdvanced": {
+ "type": "boolean",
+ "default": false
+ },
+ "scanOnPenHover": {
+ "type": "boolean",
+ "default": true
+ },
+ "scanOnPenPress": {
+ "type": "boolean",
+ "default": true
+ },
+ "scanOnPenRelease": {
+ "type": "boolean",
+ "default": false
+ }
+ }
}
}
}
diff --git a/ext/bg/js/options.js b/ext/bg/js/options.js
index d3220194..3470da58 100644
--- a/ext/bg/js/options.js
+++ b/ext/bg/js/options.js
@@ -517,6 +517,12 @@ class OptionsUtil {
}
}
}
+ const createInputDefaultOptions = () => ({
+ showAdvanced: false,
+ scanOnPenHover: true,
+ scanOnPenPress: true,
+ scanOnPenRelease: false
+ });
for (const {options: profileOptions} of options.profiles) {
profileOptions.general.usePopupWindow = false;
profileOptions.scanning.hideDelay = 0;
@@ -538,20 +544,23 @@ class OptionsUtil {
scanningInputs.push({
include: modifierInput,
exclude: '',
- types: {mouse: true, touch: false, pen: false}
+ types: {mouse: true, touch: false, pen: false},
+ options: createInputDefaultOptions()
});
if (middleMouse) {
scanningInputs.push({
include: 'mouse2',
exclude: '',
- types: {mouse: true, touch: false, pen: false}
+ types: {mouse: true, touch: false, pen: false},
+ options: createInputDefaultOptions()
});
}
if (touchInputEnabled) {
scanningInputs.push({
include: '',
exclude: '',
- types: {mouse: false, touch: true, pen: true}
+ types: {mouse: false, touch: true, pen: true},
+ options: createInputDefaultOptions()
});
}
profileOptions.scanning.inputs = scanningInputs;
diff --git a/ext/bg/js/settings/generic-setting-controller.js b/ext/bg/js/settings/generic-setting-controller.js
index bdea8e3d..de218816 100644
--- a/ext/bg/js/settings/generic-setting-controller.js
+++ b/ext/bg/js/settings/generic-setting-controller.js
@@ -32,6 +32,7 @@ class GenericSettingController {
});
this._transforms = new Map([
['setDocumentAttribute', this._setDocumentAttribute.bind(this)],
+ ['setRelativeAttribute', this._setRelativeAttribute.bind(this)],
['splitTags', this._splitTags.bind(this)],
['joinTags', this._joinTags.bind(this)]
]);
@@ -122,6 +123,20 @@ class GenericSettingController {
return value;
}
+ _setRelativeAttribute(value, metadata, element) {
+ const {ancestorDistance, relativeSelector, relativeAttribute} = element.dataset;
+ let relativeElement = this._getAncestor(element, ancestorDistance);
+ if (relativeElement !== null) {
+ if (typeof relativeSelector === 'string') {
+ relativeElement = relativeElement.querySelector(relativeSelector);
+ }
+ if (relativeElement !== null) {
+ relativeElement.setAttribute(relativeAttribute, `${value}`);
+ }
+ }
+ return value;
+ }
+
_splitTags(value) {
return `${value}`.split(/[,; ]+/).filter((v) => !!v);
}
@@ -129,4 +144,16 @@ class GenericSettingController {
_joinTags(value) {
return value.join(' ');
}
+
+ _getAncestor(node, ancestorDistance) {
+ if (typeof ancestorDistance === 'string') {
+ const ii = Number.parseInt(ancestorDistance, 10);
+ if (Number.isFinite(ii)) {
+ for (let i = 0; i < ii && node !== null; ++i) {
+ node = node.parentNode;
+ }
+ }
+ }
+ return node;
+ }
}
diff --git a/ext/bg/js/settings/scan-inputs-controller.js b/ext/bg/js/settings/scan-inputs-controller.js
index 5895ccea..09decaf3 100644
--- a/ext/bg/js/settings/scan-inputs-controller.js
+++ b/ext/bg/js/settings/scan-inputs-controller.js
@@ -96,7 +96,13 @@ class ScanInputsController {
items: [{
include,
exclude,
- types: {mouse: true, touch: false, pen: false}
+ types: {mouse: true, touch: false, pen: false},
+ options: {
+ showAdvanced: false,
+ scanOnPenHover: true,
+ scanOnPenPress: true,
+ scanOnPenRelease: false
+ }
}]
}]);
}
@@ -148,9 +154,9 @@ class ScanInputField {
this._eventListeners.on(this._excludeInputField, 'change', this._onExcludeValueChange.bind(this));
this._eventListeners.addEventListener(removeButton, 'click', this._onRemoveClick.bind(this));
- for (const typeCheckbox of node.querySelectorAll('.scan-input-type-checkbox')) {
+ for (const typeCheckbox of node.querySelectorAll('.scan-input-settings-checkbox')) {
const {property} = typeCheckbox.dataset;
- typeCheckbox.dataset.setting = `scanning.inputs[${this._index}].types.${property}`;
+ typeCheckbox.dataset.setting = `scanning.inputs[${this._index}].${property}`;
}
}
@@ -188,7 +194,7 @@ class ScanInputField {
_isPointerTypeSupported(pointerType) {
if (this._node === null) { return false; }
- const node = this._node.querySelector(`input.scan-input-type-checkbox[data-type=${pointerType}]`);
+ const node = this._node.querySelector(`input.scan-input-settings-checkbox[data-property="types.${pointerType}"]`);
return node !== null && node.checked;
}
}
diff --git a/ext/bg/settings.html b/ext/bg/settings.html
index e934a92c..cc6f93e0 100644
--- a/ext/bg/settings.html
+++ b/ext/bg/settings.html
@@ -453,9 +453,24 @@
<div class="scan-input-prefix-cell" data-property="types"><div class="scan-input-prefix">Types</div></div>
<div class="scan-input-content-cell" data-property="types"><div class="scan-input-input-cell-inner">
<div class="scan-input-type-list-container form-control"><div class="scan-input-type-list">
- <label class="scan-input-type"><input type="checkbox" class="scan-input-type-checkbox" data-property="mouse"><span>Mouse</span></label>
- <label class="scan-input-type"><input type="checkbox" class="scan-input-type-checkbox" data-property="touch"><span>Touch</span></label>
- <label class="scan-input-type"><input type="checkbox" class="scan-input-type-checkbox" data-property="pen"><span>Pen</span></label>
+ <label class="scan-input-toggle scan-input-type"><input type="checkbox" class="scan-input-settings-checkbox" data-property="types.mouse"><span>Mouse</span></label>
+ <label class="scan-input-toggle scan-input-type"><input type="checkbox" class="scan-input-settings-checkbox" data-property="types.touch"><span>Touch</span></label>
+ <label class="scan-input-toggle scan-input-type"><input type="checkbox" class="scan-input-settings-checkbox" data-property="types.pen"><span>Pen</span></label>
+ <label class="scan-input-toggle scan-input-type"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.showAdvanced"
+ data-transform-pre="setRelativeAttribute"
+ data-transform-post="setRelativeAttribute"
+ data-ancestor-distance="7"
+ data-relative-attribute="data-show-advanced"
+ ><span>Advanced</span></label>
+ </div></div>
+ </div></div>
+
+ <div class="scan-input-prefix-cell" data-property="options"><div class="scan-input-prefix">Options</div></div>
+ <div class="scan-input-content-cell" data-property="options"><div class="scan-input-input-cell-inner">
+ <div class="scan-input-type-list-container form-control"><div>
+ <div><label class="scan-input-toggle"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnPenHover"><span>Scan on pen hover</span></label></div>
+ <div><label class="scan-input-toggle"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnPenPress"><span>Scan on pen press</span></label></div>
+ <div><label class="scan-input-toggle"><input type="checkbox" class="scan-input-settings-checkbox" data-property="options.scanOnPenRelease"><span>Scan on pen release</span></label></div>
</div></div>
</div></div>
</div>