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