--- 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