add option for static listview/dropdown (GTK)

2 weeks ago

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

add option for static listview/dropdown (GTK)

application/main.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/ui/tree.h file | annotate | diff | comparison | revisions
--- a/application/main.c	Thu Mar 06 19:01:09 2025 +0100
+++ b/application/main.c	Thu Mar 06 19:51:26 2025 +0100
@@ -344,6 +344,10 @@
     
 }
 
+static void action_static_dropdown(UiEvent *event, void *userdata) {
+    printf("dropdown[%d]: %s\n", event->intval, event->eventdata);
+}
+
 void application_startup(UiEvent *event, void *data) {
     // global list
     UiContext *global = ui_global_context();
@@ -407,6 +411,15 @@
                 //model->getvalue = list_getvalue;
                 ui_combobox(obj, .hexpand = true, .vexpand = false, .colspan = 2, .varname = "list", .getvalue = list_getvalue);
                 ui_newline(obj);
+                char *dropdown[] = {
+                    "Sun",
+                    "Apple",
+                    "IBM",
+                    "SGI",
+                    "HP"
+                };
+                ui_combobox(obj, .hexpand = true, .vexpand = false, .colspan = 2, .static_elements = dropdown, .static_nelm = 5, .onactivate = action_static_dropdown);
+                ui_newline(obj);
 
                 ui_hbox0(obj) {
                     ui_radiobutton(obj, .label = "Radio 1", .varname = "radio");
--- a/ui/gtk/list.c	Thu Mar 06 19:01:09 2025 +0100
+++ b/ui/gtk/list.c	Thu Mar 06 19:51:26 2025 +0100
@@ -201,6 +201,14 @@
     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);
     
@@ -248,6 +256,10 @@
         list->setselection = ui_listview_setselection2;
         
         ui_update_liststore(ls, list);
+    } else if (args.static_elements && args.static_nelm > 0) {
+        listview_copy_static_elements(listview, args.static_elements, args.static_nelm);
+        listview->model->getvalue = ui_strmodel_getvalue; // force strmodel
+        ui_update_liststore_static(ls, listview->elements, listview->nelm);
     }
     
     // event handling
@@ -323,11 +335,15 @@
         list->setselection = ui_combobox_setselection;
         
         ui_update_liststore(ls, list);
+    } else if (args.static_elements && args.static_nelm > 0) {
+        listview_copy_static_elements(listview, args.static_elements, args.static_nelm);
+        listview->model->getvalue = ui_strmodel_getvalue; // force strmodel
+        ui_update_liststore_static(ls, listview->elements, listview->nelm);
     }
     
     // event handling
     if(args.onactivate) {
-        g_signal_connect(view, "activate", G_CALLBACK(ui_columnview_activate), listview);
+        g_signal_connect(view, "notify::selected", G_CALLBACK(ui_dropdown_notify), listview);
     }
     
     // add widget to parent 
@@ -478,6 +494,23 @@
         free(newselection);
     }
 }
+
+void ui_dropdown_notify(GtkWidget *dropdown, GObject *pspec, gpointer userdata) {
+    UiListView *view = userdata;
+    guint index = gtk_drop_down_get_selected(GTK_DROP_DOWN(dropdown));
+    GObject *item = gtk_drop_down_get_selected_item(GTK_DROP_DOWN(dropdown));
+    if(item && view->onactivate) {
+        ObjWrapper *eventdata = (ObjWrapper*)item;
+        UiEvent event;
+        event.obj = view->obj;
+        event.document = event.obj->ctx->document;
+        event.window = event.obj->window;
+        event.intval = index;
+        event.eventdata = eventdata->data;
+        view->onactivate(&event, view->onactivatedata);
+    }
+}
+    
     
 void ui_columnview_activate(void *ignore, guint position, gpointer userdata) {
     UiListView *view = userdata;
@@ -524,6 +557,14 @@
     }
 }
 
+void ui_update_liststore_static(GListStore *liststore, char **elm, size_t nelm) {
+    g_list_store_remove_all(liststore);
+    for(int i=0;i<nelm;i++) {
+        ObjWrapper *obj = obj_wrapper_new(elm[i]);
+        g_list_store_append(liststore, obj);
+    }
+}
+
 void ui_listview_update2(UiList *list, int i) {
     UiListView *view = list->obj;
     ui_update_liststore(view->liststore, list);
@@ -1496,7 +1537,15 @@
 
 void ui_listview_destroy(GtkWidget *w, UiListView *v) {
     //gtk_tree_view_set_model(GTK_TREE_VIEW(w), NULL);
-    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);
+    }
 #if GTK_CHECK_VERSION(4, 10, 0)
     free(v->columns);
 #endif
--- a/ui/gtk/list.h	Thu Mar 06 19:01:09 2025 +0100
+++ b/ui/gtk/list.h	Thu Mar 06 19:51:26 2025 +0100
@@ -45,6 +45,8 @@
     GtkWidget         *widget;
     UiVar             *var;
     UiModel           *model;
+    char              **elements;
+    size_t            nelm;
 #if GTK_CHECK_VERSION(4, 10, 0)
     GListStore        *liststore;
     GtkSelectionModel *selectionmodel;
@@ -100,7 +102,6 @@
     void                     *onactivatedata;
     ui_callback              onbuttonclick;
     void                     *onbuttonclickdata;
-    
     GtkListBoxRow            *first_row;
 };
 
@@ -108,11 +109,13 @@
 #if GTK_CHECK_VERSION(4, 10, 0)
 
 void ui_update_liststore(GListStore *liststore, UiList *list);
+void ui_update_liststore_static(GListStore *liststore, char **elm, size_t nelm);
 
 void ui_listview_update2(UiList *list, int i);
 UiListSelection ui_listview_getselection2(UiList *list);
 void ui_listview_setselection2(UiList *list, UiListSelection selection);
 
+void ui_dropdown_notify(GtkWidget *dropdown, GObject *pspec, gpointer userdata);
 void ui_columnview_activate(void *ignore, guint position, gpointer userdata);
 void ui_listview_selection_changed(GtkSelectionModel* self, guint position, guint n_items, gpointer user_data);
 
--- a/ui/ui/tree.h	Thu Mar 06 19:01:09 2025 +0100
+++ b/ui/ui/tree.h	Thu Mar 06 19:51:26 2025 +0100
@@ -118,6 +118,8 @@
     UiList* list;
     const char* varname;
     UiModel* model;
+    char **static_elements;
+    size_t static_nelm;
     ui_getvaluefunc getvalue;
     ui_callback onactivate;
     void* onactivatedata;

mercurial