@launchmenu/core
Version:
An environment for visual keyboard controlled applets
130 lines • 9.07 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AbstractMenu = void 0;
const model_react_1 = require("model-react");
const isItemSelectable_1 = require("../items/isItemSelectable");
const onMenuChangAction_1 = require("../../actions/types/onMenuChange/onMenuChangAction");
const onCursorAction_1 = require("../../actions/types/onCursor/onCursorAction");
const onSelectAction_1 = require("../../actions/types/onSelect/onSelectAction");
/**
* An abstract menu class that doesn't deal with item management itself
*/
class AbstractMenu {
/**
* Creates a new abstract menu
* @param context The context that menu items can use
*/
constructor(context) {
this.destroyed = new model_react_1.Field(false);
this.cursor = new model_react_1.Field(null);
this.selected = new model_react_1.Field([]);
this.context = context;
}
/**
* Retrieves the IOContext that's associated with this menu
* @returns The context
*/
getContext() {
return this.context;
}
// Selection management
/**
* Selects or deselects the given item
* @param item The item to select or deselect
* @param selected Whether to select or deselect
*/
setSelected(item, selected = true) {
if (this.getItems().includes(item) && !this.destroyed.get()) {
const selectedItems = this.selected.get();
if (selected) {
if (!selectedItems.includes(item) && isItemSelectable_1.isItemSelectable(item)) {
this.selected.set([...selectedItems, item]);
onSelectAction_1.onSelectAction.get([item]).onSelect(true, this);
}
}
else {
if (selectedItems.includes(item)) {
this.selected.set(selectedItems.filter(i => i != item));
onSelectAction_1.onSelectAction.get([item]).onSelect(false, this);
}
}
}
}
/**
* Selects an item to be the cursor
* @param item The new cursor
*/
setCursor(item) {
if ((!item || (this.getItems().includes(item) && isItemSelectable_1.isItemSelectable(item))) &&
!this.destroyed.get()) {
const currentCursor = this.cursor.get();
if (currentCursor)
onCursorAction_1.onCursorAction.get([currentCursor]).onCursor(false, this);
this.cursor.set(item);
if (item)
onCursorAction_1.onCursorAction.get([item]).onCursor(true, this);
}
}
/**
* Retrieves the currently selected items of the menu
* @param hook The hook to subscribe to changes
* @returns The selected menu items
*/
getSelected(hook) {
if (this.isDestroyed(hook))
return [];
return this.selected.get(hook);
}
/**
* Retrieves the item that's currently at the cursor of the menu
* @param hook The hook to subscribe to changes
* @returns The cursor item
*/
getCursor(hook) {
if (this.isDestroyed(hook))
return null;
return this.cursor.get(hook);
}
/**
* Retrieves all the selected items including the cursor
* @param hook The hook to subscribe to changes
* @returns The selected items including the cursor
*/
getAllSelected(hook) {
if (this.isDestroyed(hook))
return [];
const cursor = this.cursor.get(hook);
const selected = this.getSelected(hook);
if (cursor && !selected.includes(cursor))
return [...selected, cursor];
return selected;
}
// Destroy management
/**
* Destroys the menu, making sure that all items are unselected
*/
destroy() {
if (this.destroyed.get() == true)
return false;
// Select the selection
onSelectAction_1.onSelectAction.get(this.selected.get()).onSelect(false, this);
// Decursor the cursor
const cursor = this.cursor.get();
if (cursor)
onCursorAction_1.onCursorAction.get([cursor]).onCursor(false, this);
// Remove the items from the menu
onMenuChangAction_1.onMenuChangeAction.get(this.getItems()).onMenuChange(this, false);
this.destroyed.set(true);
return true;
}
/**
* Retrieves whether the menu has been destroyed
* @param hook The hook to subscribe to changes
* @returns Whether the menu was destroyed
*/
isDestroyed(hook) {
return this.destroyed.get(hook);
}
}
exports.AbstractMenu = AbstractMenu;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RNZW51LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbnVzL21lbnUvQWJzdHJhY3RNZW51LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLDZDQUE2QztBQUc3QyxnRUFBMkQ7QUFDM0QsMEZBQXNGO0FBQ3RGLGdGQUEyRTtBQUMzRSxnRkFBMkU7QUFFM0U7O0dBRUc7QUFDSCxNQUFzQixZQUFZO0lBTTlCOzs7T0FHRztJQUNILFlBQW1CLE9BQW1CO1FBUjVCLGNBQVMsR0FBRyxJQUFJLG1CQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsV0FBTSxHQUFHLElBQUksbUJBQUssQ0FBQyxJQUF3QixDQUFDLENBQUM7UUFDN0MsYUFBUSxHQUFHLElBQUksbUJBQUssQ0FBQyxFQUFpQixDQUFDLENBQUM7UUFPOUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFVBQVU7UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQWlCRCx1QkFBdUI7SUFFdkI7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxJQUFlLEVBQUUsV0FBb0IsSUFBSTtRQUN4RCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3pELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDMUMsSUFBSSxRQUFRLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksbUNBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztvQkFDNUMsK0JBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ25EO2FBQ0o7aUJBQU07Z0JBQ0gsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUM5QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ3hELCtCQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNwRDthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksU0FBUyxDQUFDLElBQXNCO1FBQ25DLElBQ0ksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksbUNBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNyRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQ3ZCO1lBQ0UsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN4QyxJQUFJLGFBQWE7Z0JBQUUsK0JBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFN0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFdEIsSUFBSSxJQUFJO2dCQUFFLCtCQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzdEO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXLENBQUMsSUFBZ0I7UUFDL0IsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxTQUFTLENBQUMsSUFBZ0I7UUFDN0IsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxjQUFjLENBQUMsSUFBZ0I7UUFDbEMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sQ0FBQyxHQUFHLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN2RSxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQscUJBQXFCO0lBQ3JCOztPQUVHO0lBQ0ksT0FBTztRQUNWLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFL0MsdUJBQXVCO1FBQ3ZCLCtCQUFjLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTlELHNCQUFzQjtRQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLElBQUksTUFBTTtZQUFFLCtCQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRS9ELGlDQUFpQztRQUNqQyxzQ0FBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVsRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxJQUFnQjtRQUMvQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLENBQUM7Q0FDSjtBQTdJRCxvQ0E2SUMifQ==