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;
 | 
			
		||||
 | 
			
		||||
  #lastActiveElement = null;
 | 
			
		||||
 | 
			
		||||
  #mode = AnnotationEditorType.NONE;
 | 
			
		||||
 | 
			
		||||
  #selectedEditors = new Set();
 | 
			
		||||
 | 
			
		||||
  #pageColors = null;
 | 
			
		||||
 | 
			
		||||
  #boundBlur = this.blur.bind(this);
 | 
			
		||||
 | 
			
		||||
  #boundFocus = this.focus.bind(this);
 | 
			
		||||
 | 
			
		||||
  #boundCopy = this.copy.bind(this);
 | 
			
		||||
 | 
			
		||||
  #boundCut = this.cut.bind(this);
 | 
			
		||||
@ -701,6 +707,7 @@ class AnnotationEditorUIManager {
 | 
			
		||||
 | 
			
		||||
  destroy() {
 | 
			
		||||
    this.#removeKeyboardManager();
 | 
			
		||||
    this.#removeFocusManager();
 | 
			
		||||
    this.#eventBus._off("editingaction", this.#boundOnEditingAction);
 | 
			
		||||
    this.#eventBus._off("pagechanging", this.#boundOnPageChanging);
 | 
			
		||||
    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() {
 | 
			
		||||
    // 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.
 | 
			
		||||
@ -967,6 +1018,7 @@ class AnnotationEditorUIManager {
 | 
			
		||||
   */
 | 
			
		||||
  setEditingState(isEditing) {
 | 
			
		||||
    if (isEditing) {
 | 
			
		||||
      this.#addFocusManager();
 | 
			
		||||
      this.#addKeyboardManager();
 | 
			
		||||
      this.#addCopyPasteListeners();
 | 
			
		||||
      this.#dispatchUpdateStates({
 | 
			
		||||
@ -977,6 +1029,7 @@ class AnnotationEditorUIManager {
 | 
			
		||||
        hasSelectedEditor: false,
 | 
			
		||||
      });
 | 
			
		||||
    } else {
 | 
			
		||||
      this.#removeFocusManager();
 | 
			
		||||
      this.#removeKeyboardManager();
 | 
			
		||||
      this.#removeCopyPasteListeners();
 | 
			
		||||
      this.#dispatchUpdateStates({
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user