--- a/ui/cocoa/button.m Mon Jan 06 22:22:55 2025 +0100 +++ b/ui/cocoa/button.m Tue Feb 25 21:11:00 2025 +0100 @@ -51,3 +51,178 @@ return (__bridge void*)button; } + + +static void togglebutton_eventdata(id button, UiVar *var, void **eventdata, int *value) { + NSButton *btn = (NSButton*)button; + NSControlStateValue state = btn.state; + *value = (int)state; +} + +UIWIDGET togglebutton_create(UiObject* obj, UiToggleArgs args, enum NSButtonType type) { + NSButton *button = [[NSButton alloc] init]; + [button setButtonType:type]; + //[button setAllowsMixedState:YES]; + + if(args.label) { + NSString *label = [[NSString alloc] initWithUTF8String:args.label]; + button.title = label; + } + + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); + if(var) { + UiInteger *i = var->value; + i->obj = (__bridge void*)button; + i->get = ui_togglebutton_get; + i->set = ui_togglebutton_set; + } + + if(args.onchange) { + EventData *event = [[EventData alloc] init:args.onchange userdata:args.onchangedata]; + event.get_eventdata = togglebutton_eventdata; + event.obj = obj; + event.var = var; + event.vartype = UI_VAR_INTEGER; + button.target = event; + button.action = @selector(handleEventWithEventData:); + objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN); + } + + UiLayout layout = UI_INIT_LAYOUT(args); + ui_container_add(obj, button, &layout, FALSE); + + return (__bridge void*)button; +} + +int64_t ui_togglebutton_get(UiInteger *i) { + NSButton *button = (__bridge NSButton*)i->obj; + NSControlStateValue state = button.state; + i->value = (int64_t)state; + return (int64_t)state; +} + +void ui_togglebutton_set(UiInteger *i, int64_t value) { + NSButton *button = (__bridge NSButton*)i->obj; + NSControlStateValue state; + switch(value) { + case 0: state = NSControlStateValueOff; break; + case 1: state = NSControlStateValueOff; break; + default: state = NSControlStateValueMixed; + } + i->value = (int64_t)state; + button.state = state; +} + +UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs args) { + return togglebutton_create(obj, args, NSButtonTypePushOnPushOff); +} + +UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) { + return togglebutton_create(obj, args, NSButtonTypeSwitch); +} + +static void switch_eventdata(id button, UiVar *var, void **eventdata, int *value) { + NSSwitch *btn = (NSSwitch*)button; + NSControlStateValue state = btn.state; + *value = (int)state; +} + +UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs args) { + NSSwitch *button = [[NSSwitch alloc] init]; + + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); + if(var) { + UiInteger *i = var->value; + i->obj = (__bridge void*)button; + i->get = ui_switch_get; + i->set = ui_switch_set; + } + + if(args.onchange) { + EventData *event = [[EventData alloc] init:args.onchange userdata:args.onchangedata]; + event.get_eventdata = switch_eventdata; + event.obj = obj; + event.var = var; + event.vartype = UI_VAR_INTEGER; + button.target = event; + button.action = @selector(handleEventWithEventData:); + objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN); + } + + UiLayout layout = UI_INIT_LAYOUT(args); + ui_container_add(obj, button, &layout, FALSE); + + return (__bridge void*)button; +} + +int64_t ui_switch_get(UiInteger *i) { + NSSwitch *button = (__bridge NSSwitch*)i->obj; + NSControlStateValue state = button.state; + i->value = (int64_t)state; + return (int64_t)state; +} + +void ui_switch_set(UiInteger *i, int64_t value) { + NSSwitch *button = (__bridge NSSwitch*)i->obj; + NSControlStateValue state; + switch(value) { + case 0: state = NSControlStateValueOff; break; + case 1: state = NSControlStateValueOff; break; + default: state = NSControlStateValueMixed; + } + i->value = (int64_t)state; + button.state = state; +} + +static void radiobutton_eventdata(id button, UiVar *var, void **eventdata, int *value) { + if(var) { + printf("switch radiobutton\n"); + } +} + +UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args) { + NSButton *button = [[NSButton alloc] init]; + [button setButtonType:NSButtonTypeRadio]; + + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); + NSMutableArray *buttons = nil; + if(var) { + UiInteger *i = var->value; + buttons = (__bridge NSMutableArray*)i->obj; + if(!buttons) { + buttons = [[NSMutableArray alloc] init]; + i->obj = (__bridge void*)buttons; + i->get = ui_radiobuttons_get; + i->set = ui_radiobuttons_set; + } + [buttons addObject:button]; + objc_setAssociatedObject(button, "radiogroup", buttons, OBJC_ASSOCIATION_RETAIN); + } + + if(args.onchange || var) { + EventData *event = [[EventData alloc] init:args.onchange userdata:args.onchangedata]; + event.get_eventdata = radiobutton_eventdata; + event.obj = obj; + event.var = var; + event.vartype = UI_VAR_INTEGER; + button.target = event; + + + button.action = @selector(handleEventWithEventData:); + + objc_setAssociatedObject(button, "eventdata", event, OBJC_ASSOCIATION_RETAIN); + } + + UiLayout layout = UI_INIT_LAYOUT(args); + ui_container_add(obj, button, &layout, FALSE); + + return (__bridge void*)button; +} + +int64_t ui_radiobuttons_get(UiInteger *i) { + return 0; +} + +void ui_radiobuttons_set(UiInteger *i, int64_t value) { + +}