Some checks failed
Audit / audit-js (push) Failing after 0s
bench / bench (map[os:ubuntu-latest runner:xvfb-run --auto-servernum target:x86_64-unknown-linux-gnu], nightly) (push) Failing after 0s
covector version or publish / run-integration-tests (ubuntu-latest) (push) Failing after 0s
Audit / audit-rust (push) Failing after 0s
test `@tauri-apps/cli` / test (ubuntu-latest) (push) Failing after 0s
test `tauri-cli` / test (map[os:ubuntu-latest target:x86_64-unknown-linux-gnu]) (push) Failing after 0s
test core / test (map[args:--all-features key:all], map[cargo:cargo command:test os:ubuntu-latest target:x86_64-unknown-linux-gnu toolchain:1.90]) (push) Failing after 0s
test core / test (map[args:--no-default-features key:no-default], map[cargo:cargo command:test os:ubuntu-latest target:x86_64-unknown-linux-gnu toolchain:1.90]) (push) Failing after 0s
test core / test (map[args:--no-default-features key:no-default], map[cargo:cross command:build os:ubuntu-latest target:aarch64-linux-android toolchain:1.90]) (push) Failing after 0s
deploy schema worker / deploy (push) Failing after 0s
lint rust / clippy (map[cargo:cargo include: os:ubuntu-latest target:x86_64-unknown-linux-gnu]) (push) Failing after 0s
lint rust / clippy (map[cargo:cross include:--package api os:ubuntu-latest target:aarch64-linux-android]) (push) Failing after 0s
supply chain health status / check rust dependencies with cargo vet (push) Failing after 0s
test `@tauri-apps/api` e2e (mobile) / android (push) Failing after 0s
test `@tauri-apps/api` e2e / test (map[name:Linux os:ubuntu-latest]) (push) Failing after 0s
test core / test (map[args:--all-features key:all], map[cargo:cross command:build os:ubuntu-latest target:aarch64-linux-android toolchain:1.90]) (push) Failing after 0s
Udeps / changes (push) Failing after 0s
Udeps / setup (push) Has been skipped
Udeps / udeps (push) Has been skipped
bench / bench (map[os:macos-latest runner: target:aarch64-apple-darwin], nightly) (push) Has been cancelled
bench / bench (map[os:windows-latest runner: target:x86_64-pc-windows-msvc], nightly) (push) Has been cancelled
covector version or publish / run-integration-tests (macos-latest) (push) Has been cancelled
covector version or publish / run-integration-tests (windows-latest) (push) Has been cancelled
covector version or publish / version-or-publish (push) Has been cancelled
test `@tauri-apps/cli` / test (macos-latest) (push) Has been cancelled
test `tauri-cli` / test (map[args:--no-default-features --features native-tls-vendored os:windows-latest restore-only:true target:aarch64-pc-windows-msvc]) (push) Has been cancelled
test `tauri-cli` / test (map[os:macos-latest target:x86_64-apple-darwin]) (push) Has been cancelled
test `tauri-cli` / test (map[os:windows-latest target:x86_64-pc-windows-msvc]) (push) Has been cancelled
test core / test (map[args:--all-features key:all], map[cargo:cargo command:build os:macos-latest target:aarch64-apple-ios toolchain:1.90]) (push) Has been cancelled
test core / test (map[args:--all-features key:all], map[cargo:cargo command:test os:macos-14 target:aarch64-apple-darwin toolchain:1.90]) (push) Has been cancelled
lint rust / clippy (map[cargo:cargo include: os:macos-latest target:aarch64-apple-darwin]) (push) Has been cancelled
lint rust / clippy (map[cargo:cargo include: os:windows-latest target:x86_64-pc-windows-msvc]) (push) Has been cancelled
lint rust / clippy (map[cargo:cargo include:--package api os:macos-latest target:aarch64-apple-ios]) (push) Has been cancelled
test `@tauri-apps/api` e2e (mobile) / ios (push) Has been cancelled
test `@tauri-apps/api` e2e / test (map[name:Windows os:windows-latest]) (push) Has been cancelled
test `@tauri-apps/api` e2e / test (map[name:macOS os:macos-latest]) (push) Has been cancelled
test `@tauri-apps/cli` / test (windows-latest) (push) Has been cancelled
test core / test (map[args:--all-features key:all], map[cargo:cargo command:test os:windows-latest target:x86_64-pc-windows-msvc toolchain:1.90]) (push) Has been cancelled
test core / test (map[args:--no-default-features key:no-default], map[cargo:cargo command:build os:macos-latest target:aarch64-apple-ios toolchain:1.90]) (push) Has been cancelled
test core / test (map[args:--no-default-features key:no-default], map[cargo:cargo command:test os:macos-14 target:aarch64-apple-darwin toolchain:1.90]) (push) Has been cancelled
test core / test (map[args:--no-default-features key:no-default], map[cargo:cargo command:test os:windows-latest target:x86_64-pc-windows-msvc toolchain:1.90]) (push) Has been cancelled
306 lines
8.3 KiB
TypeScript
306 lines
8.3 KiB
TypeScript
// Copyright 2019-2024 Tauri Programme within The Commons Conservancy
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
import {
|
|
IconMenuItemOptions,
|
|
PredefinedMenuItemOptions,
|
|
CheckMenuItemOptions
|
|
} from '../menu'
|
|
import { MenuItem, type MenuItemOptions } from './menuItem'
|
|
import { CheckMenuItem } from './checkMenuItem'
|
|
import { IconMenuItem } from './iconMenuItem'
|
|
import { PredefinedMenuItem } from './predefinedMenuItem'
|
|
import { invoke } from '../core'
|
|
import { type LogicalPosition, PhysicalPosition, type Window } from '../window'
|
|
import { type ItemKind, MenuItemBase, newMenu } from './base'
|
|
import { type MenuOptions } from './menu'
|
|
import { Position } from '../dpi'
|
|
import { transformImage, MenuIcon } from '../image'
|
|
|
|
/** @ignore */
|
|
export function itemFromKind([rid, id, kind]: [number, string, ItemKind]):
|
|
| Submenu
|
|
| MenuItem
|
|
| PredefinedMenuItem
|
|
| CheckMenuItem
|
|
| IconMenuItem {
|
|
/* 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(rid, id)
|
|
case 'Check':
|
|
// @ts-expect-error constructor is protected for external usage only, safe for us to use
|
|
return new CheckMenuItem(rid, id)
|
|
case 'Icon':
|
|
// @ts-expect-error constructor is protected for external usage only, safe for us to use
|
|
return new IconMenuItem(rid, id)
|
|
case 'MenuItem':
|
|
default:
|
|
// @ts-expect-error constructor is protected for external usage only, safe for us to use
|
|
return new MenuItem(rid, id)
|
|
}
|
|
/* eslint-enable @typescript-eslint/no-unsafe-return */
|
|
}
|
|
|
|
export type SubmenuOptions = (Omit<MenuItemOptions, 'accelerator' | 'action'>
|
|
& MenuOptions) & {
|
|
/**
|
|
* Icon to be used for the submenu.
|
|
* Note: you may need the `image-ico` or `image-png` Cargo features to use this API.
|
|
*/
|
|
icon?: MenuIcon
|
|
}
|
|
|
|
/** A type that is a submenu inside a {@linkcode Menu} or {@linkcode Submenu}. */
|
|
export class Submenu extends MenuItemBase {
|
|
/** @ignore */
|
|
protected constructor(rid: number, id: string) {
|
|
super(rid, id, 'Submenu')
|
|
}
|
|
|
|
/** Create a new submenu. */
|
|
static async new(opts: SubmenuOptions): Promise<Submenu> {
|
|
return newMenu('Submenu', opts).then(([rid, id]) => new Submenu(rid, id))
|
|
}
|
|
|
|
/** Returns the text of this submenu. */
|
|
async text(): Promise<string> {
|
|
return invoke('plugin:menu|text', { rid: this.rid, kind: this.kind })
|
|
}
|
|
|
|
/** Sets the text for this submenu. */
|
|
async setText(text: string): Promise<void> {
|
|
return invoke('plugin:menu|set_text', {
|
|
rid: this.rid,
|
|
kind: this.kind,
|
|
text
|
|
})
|
|
}
|
|
|
|
/** Returns whether this submenu is enabled or not. */
|
|
async isEnabled(): Promise<boolean> {
|
|
return invoke('plugin:menu|is_enabled', { rid: this.rid, kind: this.kind })
|
|
}
|
|
|
|
/** Sets whether this submenu is enabled or not. */
|
|
async setEnabled(enabled: boolean): Promise<void> {
|
|
return 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<
|
|
T extends
|
|
| Submenu
|
|
| MenuItem
|
|
| PredefinedMenuItem
|
|
| CheckMenuItem
|
|
| IconMenuItem
|
|
| MenuItemOptions
|
|
| SubmenuOptions
|
|
| IconMenuItemOptions
|
|
| PredefinedMenuItemOptions
|
|
| CheckMenuItemOptions
|
|
>(items: T | T[]): Promise<void> {
|
|
return 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<
|
|
T extends
|
|
| Submenu
|
|
| MenuItem
|
|
| PredefinedMenuItem
|
|
| CheckMenuItem
|
|
| IconMenuItem
|
|
| MenuItemOptions
|
|
| SubmenuOptions
|
|
| IconMenuItemOptions
|
|
| PredefinedMenuItemOptions
|
|
| CheckMenuItemOptions
|
|
>(items: T | T[]): Promise<void> {
|
|
return 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<
|
|
T extends
|
|
| Submenu
|
|
| MenuItem
|
|
| PredefinedMenuItem
|
|
| CheckMenuItem
|
|
| IconMenuItem
|
|
| MenuItemOptions
|
|
| SubmenuOptions
|
|
| IconMenuItemOptions
|
|
| PredefinedMenuItemOptions
|
|
| CheckMenuItemOptions
|
|
>(items: T | T[], position: number): Promise<void> {
|
|
return 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: Submenu | MenuItem | PredefinedMenuItem | CheckMenuItem | IconMenuItem
|
|
): Promise<void> {
|
|
return 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: number
|
|
): Promise<
|
|
| Submenu
|
|
| MenuItem
|
|
| PredefinedMenuItem
|
|
| CheckMenuItem
|
|
| IconMenuItem
|
|
| null
|
|
> {
|
|
return invoke<[number, string, ItemKind]>('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(): Promise<
|
|
Array<
|
|
Submenu | MenuItem | PredefinedMenuItem | CheckMenuItem | IconMenuItem
|
|
>
|
|
> {
|
|
return invoke<Array<[number, string, ItemKind]>>('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: string
|
|
): Promise<
|
|
| Submenu
|
|
| MenuItem
|
|
| PredefinedMenuItem
|
|
| CheckMenuItem
|
|
| IconMenuItem
|
|
| null
|
|
> {
|
|
return invoke<[number, string, ItemKind] | null>('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?: PhysicalPosition | LogicalPosition,
|
|
window?: Window
|
|
): Promise<void> {
|
|
return invoke('plugin:menu|popup', {
|
|
rid: this.rid,
|
|
kind: this.kind,
|
|
window: window?.label ?? null,
|
|
at: at instanceof Position ? at : at ? new 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(): Promise<void> {
|
|
return 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(): Promise<void> {
|
|
return invoke('plugin:menu|set_as_help_menu_for_nsapp', {
|
|
rid: this.rid
|
|
})
|
|
}
|
|
|
|
/** Sets an icon for this submenu */
|
|
async setIcon(icon: MenuIcon | null): Promise<void> {
|
|
return invoke('plugin:menu|set_icon', {
|
|
rid: this.rid,
|
|
kind: this.kind,
|
|
icon: transformImage(icon)
|
|
})
|
|
}
|
|
}
|