Key binds for #26
This commit is contained in:
parent
68654d97e7
commit
115728fb7b
4 changed files with 100 additions and 6 deletions
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue