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
127 lines
3.2 KiB
Svelte
127 lines
3.2 KiB
Svelte
<script lang="ts">
|
|
import { Menu, Submenu, NativeIcon } from '@tauri-apps/api/menu'
|
|
import MenuBuilder, {
|
|
reorderMenuItems,
|
|
type Item,
|
|
type MenuItemClickDetail,
|
|
type MenuItems
|
|
} from '../components/MenuBuilder.svelte'
|
|
import { defaultWindowIcon } from '@tauri-apps/api/app'
|
|
import type { ViewProps } from '../App.svelte'
|
|
import { onDestroy } from 'svelte'
|
|
import type { Image } from '@tauri-apps/api/image'
|
|
|
|
let { onMessage }: ViewProps = $props()
|
|
let items = $state<Item[]>([])
|
|
|
|
let menu: Menu | undefined
|
|
let popupMenu: Menu | undefined
|
|
let submenu: Submenu | undefined
|
|
|
|
const macOS = navigator.userAgent.includes('Macintosh')
|
|
|
|
async function createSubmenu(): Promise<Submenu> {
|
|
return await Submenu.new({
|
|
text: 'app',
|
|
items: items.map((i) => i.menu).filter(Boolean) as MenuItems[]
|
|
})
|
|
}
|
|
|
|
async function createSubmenuWithNativeIcon(): Promise<Submenu> {
|
|
return await Submenu.new({
|
|
text: 'Submenu with NativeIcon',
|
|
icon: NativeIcon.Folder,
|
|
items: items.map((i) => i.menu).filter(Boolean) as MenuItems[]
|
|
})
|
|
}
|
|
|
|
async function createSubmenuWithImageIcon(): Promise<Submenu> {
|
|
let icon: Image | undefined
|
|
try {
|
|
icon = (await defaultWindowIcon())!
|
|
return await Submenu.new({
|
|
text: 'Submenu with Image',
|
|
icon,
|
|
items: items.map((i) => i.menu).filter(Boolean) as MenuItems[]
|
|
})
|
|
} finally {
|
|
icon?.close()
|
|
}
|
|
}
|
|
|
|
async function setMenu(newSubmenu: Submenu) {
|
|
menu?.close()
|
|
menu = undefined
|
|
submenu?.close()
|
|
submenu = newSubmenu
|
|
|
|
menu = await Menu.new({
|
|
items: [submenu]
|
|
})
|
|
await (macOS ? menu.setAsAppMenu() : menu.setAsWindowMenu())
|
|
}
|
|
|
|
async function create() {
|
|
await setMenu(await createSubmenu())
|
|
}
|
|
|
|
async function createWithNativeIcon() {
|
|
await setMenu(await createSubmenuWithNativeIcon())
|
|
}
|
|
|
|
async function createWithImageIcon() {
|
|
await setMenu(await createSubmenuWithImageIcon())
|
|
}
|
|
|
|
async function popup() {
|
|
popupMenu?.close()
|
|
popupMenu = undefined
|
|
popupMenu = await Menu.new({
|
|
items: items.map((i) => i.menu).filter(Boolean) as MenuItems[]
|
|
})
|
|
await popupMenu.popup()
|
|
}
|
|
|
|
function onItemClick(detail: MenuItemClickDetail) {
|
|
onMessage(`Item ${detail.text} clicked`)
|
|
}
|
|
|
|
onDestroy(() => {
|
|
menu?.close()
|
|
submenu?.close()
|
|
popupMenu?.close()
|
|
})
|
|
</script>
|
|
|
|
<div class="grid gap-8 mb-4">
|
|
<MenuBuilder
|
|
bind:items
|
|
itemClick={onItemClick}
|
|
onItemAdded={async (item) => {
|
|
if (item.menu) {
|
|
await submenu?.append(item.menu)
|
|
}
|
|
}}
|
|
onItemRemoved={async (item) => {
|
|
if (item.menu) {
|
|
await submenu?.remove(item.menu)
|
|
}
|
|
}}
|
|
onItemMoved={(item, toIndex) => {
|
|
if (submenu) {
|
|
reorderMenuItems(submenu, item, toIndex)
|
|
}
|
|
}}
|
|
/>
|
|
<div class="flex gap-2">
|
|
<button class="btn" onclick={create}>Create menu</button>
|
|
<button class="btn" onclick={createWithNativeIcon}
|
|
>Create menu with NativeIcon</button
|
|
>
|
|
<button class="btn" onclick={createWithImageIcon}
|
|
>Create menu with Image icon</button
|
|
>
|
|
<button class="btn" onclick={popup}>Popup</button>
|
|
</div>
|
|
</div>
|