Merge pull request #16812 from calixteman/editor_dont_lose_selection_on_bluring
[Editor] Avoid to unselect some editors when the main window is focused
This commit is contained in:
commit
1447049513
@ -544,12 +544,18 @@ class AnnotationEditorUIManager {
|
|||||||
|
|
||||||
#isEnabled = false;
|
#isEnabled = false;
|
||||||
|
|
||||||
|
#lastActiveElement = null;
|
||||||
|
|
||||||
#mode = AnnotationEditorType.NONE;
|
#mode = AnnotationEditorType.NONE;
|
||||||
|
|
||||||
#selectedEditors = new Set();
|
#selectedEditors = new Set();
|
||||||
|
|
||||||
#pageColors = null;
|
#pageColors = null;
|
||||||
|
|
||||||
|
#boundBlur = this.blur.bind(this);
|
||||||
|
|
||||||
|
#boundFocus = this.focus.bind(this);
|
||||||
|
|
||||||
#boundCopy = this.copy.bind(this);
|
#boundCopy = this.copy.bind(this);
|
||||||
|
|
||||||
#boundCut = this.cut.bind(this);
|
#boundCut = this.cut.bind(this);
|
||||||
@ -701,6 +707,7 @@ class AnnotationEditorUIManager {
|
|||||||
|
|
||||||
destroy() {
|
destroy() {
|
||||||
this.#removeKeyboardManager();
|
this.#removeKeyboardManager();
|
||||||
|
this.#removeFocusManager();
|
||||||
this.#eventBus._off("editingaction", this.#boundOnEditingAction);
|
this.#eventBus._off("editingaction", this.#boundOnEditingAction);
|
||||||
this.#eventBus._off("pagechanging", this.#boundOnPageChanging);
|
this.#eventBus._off("pagechanging", this.#boundOnPageChanging);
|
||||||
this.#eventBus._off("scalechanging", this.#boundOnScaleChanging);
|
this.#eventBus._off("scalechanging", this.#boundOnScaleChanging);
|
||||||
@ -796,6 +803,50 @@ class AnnotationEditorUIManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#addFocusManager() {
|
||||||
|
window.addEventListener("focus", this.#boundFocus);
|
||||||
|
window.addEventListener("blur", this.#boundBlur);
|
||||||
|
}
|
||||||
|
|
||||||
|
#removeFocusManager() {
|
||||||
|
window.removeEventListener("focus", this.#boundFocus);
|
||||||
|
window.removeEventListener("blur", this.#boundBlur);
|
||||||
|
}
|
||||||
|
|
||||||
|
blur() {
|
||||||
|
if (!this.hasSelection) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// When several editors are selected and the window loses focus, we want to
|
||||||
|
// keep the last active element in order to be able to focus it again when
|
||||||
|
// the window gets the focus back but we don't want to trigger any focus
|
||||||
|
// callbacks else only one editor will be selected.
|
||||||
|
const { activeElement } = document;
|
||||||
|
for (const editor of this.#selectedEditors) {
|
||||||
|
if (editor.div.contains(activeElement)) {
|
||||||
|
this.#lastActiveElement = [editor, activeElement];
|
||||||
|
editor._focusEventsAllowed = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
focus() {
|
||||||
|
if (!this.#lastActiveElement) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const [lastEditor, lastActiveElement] = this.#lastActiveElement;
|
||||||
|
this.#lastActiveElement = null;
|
||||||
|
lastActiveElement.addEventListener(
|
||||||
|
"focusin",
|
||||||
|
() => {
|
||||||
|
lastEditor._focusEventsAllowed = true;
|
||||||
|
},
|
||||||
|
{ once: true }
|
||||||
|
);
|
||||||
|
lastActiveElement.focus();
|
||||||
|
}
|
||||||
|
|
||||||
#addKeyboardManager() {
|
#addKeyboardManager() {
|
||||||
// The keyboard events are caught at the container level in order to be able
|
// The keyboard events are caught at the container level in order to be able
|
||||||
// to execute some callbacks even if the current page doesn't have focus.
|
// to execute some callbacks even if the current page doesn't have focus.
|
||||||
@ -967,6 +1018,7 @@ class AnnotationEditorUIManager {
|
|||||||
*/
|
*/
|
||||||
setEditingState(isEditing) {
|
setEditingState(isEditing) {
|
||||||
if (isEditing) {
|
if (isEditing) {
|
||||||
|
this.#addFocusManager();
|
||||||
this.#addKeyboardManager();
|
this.#addKeyboardManager();
|
||||||
this.#addCopyPasteListeners();
|
this.#addCopyPasteListeners();
|
||||||
this.#dispatchUpdateStates({
|
this.#dispatchUpdateStates({
|
||||||
@ -977,6 +1029,7 @@ class AnnotationEditorUIManager {
|
|||||||
hasSelectedEditor: false,
|
hasSelectedEditor: false,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
|
this.#removeFocusManager();
|
||||||
this.#removeKeyboardManager();
|
this.#removeKeyboardManager();
|
||||||
this.#removeCopyPasteListeners();
|
this.#removeCopyPasteListeners();
|
||||||
this.#dispatchUpdateStates({
|
this.#dispatchUpdateStates({
|
||||||
|
Loading…
x
Reference in New Issue
Block a user