UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

133 lines 12.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ProxiedMenu = void 0; const model_react_1 = require("model-react"); const onMenuChangAction_1 = require("../../actions/types/onMenuChange/onMenuChangAction"); const onSelectAction_1 = require("../../actions/types/onSelect/onSelectAction"); const baseSettings_1 = require("../../application/settings/baseSettings/baseSettings"); const isItemSelectable_1 = require("../items/isItemSelectable"); const AbstractMenu_1 = require("./AbstractMenu"); const createCategoryGetter_1 = require("./standardConfig/createCategoryGetter"); // TODO: properly call on menu add and remove hook // TODO: write test file /** * A menu that wraps around an item source retriever, automatically updating its contents when the source updates. * Note that every single update will require O(n^2) time (n being the number of items in the menu), and is thus rather intensive. */ class ProxiedMenu extends AbstractMenu_1.AbstractMenu { /** * Creates a new proxied menu * @param context The context to be used by menu items * @param itemSource The menu items source * @param config The configuration for category options */ constructor(context, itemSource, config) { var _a; super(context); /** A data cacher that computes the categories from an item list */ this.categories = new model_react_1.DataCacher(hook => { const items = this.itemSource(hook); const categories = [{ category: undefined, items: [] }]; items.forEach(item => { const category = this.categoryConfig.getCategory(item, hook); const categoryData = categories.find(({ category: c }) => c == category); if (categoryData) categoryData.items.push(item); else categories.push({ category, items: [item] }); }); return { categories, rawItems: items }; }, // Call on menu change actions { onUpdate: ({ rawItems }, prev) => { var _a; const prevRawItems = (_a = prev === null || prev === void 0 ? void 0 : prev.rawItems) !== null && _a !== void 0 ? _a : []; const removed = prevRawItems.filter(item => !rawItems.includes(item)); onMenuChangAction_1.onMenuChangeAction.get(removed).onMenuChange(this, false); const added = rawItems.filter(item => !prevRawItems.includes(item)); onMenuChangAction_1.onMenuChangeAction.get(added).onMenuChange(this, true); }, }); /** A data cacher that computes the items list with categories from the category data */ this.itemsList = new model_react_1.DataCacher(hook => { const rawCategories = this.categories.get(hook).categories; const order = this.categoryConfig.sortCategories(rawCategories); // Combine the items and categories into a single list const items = []; const categories = []; order.forEach(category => { const categoryData = rawCategories.find(({ category: c }) => c == category); if (categoryData) { categories.push({ category, items: categoryData.items }); if (category) items.push(category.item, ...categoryData.items); else items.push(...categoryData.items); } }); return items; }, { onUpdate: () => { this.deselectRemovedItems(); }, }); this.itemSource = itemSource; const menuSettings = context.settings.get(baseSettings_1.baseSettings).menu; this.categoryConfig = { getCategory: (config === null || config === void 0 ? void 0 : config.getCategory) || createCategoryGetter_1.createCategoryGetter(context), sortCategories: (config === null || config === void 0 ? void 0 : config.sortCategories) || (categories => categories.map(({ category }) => category)), maxCategoryItemCount: (_a = config === null || config === void 0 ? void 0 : config.maxCategoryItemCount) !== null && _a !== void 0 ? _a : menuSettings.maxMenuSize.get(), }; } /** * Checks whether the cursor item is still present, and deselects it if not */ deselectRemovedItems() { const items = this.getItems(); // Update the cursor if needed const cursor = this.cursor.get(); updateCursor: if (cursor == null || !items.includes(cursor)) { for (let i = 0; i < items.length; i++) if (isItemSelectable_1.isItemSelectable(items[i])) { this.setCursor(items[i]); break updateCursor; } this.setCursor(null); } // Remove any removed items from the selection const selection = this.selected.get(); const presentSelected = selection.filter(item => items.includes(item)); if (selection.length != presentSelected.length) { const removed = selection.filter(item => !items.includes(item)); onSelectAction_1.onSelectAction.get(removed).onSelect(false, this); this.selected.set(presentSelected); } } // Item retrieval /** * Retrieves the items of the menu * @param hook The hook to subscribe to changes * @returns The menu items */ getItems(hook) { if (this.isDestroyed(hook)) // Whenever the menu is destroyed, we no longer inform about item changes return this.itemsList.get(); return this.itemsList.get(hook); } /** * Retrieves the item categories of the menu * @param hook The hook to subscribe to changes * @returns The categories and their items */ getCategories(hook) { if (this.isDestroyed(hook)) // Whenever the menu is destroyed, we no longer inform about category changes return this.categories.get().categories; return this.categories.get(hook).categories; } } exports.ProxiedMenu = ProxiedMenu; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJveGllZE1lbnUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWVudXMvbWVudS9Qcm94aWVkTWVudS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBa0U7QUFDbEUsMEZBQXNGO0FBQ3RGLGdGQUEyRTtBQUMzRSx1RkFBa0Y7QUFHbEYsZ0VBQTJEO0FBRTNELGlEQUE0QztBQUM1QyxnRkFBMkU7QUFJM0Usa0RBQWtEO0FBQ2xELHdCQUF3QjtBQUV4Qjs7O0dBR0c7QUFDSCxNQUFhLFdBQVksU0FBUSwyQkFBWTtJQUl6Qzs7Ozs7T0FLRztJQUNILFlBQ0ksT0FBbUIsRUFDbkIsVUFBdUMsRUFDdkMsTUFBNEI7O1FBRTVCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQWFuQixtRUFBbUU7UUFDekQsZUFBVSxHQUFHLElBQUksd0JBQVUsQ0FDakMsSUFBSSxDQUFDLEVBQUU7WUFDSCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sVUFBVSxHQUFHLENBQUMsRUFBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUMsQ0FBd0IsQ0FBQztZQUM3RSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNqQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzdELE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLFlBQVk7b0JBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O29CQUMzQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVB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