ui/cocoa/button.m

changeset 108
77254bd6dccb
parent 102
64ded9f6a6c6
child 109
c3dfcb8f0be7
--- 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++;
+    }
 }

mercurial