implement toolbar toggle itmem (Cocoa)

Sat, 23 Aug 2025 10:23:16 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 23 Aug 2025 10:23:16 +0200
changeset 707
e9f63774b0e0
parent 706
2bdf00814cb8
child 708
0598e70c6489

implement toolbar toggle itmem (Cocoa)

make/xcode/toolkit/toolkit/main.m file | annotate | diff | comparison | revisions
ui/cocoa/Toolbar.h file | annotate | diff | comparison | revisions
ui/cocoa/Toolbar.m file | annotate | diff | comparison | revisions
--- a/make/xcode/toolkit/toolkit/main.m	Sat Aug 23 07:57:33 2025 +0200
+++ b/make/xcode/toolkit/toolkit/main.m	Sat Aug 23 10:23:16 2025 +0200
@@ -30,6 +30,21 @@
 
 #include <ui/ui.h>
 
+typedef struct WindowData {
+    UiInteger *tbtoggle;
+} WindowData;
+
+typedef struct MyDocument {
+    UiInteger *tbtoggle;
+} MyDocument;
+
+MyDocument* create_doc(void) {
+    MyDocument *doc = ui_document_new(sizeof(MyDocument));
+    UiContext *ctx = ui_document_context(doc);
+    doc->tbtoggle = ui_int_new(ctx, "tbtoggle");
+    return doc;
+}
+
 static void action_button(UiEvent *event, void *userdata) {
     printf("button click\n");
 }
@@ -38,8 +53,19 @@
     printf("toolbar item\n");
 }
 
+static void toolbar_toggle(UiEvent *event, void *userdata) {
+    MyDocument *doc = event->document;
+    int i = (int)(doc ? ui_get(doc->tbtoggle) : -1);
+    printf("toolbar toggle button %d %d\n", event->intval, i);
+}
+
 void application_startup(UiEvent *event, void *data) {
     UiObject *obj = ui_window("My Window", NULL);
+    //WindowData *wdata = ui_malloc(obj->ctx, sizeof(WindowData));
+    //wdata->tbtoggle = ui_int_new(obj->ctx, "tbtoggle");
+    //obj->window = wdata;
+    MyDocument *doc = create_doc();
+    ui_attach_document(obj->ctx, doc);
     
     
     ui_grid(obj, .columnspacing = 10, .rowspacing = 10) {
@@ -86,7 +112,9 @@
     
     ui_toolbar_item("item1", .label = "Test 1", .icon = "NSImageNameGoBackTemplate", .onclick = toolbar_action);
     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_add_default("item3", UI_TOOLBAR_LEFT);
     ui_toolbar_add_default("item1", UI_TOOLBAR_LEFT);
     ui_toolbar_add_default("item2", UI_TOOLBAR_RIGHT);
     
--- a/ui/cocoa/Toolbar.h	Sat Aug 23 07:57:33 2025 +0200
+++ b/ui/cocoa/Toolbar.h	Sat Aug 23 10:23:16 2025 +0200
@@ -56,8 +56,21 @@
 @end
 
 
+@interface UiToolbarToggleEventHandler : NSObject
+@property UiObject           *obj;
+@property UiVar              *var;
+@property ui_callback        callback;
+@property void               *userdata;
+
+- (UiToolbarToggleEventHandler*)init;
+- (void)handleEvent:(id)sender;
+
+@end
+
 void ui_toolbar_init(void);
 
 NSToolbarItem* ui_nstoolbaritem_create_item(UiObject *obj, UiToolbarItem *item, NSString *identifier);
 NSToolbarItem* ui_nstoolbaritem_create_toggle(UiObject *obj, UiToolbarToggleItem *item, NSString *identifier);
 
+int64_t ui_toolbar_seg_toggleitem_get(UiInteger *i);
+void ui_toolbar_seg_toggleitem_set(UiInteger *i, int64_t value);
--- 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