Sat, 23 Aug 2025 10:23:16 +0200
implement toolbar toggle itmem (Cocoa)
--- 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]; +}