--- a/ui/cocoa/button.m Thu Apr 10 21:18:14 2025 +0200 +++ b/ui/cocoa/button.m Sat Apr 12 19:21:15 2025 +0200 @@ -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]; + UiRadioButton *button = [[UiRadioButton alloc] init]; + + 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; @@ -220,9 +248,28 @@ } 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; + break; + } + index++; + } + return index; } void ui_radiobuttons_set(UiInteger *i, int64_t value) { - + NSMutableArray *buttons = (__bridge NSMutableArray*)i->obj; + int64_t index = 0; + for(UiRadioButton *b in buttons) { + if(index == value) { + [b cell].state = NSControlStateValueOn; + } else { + [b cell].state = NSControlStateValueOff; + } + index++; + } + return index; }