Seregon/StratoSDK

StratoSDK is a framework with a declarative approach similar to Flutter/React, written and designed entirely for Rust.

Rust/27.3 KB/No license
crates/strato-ui-renderer/src/platform/mac/objc/menus.m
1#import "menus.h"
2 
3void warp_menu_item_needs_update(NSMenuItem *, void *);
4void warp_menu_item_triggered(NSMenuItem *, void *);
5void 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 
35void 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