--- a/ui/cocoa/button.m Sat Apr 05 17:57:04 2025 +0200 +++ b/ui/cocoa/button.m Sun Jul 20 22:04:39 2025 +0200 @@ -31,15 +31,15 @@ #import "Container.h" #import <objc/runtime.h> -UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs args) { +UIWIDGET ui_button_create(UiObject* obj, UiButtonArgs *args) { NSButton *button = [[NSButton alloc] init]; - if(args.label) { - NSString *label = [[NSString alloc] initWithUTF8String:args.label]; + if(args->label) { + NSString *label = [[NSString alloc] initWithUTF8String:args->label]; button.title = label; } - if(args.onclick) { - EventData *event = [[EventData alloc] init:args.onclick userdata:args.onclickdata]; + if(args->onclick) { + EventData *event = [[EventData alloc] init:args->onclick userdata:args->onclickdata]; event.obj = obj; button.target = event; button.action = @selector(handleEvent:); @@ -59,17 +59,17 @@ *value = (int)state; } -UIWIDGET togglebutton_create(UiObject* obj, UiToggleArgs args, enum NSButtonType type) { +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]; + 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); + 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; @@ -77,8 +77,8 @@ i->set = ui_togglebutton_set; } - if(args.onchange) { - EventData *event = [[EventData alloc] init:args.onchange userdata:args.onchangedata]; + if(args->onchange) { + EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata]; event.get_eventdata = togglebutton_eventdata; event.obj = obj; event.var = var; @@ -113,11 +113,11 @@ button.state = state; } -UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_togglebutton_create(UiObject* obj, UiToggleArgs *args) { return togglebutton_create(obj, args, NSButtonTypePushOnPushOff); } -UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs args) { +UIWIDGET ui_checkbox_create(UiObject* obj, UiToggleArgs *args) { return togglebutton_create(obj, args, NSButtonTypeSwitch); } @@ -127,10 +127,10 @@ *value = (int)state; } -UIWIDGET ui_switch_create(UiObject* obj, UiToggleArgs args) { +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); + 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; @@ -138,8 +138,8 @@ i->set = ui_switch_set; } - if(args.onchange) { - EventData *event = [[EventData alloc] init:args.onchange userdata:args.onchangedata]; + if(args->onchange) { + EventData *event = [[EventData alloc] init:args->onchange userdata:args->onchangedata]; event.get_eventdata = switch_eventdata; event.obj = obj; event.var = var; @@ -174,17 +174,45 @@ button.state = state; } + +@implementation UiRadioButton + +- (UiRadioButton*)init { + self = [super init]; + _direct_state = NO; + [self setButtonType:NSButtonTypeRadio]; + return self; +} + +- (void)setState:(NSControlStateValue)state { + // NOOP +} + +@end + static void radiobutton_eventdata(id button, UiVar *var, void **eventdata, int *value) { if(var) { - printf("switch radiobutton\n"); + UiInteger *value = var->value; + NSMutableArray *buttons = (__bridge NSMutableArray*)value->obj; + for(UiRadioButton *b in buttons) { + if(b != button) { + b.direct_state = YES; + [[b cell] setState:0]; + b.direct_state = NO; + } + } } } -UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs args) { - NSButton *button = [[NSButton alloc] init]; - [button setButtonType:NSButtonTypeRadio]; +UIWIDGET ui_radiobutton_create(UiObject* obj, UiToggleArgs *args) { + UiRadioButton *button = [[UiRadioButton alloc] init]; - UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER); + if(args->label) { + button.title = [[NSString alloc] initWithUTF8String:args->label]; + } + + UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args->value, args->varname, UI_VAR_INTEGER); + button.var = var; NSMutableArray *buttons = nil; if(var) { UiInteger *i = var->value; @@ -199,8 +227,8 @@ objc_setAssociatedObject(button, "radiogroup", buttons, OBJC_ASSOCIATION_RETAIN); } - if(args.onchange || var) { - EventData *event = [[EventData alloc] init:args.onchange userdata:args.onchangedata]; + 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; @@ -220,9 +248,27 @@ } int64_t ui_radiobuttons_get(UiInteger *i) { - return 0; + NSMutableArray *buttons = (__bridge NSMutableArray*)i->obj; + int64_t index = 0; + for(UiRadioButton *b in buttons) { + if([b cell].state != 0) { + i->value = index + 1; + break; + } + index++; + } + return i->value; } void ui_radiobuttons_set(UiInteger *i, int64_t value) { - + NSMutableArray *buttons = (__bridge NSMutableArray*)i->obj; + int64_t index = 1; + for(UiRadioButton *b in buttons) { + if(index == value) { + [b cell].state = NSControlStateValueOn; + } else { + [b cell].state = NSControlStateValueOff; + } + index++; + } }