Merge pull request #240 from toasted-nutbread/fix-focus

Fix focus
This commit is contained in:
Alex Yatskov 2019-10-05 19:48:21 -07:00 committed by GitHub
commit a4d2bde5df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 38 additions and 39 deletions

View File

@ -145,7 +145,7 @@ class Frontend {
} }
onResize() { onResize() {
this.searchClear(true); this.searchClear(false);
} }
onClick(e) { onClick(e) {
@ -527,8 +527,8 @@ Frontend.runtimeMessageHandlers = {
self.updateOptions(); self.updateOptions();
}, },
popupSetVisible: (self, {visible}) => { popupSetVisibleOverride: (self, {visible}) => {
self.popup.setVisible(visible); self.popup.setVisibleOverride(visible);
} }
}; };

View File

@ -41,7 +41,7 @@ class PopupProxyHost {
show: ({id, elementRect, options}) => this.show(id, elementRect, options), show: ({id, elementRect, options}) => this.show(id, elementRect, options),
showOrphaned: ({id, elementRect, options}) => this.show(id, elementRect, options), showOrphaned: ({id, elementRect, options}) => this.show(id, elementRect, options),
hide: ({id, changeFocus}) => this.hide(id, changeFocus), hide: ({id, changeFocus}) => this.hide(id, changeFocus),
setVisible: ({id, visible}) => this.setVisible(id, visible), setVisibleOverride: ({id, visible}) => this.setVisibleOverride(id, visible),
containsPoint: ({id, x, y}) => this.containsPoint(id, x, y), containsPoint: ({id, x, y}) => this.containsPoint(id, x, y),
termsShow: ({id, elementRect, writingMode, definitions, options, context}) => this.termsShow(id, elementRect, writingMode, definitions, options, context), termsShow: ({id, elementRect, writingMode, definitions, options, context}) => this.termsShow(id, elementRect, writingMode, definitions, options, context),
kanjiShow: ({id, elementRect, writingMode, definitions, options, context}) => this.kanjiShow(id, elementRect, writingMode, definitions, options, context), kanjiShow: ({id, elementRect, writingMode, definitions, options, context}) => this.kanjiShow(id, elementRect, writingMode, definitions, options, context),
@ -103,9 +103,9 @@ class PopupProxyHost {
return popup.hide(changeFocus); return popup.hide(changeFocus);
} }
async setVisible(id, visible) { async setVisibleOverride(id, visible) {
const popup = this.getPopup(id); const popup = this.getPopup(id);
return popup.setVisible(visible); return popup.setVisibleOverride(visible);
} }
async containsPoint(id, x, y) { async containsPoint(id, x, y) {

View File

@ -65,9 +65,9 @@ class PopupProxy {
return await this.invokeHostApi('hide', {id: this.id, changeFocus}); return await this.invokeHostApi('hide', {id: this.id, changeFocus});
} }
async setVisible(visible) { async setVisibleOverride(visible) {
const id = await this.getPopupId(); const id = await this.getPopupId();
return await this.invokeHostApi('setVisible', {id, visible}); return await this.invokeHostApi('setVisibleOverride', {id, visible});
} }
async containsPoint(x, y) { async containsPoint(x, y) {

View File

@ -34,6 +34,9 @@ class Popup {
this.container.style.height = '0px'; this.container.style.height = '0px';
this.injectPromise = null; this.injectPromise = null;
this.isInjected = false; this.isInjected = false;
this.visible = false;
this.visibleOverride = null;
this.updateVisibility();
} }
inject(options) { inject(options) {
@ -105,9 +108,11 @@ class Popup {
container.style.top = `${y}px`; container.style.top = `${y}px`;
container.style.width = `${width}px`; container.style.width = `${width}px`;
container.style.height = `${height}px`; container.style.height = `${height}px`;
container.style.visibility = 'visible';
this.hideChildren(true); this.setVisible(true);
if (this.child !== null) {
this.child.hide(true);
}
} }
static getPositionForHorizontalText(elementRect, width, height, maxWidth, maxHeight, optionsGeneral) { static getPositionForHorizontalText(elementRect, width, height, maxWidth, maxHeight, optionsGeneral) {
@ -209,41 +214,35 @@ class Popup {
} }
hide(changeFocus) { hide(changeFocus) {
if (this.isContainerHidden()) { if (!this.isVisible()) {
changeFocus = false; return;
}
this.setVisible(false);
if (this.child !== null) {
this.child.hide(false);
} }
this.hideChildren(changeFocus);
this.hideContainer();
if (changeFocus) { if (changeFocus) {
this.focusParent(); this.focusParent();
} }
} }
hideChildren(changeFocus) {
// Recursively hides all children.
if (this.child !== null && !this.child.isContainerHidden()) {
this.child.hide(changeFocus);
}
}
hideContainer() {
this.container.style.visibility = 'hidden';
}
isContainerHidden() {
return (this.container.style.visibility === 'hidden');
}
isVisible() { isVisible() {
return this.isInjected && this.container.style.visibility !== 'hidden'; return this.isInjected && (this.visibleOverride !== null ? this.visibleOverride : this.visible);
} }
setVisible(visible) { setVisible(visible) {
if (visible) { this.visible = visible;
this.container.style.setProperty('display', ''); this.updateVisibility();
} else { }
this.container.style.setProperty('display', 'none', 'important');
} setVisibleOverride(visible) {
this.visibleOverride = visible;
this.updateVisibility();
}
updateVisibility() {
this.container.style.setProperty('visibility', this.isVisible() ? 'visible' : 'hidden', 'important');
} }
focusParent() { focusParent() {

View File

@ -445,7 +445,7 @@ class Display {
async getScreenshot() { async getScreenshot() {
try { try {
await this.setPopupVisible(false); await this.setPopupVisibleOverride(false);
await Display.delay(1); // Wait for popup to be hidden. await Display.delay(1); // Wait for popup to be hidden.
const {format, quality} = this.options.anki.screenshot; const {format, quality} = this.options.anki.screenshot;
@ -454,7 +454,7 @@ class Display {
return {dataUrl, format}; return {dataUrl, format};
} finally { } finally {
await this.setPopupVisible(true); await this.setPopupVisibleOverride(null);
} }
} }
@ -462,8 +462,8 @@ class Display {
return this.options.general.resultOutputMode === 'merge' ? 0 : -1; return this.options.general.resultOutputMode === 'merge' ? 0 : -1;
} }
setPopupVisible(visible) { setPopupVisibleOverride(visible) {
return apiForward('popupSetVisible', {visible}); return apiForward('popupSetVisibleOverride', {visible});
} }
setSpinnerVisible(visible) { setSpinnerVisible(visible) {