More scanning options (#815)

* Reorganize options

* Add advanced options

* Add a setting transform 'setRelativeAttribute'

* Add advanced options to HTML/CSS
This commit is contained in:
toasted-nutbread 2020-09-12 13:20:02 -04:00 committed by GitHub
parent 41db9ec89b
commit c98aa9ad47
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 123 additions and 23 deletions

View File

@ -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 {

View File

@ -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
}
}
}
}
}

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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>