fix: note flickering and multiple selection staying enabled after browser shortcut
This commit is contained in:
@@ -37,17 +37,20 @@ export class IOService {
|
|||||||
constructor(private isMac: boolean) {
|
constructor(private isMac: boolean) {
|
||||||
window.addEventListener('keydown', this.handleKeyDown);
|
window.addEventListener('keydown', this.handleKeyDown);
|
||||||
window.addEventListener('keyup', this.handleKeyUp);
|
window.addEventListener('keyup', this.handleKeyUp);
|
||||||
|
window.addEventListener('blur', this.handleWindowBlur);
|
||||||
}
|
}
|
||||||
|
|
||||||
public deinit() {
|
public deinit() {
|
||||||
this.observers.length = 0;
|
this.observers.length = 0;
|
||||||
window.removeEventListener('keydown', this.handleKeyDown);
|
window.removeEventListener('keydown', this.handleKeyDown);
|
||||||
window.removeEventListener('keyup', this.handleKeyUp);
|
window.removeEventListener('keyup', this.handleKeyUp);
|
||||||
|
window.removeEventListener('blur', this.handleWindowBlur);
|
||||||
(this.handleKeyDown as unknown) = undefined;
|
(this.handleKeyDown as unknown) = undefined;
|
||||||
(this.handleKeyUp as unknown) = undefined;
|
(this.handleKeyUp as unknown) = undefined;
|
||||||
|
(this.handleWindowBlur as unknown) = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
handleKeyDown = (event: KeyboardEvent) => {
|
handleKeyDown = (event: KeyboardEvent): void => {
|
||||||
for (const modifier of this.modifiersForEvent(event)) {
|
for (const modifier of this.modifiersForEvent(event)) {
|
||||||
switch (modifier) {
|
switch (modifier) {
|
||||||
case KeyboardModifier.Meta: {
|
case KeyboardModifier.Meta: {
|
||||||
@@ -71,14 +74,20 @@ export class IOService {
|
|||||||
this.notifyObserver(event, KeyboardKeyEvent.Down);
|
this.notifyObserver(event, KeyboardKeyEvent.Down);
|
||||||
};
|
};
|
||||||
|
|
||||||
handleKeyUp = (event: KeyboardEvent) => {
|
handleKeyUp = (event: KeyboardEvent): void => {
|
||||||
for (const modifier of this.modifiersForEvent(event)) {
|
for (const modifier of this.modifiersForEvent(event)) {
|
||||||
this.activeModifiers.delete(modifier);
|
this.activeModifiers.delete(modifier);
|
||||||
}
|
}
|
||||||
this.notifyObserver(event, KeyboardKeyEvent.Up);
|
this.notifyObserver(event, KeyboardKeyEvent.Up);
|
||||||
};
|
};
|
||||||
|
|
||||||
modifiersForEvent(event: KeyboardEvent) {
|
handleWindowBlur = (): void => {
|
||||||
|
for (const modifier of this.activeModifiers) {
|
||||||
|
this.activeModifiers.delete(modifier);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
modifiersForEvent(event: KeyboardEvent): KeyboardModifier[] {
|
||||||
const allModifiers = Object.values(KeyboardModifier);
|
const allModifiers = Object.values(KeyboardModifier);
|
||||||
const eventModifiers = allModifiers.filter((modifier) => {
|
const eventModifiers = allModifiers.filter((modifier) => {
|
||||||
// For a modifier like ctrlKey, must check both event.ctrlKey and event.key.
|
// For a modifier like ctrlKey, must check both event.ctrlKey and event.key.
|
||||||
@@ -103,7 +112,7 @@ export class IOService {
|
|||||||
event: KeyboardEvent,
|
event: KeyboardEvent,
|
||||||
key: KeyboardKey | string,
|
key: KeyboardKey | string,
|
||||||
modifiers: KeyboardModifier[] = []
|
modifiers: KeyboardModifier[] = []
|
||||||
) {
|
): boolean {
|
||||||
const eventModifiers = this.modifiersForEvent(event);
|
const eventModifiers = this.modifiersForEvent(event);
|
||||||
if (eventModifiers.length !== modifiers.length) {
|
if (eventModifiers.length !== modifiers.length) {
|
||||||
return false;
|
return false;
|
||||||
@@ -122,7 +131,7 @@ export class IOService {
|
|||||||
return key.toLowerCase() === event.key.toLowerCase();
|
return key.toLowerCase() === event.key.toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
notifyObserver(event: KeyboardEvent, keyEvent: KeyboardKeyEvent) {
|
notifyObserver(event: KeyboardEvent, keyEvent: KeyboardKeyEvent): void {
|
||||||
const target = event.target as HTMLElement;
|
const target = event.target as HTMLElement;
|
||||||
for (const observer of this.observers) {
|
for (const observer of this.observers) {
|
||||||
if (observer.element && event.target !== observer.element) {
|
if (observer.element && event.target !== observer.element) {
|
||||||
@@ -162,7 +171,7 @@ export class IOService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addKeyObserver(observer: KeyboardObserver) {
|
addKeyObserver(observer: KeyboardObserver): () => void {
|
||||||
this.observers.push(observer);
|
this.observers.push(observer);
|
||||||
return () => {
|
return () => {
|
||||||
removeFromArray(this.observers, observer);
|
removeFromArray(this.observers, observer);
|
||||||
|
|||||||
@@ -278,7 +278,7 @@ class NotesViewCtrl extends PureViewCtrl<unknown, NotesCtrlState> {
|
|||||||
const discarded = activeNote.deleted || activeNote.trashed;
|
const discarded = activeNote.deleted || activeNote.trashed;
|
||||||
if (discarded && !this.appState?.selectedTag?.isTrashTag) {
|
if (discarded && !this.appState?.selectedTag?.isTrashTag) {
|
||||||
this.selectNextOrCreateNew();
|
this.selectNextOrCreateNew();
|
||||||
} else {
|
} else if (!this.state.selectedNotes[activeNote.uuid]) {
|
||||||
this.selectNote(activeNote);
|
this.selectNote(activeNote);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user