File size: 7,097 Bytes
adb87a5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | 'use strict';
var menuItem = require('./menuItem.cjs');
var checkMenuItem = require('./checkMenuItem.cjs');
var iconMenuItem = require('./iconMenuItem.cjs');
var predefinedMenuItem = require('./predefinedMenuItem.cjs');
var core = require('../core.cjs');
var base = require('./base.cjs');
var dpi = require('../dpi.cjs');
var image = require('../image.cjs');
// Copyright 2019-2024 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
/** @ignore */
function itemFromKind([rid, id, kind]) {
/* eslint-disable @typescript-eslint/no-unsafe-return */
switch (kind) {
case 'Submenu':
// @ts-expect-error constructor is protected for external usage only, safe for us to use
return new Submenu(rid, id);
case 'Predefined':
// @ts-expect-error constructor is protected for external usage only, safe for us to use
return new predefinedMenuItem.PredefinedMenuItem(rid, id);
case 'Check':
// @ts-expect-error constructor is protected for external usage only, safe for us to use
return new checkMenuItem.CheckMenuItem(rid, id);
case 'Icon':
// @ts-expect-error constructor is protected for external usage only, safe for us to use
return new iconMenuItem.IconMenuItem(rid, id);
case 'MenuItem':
default:
// @ts-expect-error constructor is protected for external usage only, safe for us to use
return new menuItem.MenuItem(rid, id);
}
/* eslint-enable @typescript-eslint/no-unsafe-return */
}
/** A type that is a submenu inside a {@linkcode Menu} or {@linkcode Submenu}. */
class Submenu extends base.MenuItemBase {
/** @ignore */
constructor(rid, id) {
super(rid, id, 'Submenu');
}
/** Create a new submenu. */
static async new(opts) {
return base.newMenu('Submenu', opts).then(([rid, id]) => new Submenu(rid, id));
}
/** Returns the text of this submenu. */
async text() {
return core.invoke('plugin:menu|text', { rid: this.rid, kind: this.kind });
}
/** Sets the text for this submenu. */
async setText(text) {
return core.invoke('plugin:menu|set_text', {
rid: this.rid,
kind: this.kind,
text
});
}
/** Returns whether this submenu is enabled or not. */
async isEnabled() {
return core.invoke('plugin:menu|is_enabled', { rid: this.rid, kind: this.kind });
}
/** Sets whether this submenu is enabled or not. */
async setEnabled(enabled) {
return core.invoke('plugin:menu|set_enabled', {
rid: this.rid,
kind: this.kind,
enabled
});
}
/**
* Add a menu item to the end of this submenu.
*
* #### Platform-specific:
*
* - **macOS:** Only {@linkcode Submenu}s can be added to a {@linkcode Menu}.
*/
async append(items) {
return core.invoke('plugin:menu|append', {
rid: this.rid,
kind: this.kind,
items: (Array.isArray(items) ? items : [items]).map((i) => 'rid' in i ? [i.rid, i.kind] : i)
});
}
/**
* Add a menu item to the beginning of this submenu.
*
* #### Platform-specific:
*
* - **macOS:** Only {@linkcode Submenu}s can be added to a {@linkcode Menu}.
*/
async prepend(items) {
return core.invoke('plugin:menu|prepend', {
rid: this.rid,
kind: this.kind,
items: (Array.isArray(items) ? items : [items]).map((i) => 'rid' in i ? [i.rid, i.kind] : i)
});
}
/**
* Add a menu item to the specified position in this submenu.
*
* #### Platform-specific:
*
* - **macOS:** Only {@linkcode Submenu}s can be added to a {@linkcode Menu}.
*/
async insert(items, position) {
return core.invoke('plugin:menu|insert', {
rid: this.rid,
kind: this.kind,
items: (Array.isArray(items) ? items : [items]).map((i) => 'rid' in i ? [i.rid, i.kind] : i),
position
});
}
/** Remove a menu item from this submenu. */
async remove(item) {
return core.invoke('plugin:menu|remove', {
rid: this.rid,
kind: this.kind,
item: [item.rid, item.kind]
});
}
/** Remove a menu item from this submenu at the specified position. */
async removeAt(position) {
return core.invoke('plugin:menu|remove_at', {
rid: this.rid,
kind: this.kind,
position
}).then(itemFromKind);
}
/** Returns a list of menu items that has been added to this submenu. */
async items() {
return core.invoke('plugin:menu|items', {
rid: this.rid,
kind: this.kind
}).then((i) => i.map(itemFromKind));
}
/** Retrieves the menu item matching the given identifier. */
async get(id) {
return core.invoke('plugin:menu|get', {
rid: this.rid,
kind: this.kind,
id
}).then((r) => (r ? itemFromKind(r) : null));
}
/**
* Popup this submenu as a context menu on the specified window.
*
* If the position, is provided, it is relative to the window's top-left corner.
*/
async popup(at, window) {
var _a;
return core.invoke('plugin:menu|popup', {
rid: this.rid,
kind: this.kind,
window: (_a = window === null || window === void 0 ? void 0 : window.label) !== null && _a !== void 0 ? _a : null,
at: at instanceof dpi.Position ? at : at ? new dpi.Position(at) : null
});
}
/**
* Set this submenu as the Window menu for the application on macOS.
*
* This will cause macOS to automatically add window-switching items and
* certain other items to the menu.
*
* #### Platform-specific:
*
* - **Windows / Linux**: Unsupported.
*/
async setAsWindowsMenuForNSApp() {
return core.invoke('plugin:menu|set_as_windows_menu_for_nsapp', {
rid: this.rid
});
}
/**
* Set this submenu as the Help menu for the application on macOS.
*
* This will cause macOS to automatically add a search box to the menu.
*
* If no menu is set as the Help menu, macOS will automatically use any menu
* which has a title matching the localized word "Help".
*
* #### Platform-specific:
*
* - **Windows / Linux**: Unsupported.
*/
async setAsHelpMenuForNSApp() {
return core.invoke('plugin:menu|set_as_help_menu_for_nsapp', {
rid: this.rid
});
}
/** Sets an icon for this submenu */
async setIcon(icon) {
return core.invoke('plugin:menu|set_icon', {
rid: this.rid,
kind: this.kind,
icon: image.transformImage(icon)
});
}
}
exports.Submenu = Submenu;
exports.itemFromKind = itemFromKind;
|