2 weeks ago
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);