ui/cocoa/Toolbar.m

changeset 707
e9f63774b0e0
parent 687
d43b4fcd3d8c
child 708
0598e70c6489
--- 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];
+}

mercurial