Sat, 23 Aug 2025 14:24:09 +0200
handle toggle menu items separately when not created as AppMenu item (Cocoa)
--- a/make/xcode/toolkit/toolkit/main.m Sat Aug 23 14:00:09 2025 +0200 +++ b/make/xcode/toolkit/toolkit/main.m Sat Aug 23 14:24:09 2025 +0200 @@ -118,7 +118,8 @@ ui_toolbar_item("item2", .label = "Test 2", .icon = "NSImageNameGoForwardTemplate", .onclick = toolbar_action); ui_toolbar_toggleitem("item3", .label = "Toggle", .icon = "NSImageNameActionTemplate", .varname = "tbtoggle", .onchange = toolbar_toggle); ui_toolbar_menu("item4", .label = "Add", .icon = "NSImageNameAddTemplate") { - ui_menuitem(.label = "Test1"); + ui_menuitem(.label = "Test1", .onclick = action_menuitem); + ui_menu_toggleitem(.label = "Check"); } ui_toolbar_add_default("item4", UI_TOOLBAR_LEFT);
--- a/ui/cocoa/menu.h Sat Aug 23 14:00:09 2025 +0200 +++ b/ui/cocoa/menu.h Sat Aug 23 14:24:09 2025 +0200 @@ -33,14 +33,21 @@ @interface MenuItem : NSObject +@property (weak) NSMenuItem *menuItem; @property (strong) NSString *itemId; -@property UiMenuCheckItem *checkItem; -@property UiMenuRadioItem *radioItem; -@property ui_callback callback; -@property void *userdata; +@property UiMenuCheckItem *checkItem; +@property UiMenuRadioItem *radioItem; +@property ui_callback callback; +@property void *userdata; +@property (strong) NSString *varname; +@property UiObject *obj; +@property UiVar *var; +@property BOOL state; - (MenuItem*)init:(int)itId; +- (void)handleToggleEvent:(id)sender; + @end void ui_menu_init(void); @@ -58,3 +65,6 @@ void ui_add_menu_items(UiObject *obj, NSMenu *parent, int i, UiMenu *menu); NSArray* ui_get_binding_items(void); + +int64_t ui_menu_toggleitem_get(UiInteger *i); +void ui_menu_toggleitem_set(UiInteger *i, int64_t value);
--- a/ui/cocoa/menu.m Sat Aug 23 14:00:09 2025 +0200 +++ b/ui/cocoa/menu.m Sat Aug 23 14:24:09 2025 +0200 @@ -50,6 +50,28 @@ return self; } +- (void)handleToggleEvent:(id)sender { + NSMenuItem *item = (NSMenuItem*)sender; + if(!_state) { + item.state = NSControlStateValueOn; + } else { + item.state = NSControlStateValueOff; + } + _state = !_state; + + if(_callback) { + UiEvent event; + event.obj = _obj; + event.window = event.obj->window; + event.document = event.obj->ctx->document; + event.eventdata = NULL; + event.eventdatatype = 0; + event.intval = _state; + event.set = ui_get_setop(); + _callback(&event, _userdata); + } +} + @end static ui_menu_add_f createMenuItem[] = { @@ -114,12 +136,30 @@ NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuCheckItemAction:) keyEquivalent:@""]; MenuItem *mItem = [[MenuItem alloc] init:nItem++]; + mItem.menuItem = menuItem; + mItem.obj = obj; mItem.callback = it->callback; mItem.userdata = it->userdata; mItem.checkItem = it; + if(it->varname) { + mItem.varname = [[NSString alloc] initWithUTF8String:it->varname]; + } objc_setAssociatedObject(menuItem, "menuitem", mItem, OBJC_ASSOCIATION_RETAIN); - [bindingItems addObject:mItem]; + + if(!obj) { + [bindingItems addObject:mItem]; + } else { + mItem.var = uic_widget_var(obj->ctx, obj->ctx, NULL, it->varname, UI_VAR_INTEGER); + if(mItem.var) { + UiInteger *i = mItem.var->value; + i->obj = (__bridge void*)mItem; + i->get = ui_menu_toggleitem_get; + i->set = ui_menu_toggleitem_set; + } + menuItem.target = mItem; + menuItem.action = @selector(handleToggleEvent:); + } } void add_radioitem_widget(UiObject *obj, NSMenu *parent, int index, UiMenuItemI *item) { @@ -169,3 +209,20 @@ NSArray* ui_get_binding_items(void) { return bindingItems; } + + +int64_t ui_menu_toggleitem_get(UiInteger *i) { + MenuItem *item = (__bridge MenuItem*)i->obj; + i->value = item.state; + return i->value; +} + +void ui_menu_toggleitem_set(UiInteger *i, int64_t value) { + MenuItem *item = (__bridge MenuItem*)i->obj; + i->value = value; + if(value != 0) { + item.menuItem.state = NSControlStateValueOn; + } else { + item.menuItem.state = NSControlStateValueOff; + } +}