UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

130 lines 9.07 kB
"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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RNZW51LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21lbnVzL21lbnUvQWJzdHJhY3RNZW51LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLDZDQUE2QztBQUc3QyxnRUFBMkQ7QUFDM0QsMEZBQXNGO0FBQ3RGLGdGQUEyRTtBQUMzRSxnRkFBMkU7QUFFM0U7O0dBRUc7QUFDSCxNQUFzQixZQUFZO0lBTTlCOzs7T0FHRztJQUNILFlBQW1CLE9BQW1CO1FBUjVCLGNBQVMsR0FBRyxJQUFJLG1CQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsV0FBTSxHQUFHLElBQUksbUJBQUssQ0FBQyxJQUF3QixDQUFDLENBQUM7UUFDN0MsYUFBUSxHQUFHLElBQUksbUJBQUssQ0FBQyxFQUFpQixDQUFDLENBQUM7UUFPOUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFVBQVU7UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQWlCRCx1QkFBdUI7SUFFdkI7Ozs7T0FJRztJQUNJLFdBQVcsQ0FBQyxJQUFlLEVBQUUsV0FBb0IsSUFBSTtRQUN4RCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3pELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDMUMsSUFBSSxRQUFRLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksbUNBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMs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