implement radiobutton (QT)

7 days ago

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 04 Apr 2025 22:16:29 +0200 (7 days ago)
changeset 550
0412c4c1048e
parent 549
63d53ce4dd67
child 551
0e543e1d060e

implement radiobutton (QT)

application/main.c file | annotate | diff | comparison | revisions
ui/qt/button.cpp file | annotate | diff | comparison | revisions
--- a/application/main.c	Fri Apr 04 22:08:34 2025 +0200
+++ b/application/main.c	Fri Apr 04 22:16:29 2025 +0200
@@ -786,6 +786,14 @@
         
         ui_button(obj, .label = "Button Y");
         ui_checkbox(obj, .label = "Checkbox");
+        ui_newline(obj);
+        
+        ui_hbox(obj, .colspan = 3) {
+            ui_radiobutton(obj, .label = "Radio 1", .varname = "radio");
+            ui_radiobutton(obj, .label = "Radio 2", .varname = "radio");
+            ui_radiobutton(obj, .label = "Radio 3", .varname = "radio");
+            ui_radiobutton(obj, .label = "Radio 4", .varname = "radio");
+        }
     }
     ui_show(obj);
 }
--- a/ui/qt/button.cpp	Fri Apr 04 22:08:34 2025 +0200
+++ b/ui/qt/button.cpp	Fri Apr 04 22:16:29 2025 +0200
@@ -163,3 +163,53 @@
         button->setChecked(true);
     }
 }
+
+
+UIWIDGET ui_radiobutton_create(UiObject *obj, UiToggleArgs args) {
+    UiContainerPrivate *ctn = ui_obj_container(obj);
+    UI_APPLY_LAYOUT(ctn->layout, args);
+    
+    QString str = QString::fromUtf8(args.label);
+    QRadioButton *button = new QRadioButton(str);
+    button->setAutoExclusive(false);
+    
+    UiVar* var = uic_widget_var(obj->ctx, obj->ctx, args.value, args.varname, UI_VAR_INTEGER);
+    if(var) {
+        UiInteger *value = (UiInteger*)var->value;
+        QButtonGroup *buttonGroup = (QButtonGroup*)value->obj;
+        if(!buttonGroup) {
+            buttonGroup = new QButtonGroup();
+            value->obj = buttonGroup;
+        }
+        int id = buttonGroup->buttons().size()+1;
+        buttonGroup->addButton(button, id);
+        if(value->value == id) {
+            button->setChecked(true);
+        }
+        value->get = ui_radiobutton_get;
+        value->set = ui_radiobutton_set;
+    }
+    
+    // TODO: unbind var/remove button from buttongroup when the button is destroyed
+    // TODO: implement callback
+    // TODO: implement value observer
+    
+    ctn->add(button, false);
+    
+    return button;
+}
+
+int64_t ui_radiobutton_get(UiInteger *value) {
+    QButtonGroup *buttonGroup = (QButtonGroup*)value->obj;
+    value->value = buttonGroup->checkedId();
+    return value->value;
+}
+
+void ui_radiobutton_set(UiInteger *value, int64_t i) {
+    QButtonGroup *buttonGroup = (QButtonGroup*)value->obj;
+    QAbstractButton *button = buttonGroup->button(i);
+    if(button) {
+        button->setChecked(true);
+        value->value = i;
+    }
+}

mercurial