ui/cocoa/button.m

changeset 102
64ded9f6a6c6
parent 100
d2bd73d28ff1
--- 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) {
+    
+}

mercurial