StratoSDK is a framework with a declarative approach similar to Flutter/React, written and designed entirely for Rust.
| 1 | #import "menus.h" |
| 2 | |
| 3 | void warp_menu_item_needs_update(NSMenuItem *, void *); |
| 4 | void warp_menu_item_triggered(NSMenuItem *, void *); |
| 5 | void warp_menu_item_deallocated(void *); |
| 6 | |
| 7 | @implementation WarpCustomMenuItemHandler |
| 8 | |
| 9 | - (id)initWithContext:(void *)context { |
| 10 | self = [super init]; |
| 11 | rustContext = context; |
| 12 | return self; |
| 13 | } |
| 14 | |
| 15 | - (void)itemWasTriggered:(NSMenuItem *)item { |
| 16 | if (rustContext && ![item hasSubmenu]) warp_menu_item_triggered(item, rustContext); |
| 17 | } |
| 18 | |
| 19 | - (void)itemNeedsUpdate:(NSMenuItem *)item { |
| 20 | if (rustContext) warp_menu_item_needs_update(item, rustContext); |
| 21 | } |
| 22 | |
| 23 | - (void)dealloc { |
| 24 | if (rustContext) warp_menu_item_deallocated(rustContext); |
| 25 | [super dealloc]; |
| 26 | } |
| 27 | |
| 28 | /// Our custom menu items set their enabled state in menuNeedsUpdate:, so do nothing here. |
| 29 | - (BOOL)validateMenuItem:(NSMenuItem *)menuItem { |
| 30 | return menuItem.isEnabled; |
| 31 | } |
| 32 | |
| 33 | @end |
| 34 | |
| 35 | void set_menu_item_submenu(NSMenuItem *item, NSMenu *submenu) { |
| 36 | if (submenu == nil) { |
| 37 | [item setAction:@selector(itemWasTriggered:)]; |
| 38 | } else { |
| 39 | [item setAction:NULL]; |
| 40 | } |
| 41 | [item setSubmenu:submenu]; |
| 42 | } |
| 43 |