fix gtk3 build and implement new combobox

2 weeks ago

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Thu, 06 Mar 2025 20:19:49 +0100 (2 weeks ago)
changeset 490
0206161e92d5
parent 489
073a5e893050
child 491
beb5963c3501

fix gtk3 build and implement new combobox

application/main.c file | annotate | diff | comparison | revisions
ui/gtk/container.c file | annotate | diff | comparison | revisions
ui/gtk/list.c file | annotate | diff | comparison | revisions
ui/gtk/list.h file | annotate | diff | comparison | revisions
ui/gtk/toolkit.h file | annotate | diff | comparison | revisions
--- a/application/main.c	Thu Mar 06 19:51:26 2025 +0100
+++ b/application/main.c	Thu Mar 06 20:19:49 2025 +0100
@@ -502,7 +502,7 @@
           cxstring html = CX_STR("<html><body><h1>Hello Toolkit</h1><p>Toolkit WebView</p></body></html>");
           ui_webview_load_content(doc->web, "mypage", html.ptr, html.length, NULL, NULL);
 #else
-          ui_label(obj, "Webview is not supported");
+          ui_label(obj, .label = "Webview is not supported");
 #endif
         }
         ui_tab(obj, "Tab 10") {
--- a/ui/gtk/container.c	Thu Mar 06 19:51:26 2025 +0100
+++ b/ui/gtk/container.c	Thu Mar 06 20:19:49 2025 +0100
@@ -1068,16 +1068,16 @@
     cxListAdd(s->children, widget);
     
     if(s->pos == 0) {
-        gtk_paned_set_start_child(GTK_PANED(s->current_pane), widget);
+        PANED_SET_CHILD1(s->current_pane, widget);
         s->pos++;
         s->nchildren++;
     } else {
         if(s->nchildren+1 == s->max) {
-            gtk_paned_set_end_child(GTK_PANED(s->current_pane), widget);
+            PANED_SET_CHILD2(s->current_pane, widget);
         } else {
             GtkWidget *pane = create_paned(s->orientation);
-            gtk_paned_set_start_child(GTK_PANED(pane), widget);
-            gtk_paned_set_end_child(GTK_PANED(s->current_pane), pane);
+            PANED_SET_CHILD1(pane, widget);
+            PANED_SET_CHILD2(s->current_pane, pane);
             s->current_pane = pane;
         }
         
--- a/ui/gtk/list.c	Thu Mar 06 19:51:26 2025 +0100
+++ b/ui/gtk/list.c	Thu Mar 06 20:19:49 2025 +0100
@@ -57,6 +57,14 @@
     };
 */
 
+static void listview_copy_static_elements(UiListView *listview, char **elm, size_t nelm) {
+    listview->elements = calloc(nelm, sizeof(char*));
+    listview->nelm = nelm;
+    for(int i=0;i<nelm;i++) {
+        listview->elements[i] = strdup(elm[i]);
+    }
+}
+
 #if GTK_CHECK_VERSION(4, 10, 0)
 
 
@@ -201,14 +209,6 @@
     return tableview;
 }
 
-static void listview_copy_static_elements(UiListView *listview, char **elm, size_t nelm) {
-    listview->elements = calloc(nelm, sizeof(char*));
-    listview->nelm = nelm;
-    for(int i=0;i<nelm;i++) {
-        listview->elements[i] = strdup(elm[i]);
-    }
-}
-
 UIWIDGET ui_listview_create(UiObject *obj, UiListArgs args) {
     UiObject* current = uic_current_obj(obj);
     
@@ -770,6 +770,7 @@
     g_object_unref(listmodel);
     
     UiListView *listview = malloc(sizeof(UiListView));
+    memset(listview, 0, sizeof(UiListView));
     listview->obj = obj;
     listview->widget = view;
     listview->var = var;
@@ -917,6 +918,7 @@
     // add TreeView as observer to the UiList to update the TreeView if the
     // data changes
     UiListView *tableview = malloc(sizeof(UiListView));
+    memset(tableview, 0, sizeof(UiListView));
     tableview->obj = obj;
     tableview->widget = view;
     tableview->var = var;
@@ -1043,7 +1045,7 @@
     
     UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST);
     
-    GtkWidget *combobox = ui_create_combobox(obj, model, var, args.onactivate, args.onactivatedata);
+    GtkWidget *combobox = ui_create_combobox(obj, model, var, args.static_elements, args.static_nelm, args.onactivate, args.onactivatedata);
     ui_set_name_and_style(combobox, args.name, args.style_class);
     ui_set_widget_groups(obj->ctx, combobox, args.groups);
     UI_APPLY_LAYOUT1(current, args);
@@ -1052,16 +1054,29 @@
     return combobox;
 }
 
-GtkWidget* ui_create_combobox(UiObject *obj, UiModel *model, UiVar *var, ui_callback f, void *udata) {
+GtkWidget* ui_create_combobox(UiObject *obj, UiModel *model, UiVar *var, char **elm, size_t nelm, ui_callback f, void *udata) {
     GtkWidget *combobox = gtk_combo_box_new();
        
     UiListView *uicbox = malloc(sizeof(UiListView));
+    memset(uicbox, 0, sizeof(UiListView));
     uicbox->obj = obj;
     uicbox->widget = combobox;
     
     UiList *list = var ? var->value : NULL;
     GtkListStore *listmodel = create_list_store(list, model);
     
+    if(!list && elm && nelm > 0) {
+        listview_copy_static_elements(uicbox, elm, nelm);
+        for(int i=0;i<nelm;i++) {
+            GtkTreeIter iter;
+            GValue value = G_VALUE_INIT;
+            gtk_list_store_insert(listmodel, &iter, -1);
+            g_value_init(&value, G_TYPE_STRING);
+            g_value_set_string(&value, uicbox->elements[i]);
+            gtk_list_store_set_value(listmodel, &iter, 0, &value);
+        }
+    }
+    
     if(listmodel) {
         gtk_combo_box_set_model(GTK_COMBO_BOX(combobox), GTK_TREE_MODEL(listmodel));
         g_object_unref(listmodel);
@@ -1101,7 +1116,7 @@
         event->userdata = udata;
         event->callback = f;
         event->value = 0;
-        event->customdata = NULL;
+        event->customdata = uicbox;
 
         g_signal_connect(
                 combobox,
@@ -1114,12 +1129,22 @@
 }
 
 void ui_combobox_change_event(GtkComboBox *widget, UiEventData *e) {
+    int index = gtk_combo_box_get_active(widget);
+    UiListView *listview = e->customdata;
+    void *eventdata = NULL;
+    if(listview->var && listview->var->value) {
+        UiList *list = listview->var->value;
+        eventdata = ui_list_get(list, index);
+    } else if(listview->elements && listview->nelm > index) {
+        eventdata = listview->elements[index];
+    } 
+    
     UiEvent event;
     event.obj = e->obj;
     event.window = event.obj->window;
     event.document = event.obj->ctx->document;
-    event.eventdata = NULL;
-    event.intval = gtk_combo_box_get_active(widget);
+    event.eventdata = eventdata;
+    event.intval = index;
     e->callback(&event, e->userdata);
 }
 
@@ -1554,7 +1579,15 @@
 }
 
 void ui_combobox_destroy(GtkWidget *w, UiListView *v) {
-    ui_destroy_boundvar(v->obj->ctx, v->var);
+    if(v->var) {
+        ui_destroy_boundvar(v->obj->ctx, v->var);
+    }
+    if(v->elements) {
+        for(int i=0;i<v->nelm;i++) {
+            free(v->elements[i]);
+        }
+        free(v->elements);
+    }
     free(v);
 }
 
--- a/ui/gtk/list.h	Thu Mar 06 19:51:26 2025 +0100
+++ b/ui/gtk/list.h	Thu Mar 06 20:19:49 2025 +0100
@@ -158,7 +158,7 @@
 void ui_listview_enable_drop(UiListView *listview, UiListArgs *args);
 
 UIWIDGET ui_combobox_var(UiObject *obj, UiVar *var, ui_getvaluefunc getvalue, ui_callback f, void *udata);
-GtkWidget* ui_create_combobox(UiObject *obj, UiModel *model, UiVar *var, ui_callback f, void *udata);
+GtkWidget* ui_create_combobox(UiObject *obj, UiModel *model, UiVar *var, char **elm, size_t nelm, ui_callback f, void *udata);
 void ui_combobox_change_event(GtkComboBox *widget, UiEventData *e);
 void ui_combobox_modelupdate(UiList *list, int i);
 UiListSelection ui_combobox_getselection(UiList *list);
--- a/ui/gtk/toolkit.h	Thu Mar 06 19:51:26 2025 +0100
+++ b/ui/gtk/toolkit.h	Thu Mar 06 20:19:49 2025 +0100
@@ -74,6 +74,8 @@
 #define ICON_IMAGE(icon) gtk_image_new_from_icon_name(icon)
 #define LISTBOX_REMOVE(listbox, row) gtk_list_box_remove(GTK_LIST_BOX(listbox), row)
 #define LISTBOX_ROW_SET_CHILD(row, child) gtk_list_box_row_set_child(GTK_LIST_BOX_ROW(row), child)
+#define PANED_SET_CHILD1(paned, child) gtk_paned_set_start_child(GTK_PANED(paned), child)
+#define PANED_SET_CHILD2(paned, child) gtk_paned_set_end_child(GTK_PANED(paned), child)
 #else
 #define WINDOW_SHOW(window) gtk_widget_show_all(window)
 #define WINDOW_DESTROY(window) gtk_widget_destroy(window)
@@ -94,6 +96,8 @@
 #define ICON_IMAGE(icon) gtk_image_new_from_icon_name(icon, GTK_ICON_SIZE_BUTTON)
 #define LISTBOX_REMOVE(listbox, row) gtk_container_remove(GTK_CONTAINER(listbox), row)
 #define LISTBOX_ROW_SET_CHILD(row, child) gtk_container_add(GTK_CONTAINER(row), child)
+#define PANED_SET_CHILD1(paned, child) gtk_paned_pack1(GTK_PANED(paned), child, TRUE, TRUE)
+#define PANED_SET_CHILD2(paned, child) gtk_paned_pack2(GTK_PANED(paned), child, TRUE, TRUE)
 #endif
     
 #ifdef UI_GTK2

mercurial