diff -r 2bdf00814cb8 -r e9f63774b0e0 ui/cocoa/Toolbar.m --- a/ui/cocoa/Toolbar.m Sat Aug 23 07:57:33 2025 +0200 +++ b/ui/cocoa/Toolbar.m Sat Aug 23 10:23:16 2025 +0200 @@ -111,6 +111,36 @@ @end +@implementation UiToolbarToggleEventHandler + +- (UiToolbarToggleEventHandler*)init { + return self; +} + +- (void)handleEvent:(id)sender { + if(_callback == nil) { + return; + } + + UiEvent event; + event.obj = _obj; + event.window = event.obj->window; + event.document = event.obj->ctx->document; + event.eventdata = NULL; + event.eventdatatype = 0; + event.intval = 0; + event.set = ui_get_setop(); + + if([sender isKindOfClass:[NSSegmentedControl class]]) { + NSSegmentedControl *seg = (NSSegmentedControl*)sender; + event.intval = [seg isSelectedForSegment:0]; + } + + _callback(&event, _userdata); +} + +@end + NSToolbarItem* ui_nstoolbaritem_create_item(UiObject *obj, UiToolbarItem *item, NSString *identifier) { NSToolbarItem *button = [[NSToolbarItem alloc] initWithItemIdentifier: identifier]; button.bordered = YES; @@ -136,10 +166,56 @@ } NSToolbarItem* ui_nstoolbaritem_create_toggle(UiObject *obj, UiToolbarToggleItem *item, NSString *identifier) { - NSToolbarItem *tbItem = [[NSToolbarItem alloc] initWithItemIdentifier: identifier]; + UiToolbarToggleEventHandler *event = [[UiToolbarToggleEventHandler alloc]init]; + event.obj = obj; + event.callback = item->args.onchange; + event.userdata = item->args.onchangedata; + + NSToolbarItem *button = [[NSToolbarItem alloc] initWithItemIdentifier:identifier]; if(item->args.label) { NSString *label = [[NSString alloc] initWithUTF8String:item->args.label]; - [tbItem setLabel:label]; + button.paletteLabel = label; + button.label = label; + } + objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN); + + NSSegmentedControl *seg; + if(!item->args.icon) { + NSArray *labels = @[[[NSString alloc] initWithUTF8String:item->args.label]]; + seg = [NSSegmentedControl segmentedControlWithLabels:labels trackingMode:NSSegmentSwitchTrackingSelectAny target:event action:@selector(handleEvent:)]; + button.view = seg; + } else { + NSArray *images = @[ui_cocoa_named_icon(item->args.icon)]; + seg = [NSSegmentedControl segmentedControlWithImages:images trackingMode:NSSegmentSwitchTrackingSelectAny target:event action:@selector(handleEvent:)]; } - return tbItem; + button.view = seg; + + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, NULL, item->args.varname, UI_VAR_INTEGER); + if(var) { + event.var = var; + UiInteger *i = var->value; + if(i->get) { + if(ui_get(i) != 0) { + [seg setEnabled:YES forSegment:0]; + } + + } + i->obj = (__bridge void*)seg; + i->get = ui_toolbar_seg_toggleitem_get; + i->set = ui_toolbar_seg_toggleitem_set; + } + + return button; } + +int64_t ui_toolbar_seg_toggleitem_get(UiInteger *i) { + NSSegmentedControl *seg = (__bridge NSSegmentedControl*)i->obj; + i->value = [seg isSelectedForSegment:0]; + return i->value; +} + +void ui_toolbar_seg_toggleitem_set(UiInteger *i, int64_t value) { + NSSegmentedControl *seg = (__bridge NSSegmentedControl*)i->obj; + i->value = value; + [seg setSelected:value != 0 forSegment:0]; +}