Key binds for #26

This commit is contained in:
mProjectsCode 2022-06-14 17:47:36 +02:00
parent 68654d97e7
commit 115728fb7b
4 changed files with 100 additions and 6 deletions

View file

@ -1,5 +1,6 @@
import {App, Modal, Setting} from 'obsidian';
import {SelectModalElement} from './SelectModalElement';
import {mod} from '../utils/Utils';
export abstract class SelectModal<T> extends Modal {
allowMultiSelect: boolean;
@ -22,6 +23,17 @@ export abstract class SelectModal<T> extends Modal {
this.elements = elements;
this.selectModalElements = [];
this.scope.register([], 'ArrowUp', () => {
this.highlightUp();
});
this.scope.register([], 'ArrowDown', () => {
this.highlightDown();
});
this.scope.register([], 'ArrowRight', () => {
this.activateHighlighted();
});
this.scope.register([], 'Enter', () => this.submit());
}
abstract renderElement(value: T, el: HTMLElement): any;
@ -38,6 +50,14 @@ export abstract class SelectModal<T> extends Modal {
}
}
deHighlightAllOtherElements(elementId: number) {
for (const selectModalElement of this.selectModalElements) {
if (selectModalElement.id !== elementId) {
selectModalElement.setHighlighted(false);
}
}
}
async onOpen() {
const {contentEl} = this;
@ -72,4 +92,54 @@ export abstract class SelectModal<T> extends Modal {
}
bottomSetting.addButton(btn => btn.setButtonText('Ok').setCta().onClick(() => this.submit()));
}
activateHighlighted() {
for (const selectModalElement of this.selectModalElements) {
if (selectModalElement.isHighlighted()) {
selectModalElement.setActive(!selectModalElement.isActive());
if (!this.allowMultiSelect) {
this.disableAllOtherElements(selectModalElement.id);
}
}
}
}
highlightUp() {
for (const selectModalElement of this.selectModalElements) {
if (selectModalElement.isHighlighted()) {
this.getPreviousSelectModalElement(selectModalElement).setHighlighted(true);
return;
}
}
// nothing is highlighted
this.selectModalElements.last().setHighlighted(true);
}
highlightDown() {
for (const selectModalElement of this.selectModalElements) {
if (selectModalElement.isHighlighted()) {
this.getNextSelectModalElement(selectModalElement).setHighlighted(true);
return;
}
}
// nothing is highlighted
this.selectModalElements.first().setHighlighted(true);
}
private getNextSelectModalElement(selectModalElement: SelectModalElement<T>): SelectModalElement<T> {
let nextId = selectModalElement.id + 1;
nextId = mod(nextId, this.selectModalElements.length);
return this.selectModalElements.filter(x => x.id === nextId).first();
}
private getPreviousSelectModalElement(selectModalElement: SelectModalElement<T>): SelectModalElement<T> {
let nextId = selectModalElement.id - 1;
nextId = mod(nextId, this.selectModalElements.length);
return this.selectModalElements.filter(x => x.id === nextId).first();
}
}