--- a/ui/gtk/list.c Thu May 15 12:55:54 2025 +0200 +++ b/ui/gtk/list.c Thu May 29 12:03:32 2025 +0200 @@ -189,34 +189,34 @@ return selection_model; } -static UiListView* create_listview(UiObject *obj, UiListArgs args) { +static UiListView* create_listview(UiObject *obj, UiListArgs *args) { UiListView *tableview = malloc(sizeof(UiListView)); memset(tableview, 0, sizeof(UiListView)); tableview->obj = obj; - tableview->model = args.model; - tableview->onactivate = args.onactivate; - tableview->onactivatedata = args.onactivatedata; - tableview->onselection = args.onselection; - tableview->onselectiondata = args.onselectiondata; - tableview->ondragstart = args.ondragstart; - tableview->ondragstartdata = args.ondragstartdata; - tableview->ondragcomplete = args.ondragcomplete; - tableview->ondragcompletedata = args.ondragcompletedata; - tableview->ondrop = args.ondrop; - tableview->ondropdata = args.ondropsdata; + tableview->model = args->model; + tableview->onactivate = args->onactivate; + tableview->onactivatedata = args->onactivatedata; + tableview->onselection = args->onselection; + tableview->onselectiondata = args->onselectiondata; + tableview->ondragstart = args->ondragstart; + tableview->ondragstartdata = args->ondragstartdata; + tableview->ondragcomplete = args->ondragcomplete; + tableview->ondragcompletedata = args->ondragcompletedata; + tableview->ondrop = args->ondrop; + tableview->ondropdata = args->ondropsdata; tableview->selection.count = 0; tableview->selection.rows = NULL; return tableview; } -UIWIDGET ui_listview_create(UiObject *obj, UiListArgs args) { +UIWIDGET ui_listview_create(UiObject *obj, UiListArgs *args) { UiObject* current = uic_current_obj(obj); // to simplify things and share code with ui_table_create, we also // use a UiModel for the listview UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1); - model->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue; - args.model = model; + model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue; + args->model = model; GListStore *ls = g_list_store_new(G_TYPE_OBJECT); UiListView *listview = create_listview(obj, args); @@ -230,10 +230,10 @@ g_signal_connect(factory, "setup", G_CALLBACK(column_factory_setup), listview->columns); g_signal_connect(factory, "bind", G_CALLBACK(column_factory_bind), listview->columns); - GtkSelectionModel *selection_model = create_selection_model(listview, ls, args.multiselection); + GtkSelectionModel *selection_model = create_selection_model(listview, ls, args->multiselection); GtkWidget *view = gtk_list_view_new(GTK_SELECTION_MODEL(selection_model), factory); - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST); // init listview listview->widget = view; @@ -256,21 +256,21 @@ 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); + } 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) { + if(args->onactivate) { // columnview and listview can use the same callback function, because // the first parameter (which is technically a different pointer type) // is ignored g_signal_connect(view, "activate", G_CALLBACK(ui_columnview_activate), listview); } - if(args.contextmenu) { - UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, view); + if(args->contextmenu) { + UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, view); ui_widget_set_contextmenu(view, menu); } @@ -282,7 +282,7 @@ GTK_POLICY_AUTOMATIC); // GTK_POLICY_ALWAYS SCROLLEDWINDOW_SET_CHILD(scroll_area, view); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, scroll_area, FALSE); // ct->current should point to view, not scroll_area, to make it possible @@ -292,14 +292,14 @@ return scroll_area; } -UIWIDGET ui_combobox_create(UiObject *obj, UiListArgs args) { +UIWIDGET ui_combobox_create(UiObject *obj, UiListArgs *args) { UiObject* current = uic_current_obj(obj); // to simplify things and share code with ui_tableview_create, we also // use a UiModel for the listview UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1); - model->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue; - args.model = model; + model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue; + args->model = model; GListStore *ls = g_list_store_new(G_TYPE_OBJECT); UiListView *listview = create_listview(obj, args); @@ -316,7 +316,7 @@ GtkWidget *view = gtk_drop_down_new(G_LIST_MODEL(ls), NULL); gtk_drop_down_set_factory(GTK_DROP_DOWN(view), factory); - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST); // init listview listview->widget = view; @@ -339,19 +339,19 @@ 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); + } 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) { + if(args->onactivate) { g_signal_connect(view, "notify::selected", G_CALLBACK(ui_dropdown_notify), listview); } // add widget to parent - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, view, FALSE); return view; } @@ -365,7 +365,7 @@ gtk_drop_down_set_selected(GTK_DROP_DOWN(dropdown), index); } -UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) { +UIWIDGET ui_table_create(UiObject *obj, UiListArgs *args) { UiObject* current = uic_current_obj(obj); GListStore *ls = g_list_store_new(G_TYPE_OBJECT); @@ -375,10 +375,10 @@ // and list updates UiListView *tableview = create_listview(obj, args); - GtkSelectionModel *selection_model = create_selection_model(tableview, ls, args.multiselection); + GtkSelectionModel *selection_model = create_selection_model(tableview, ls, args->multiselection); GtkWidget *view = gtk_column_view_new(GTK_SELECTION_MODEL(selection_model)); - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST); // init tableview tableview->widget = view; @@ -393,7 +393,7 @@ // create columns from UiModel - UiModel *model = args.model; + UiModel *model = args->model; int columns = model ? model->columns : 0; tableview->columns = calloc(columns, sizeof(UiColData)); @@ -439,11 +439,11 @@ } // event handling - if(args.onactivate) { + if(args->onactivate) { g_signal_connect(view, "activate", G_CALLBACK(ui_columnview_activate), tableview); } - if(args.contextmenu) { - UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, view); + if(args->contextmenu) { + UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, view); ui_widget_set_contextmenu(view, menu); } @@ -455,7 +455,7 @@ GTK_POLICY_AUTOMATIC); // GTK_POLICY_ALWAYS SCROLLEDWINDOW_SET_CHILD(scroll_area, view); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, scroll_area, FALSE); // ct->current should point to view, not scroll_area, to make it possible @@ -780,13 +780,13 @@ } -UIWIDGET ui_listview_create(UiObject *obj, UiListArgs args) { +UIWIDGET ui_listview_create(UiObject *obj, UiListArgs *args) { UiObject* current = uic_current_obj(obj); // create treeview GtkWidget *view = gtk_tree_view_new(); - ui_set_name_and_style(view, args.name, args.style_class); - ui_set_widget_groups(obj->ctx, view, args.groups); + ui_set_name_and_style(view, args->name, args->style_class); + ui_set_widget_groups(obj->ctx, view, args->groups); GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes(NULL, renderer, "text", 0, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); @@ -803,9 +803,9 @@ #endif UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1); - model->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue; + model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue; - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST); UiList *list = var ? var->value : NULL; GtkListStore *listmodel = create_list_store(list, model); @@ -835,24 +835,24 @@ // add callback UiTreeEventData *event = malloc(sizeof(UiTreeEventData)); event->obj = obj; - event->activate = args.onactivate; - event->activatedata = args.onactivatedata; - event->selection = args.onselection; - event->selectiondata = args.onselectiondata; + event->activate = args->onactivate; + event->activatedata = args->onactivatedata; + event->selection = args->onselection; + event->selectiondata = args->onselectiondata; g_signal_connect( view, "destroy", G_CALLBACK(ui_destroy_userdata), event); - if(args.onactivate) { + if(args->onactivate) { g_signal_connect( view, "row-activated", G_CALLBACK(ui_listview_activate_event), event); } - if(args.onselection) { + if(args->onselection) { GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(view)); g_signal_connect( @@ -861,8 +861,8 @@ G_CALLBACK(ui_listview_selection_event), event); } - if(args.contextmenu) { - UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, view); + if(args->contextmenu) { + UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, view); ui_widget_set_contextmenu(view, menu); } @@ -875,7 +875,7 @@ GTK_POLICY_AUTOMATIC); // GTK_POLICY_ALWAYS SCROLLEDWINDOW_SET_CHILD(scroll_area, view); - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, scroll_area, FALSE); // ct->current should point to view, not scroll_area, to make it possible @@ -896,13 +896,13 @@ gtk_combo_box_set_active(GTK_COMBO_BOX(dropdown), index); } -UIWIDGET ui_table_create(UiObject *obj, UiListArgs args) { +UIWIDGET ui_table_create(UiObject *obj, UiListArgs *args) { UiObject* current = uic_current_obj(obj); // create treeview GtkWidget *view = gtk_tree_view_new(); - UiModel *model = args.model; + UiModel *model = args->model; int columns = model ? model->columns : 0; int addi = 0; @@ -959,7 +959,7 @@ #endif - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->list, args->varname, UI_VAR_LIST); UiList *list = var ? var->value : NULL; GtkListStore *listmodel = create_list_store(list, model); @@ -977,12 +977,12 @@ tableview->widget = view; tableview->var = var; tableview->model = model; - tableview->ondragstart = args.ondragstart; - tableview->ondragstartdata = args.ondragstartdata; - tableview->ondragcomplete = args.ondragcomplete; - tableview->ondragcompletedata = args.ondragcompletedata; - tableview->ondrop = args.ondrop; - tableview->ondropdata = args.ondropsdata; + tableview->ondragstart = args->ondragstart; + tableview->ondragstartdata = args->ondragstartdata; + tableview->ondragcomplete = args->ondragcomplete; + tableview->ondragcompletedata = args->ondragcompletedata; + tableview->ondrop = args->ondrop; + tableview->ondropdata = args->ondropsdata; tableview->selection.count = 0; tableview->selection.rows = NULL; g_signal_connect( @@ -1000,18 +1000,18 @@ // add callback UiTreeEventData *event = ui_malloc(obj->ctx, sizeof(UiTreeEventData)); event->obj = obj; - event->activate = args.onactivate; - event->selection = args.onselection; - event->activatedata = args.onactivatedata; - event->selectiondata = args.onselectiondata; - if(args.onactivate) { + event->activate = args->onactivate; + event->selection = args->onselection; + event->activatedata = args->onactivatedata; + event->selectiondata = args->onselectiondata; + if(args->onactivate) { g_signal_connect( view, "row-activated", G_CALLBACK(ui_listview_activate_event), event); } - if(args.onselection) { + if(args->onselection) { GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(view)); g_signal_connect( @@ -1023,15 +1023,15 @@ // TODO: destroy callback - if(args.ondragstart) { + if(args->ondragstart) { ui_listview_add_dnd(tableview, &args); } - if(args.ondrop) { + if(args->ondrop) { ui_listview_enable_drop(tableview, &args); } GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(view)); - if(args.multiselection) { + if(args->multiselection) { gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); } @@ -1043,8 +1043,8 @@ GTK_POLICY_AUTOMATIC); // GTK_POLICY_ALWAYS SCROLLEDWINDOW_SET_CHILD(scroll_area, view); - if(args.contextmenu) { - UIMENU menu = ui_contextmenu_create(args.contextmenu, obj, scroll_area); + if(args->contextmenu) { + UIMENU menu = ui_contextmenu_create(args->contextmenu, obj, scroll_area); #if GTK_MAJOR_VERSION >= 4 ui_widget_set_contextmenu(scroll_area, menu); #else @@ -1052,7 +1052,7 @@ #endif } - UI_APPLY_LAYOUT1(current, args); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, scroll_area, FALSE); // ct->current should point to view, not scroll_area, to make it possible @@ -1102,18 +1102,18 @@ /* --------------------------- ComboBox --------------------------- */ -UIWIDGET ui_combobox_create(UiObject *obj, UiListArgs args) { +UIWIDGET ui_combobox_create(UiObject *obj, UiListArgs *args) { UiObject* current = uic_current_obj(obj); UiModel *model = ui_model(obj->ctx, UI_STRING, "", -1); - model->getvalue = args.getvalue ? args.getvalue : ui_strmodel_getvalue; + model->getvalue = args->getvalue ? args->getvalue : ui_strmodel_getvalue; - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.list, args.varname, UI_VAR_LIST); + 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.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); + 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_LAYOUT2(current, args); current->container->add(current->container, combobox, FALSE); current->container->current = combobox; return combobox; @@ -1758,7 +1758,7 @@ cxListAdd(sublists, &uisublist); } -UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs args) { +UIEXPORT UIWIDGET ui_sourcelist_create(UiObject *obj, UiSourceListArgs *args) { UiObject* current = uic_current_obj(obj); #ifdef UI_GTK3 @@ -1766,7 +1766,7 @@ #else GtkWidget *listbox = gtk_list_box_new(); #endif - if(!args.style_class) { + if(!args->style_class) { #if GTK_MAJOR_VERSION >= 4 WIDGET_ADD_CSS_CLASS(listbox, "navigation-sidebar"); #else @@ -1777,31 +1777,31 @@ GtkWidget *scroll_area = SCROLLEDWINDOW_NEW(); SCROLLEDWINDOW_SET_CHILD(scroll_area, listbox); - ui_set_name_and_style(listbox, args.name, args.style_class); - ui_set_widget_groups(obj->ctx, listbox, args.groups); - UI_APPLY_LAYOUT1(current, args); + ui_set_name_and_style(listbox, args->name, args->style_class); + ui_set_widget_groups(obj->ctx, listbox, args->groups); + UI_APPLY_LAYOUT2(current, args); current->container->add(current->container, scroll_area, TRUE); UiListBox *uilistbox = malloc(sizeof(UiListBox)); uilistbox->obj = obj; uilistbox->listbox = GTK_LIST_BOX(listbox); - uilistbox->getvalue = args.getvalue; - uilistbox->onactivate = args.onactivate; - uilistbox->onactivatedata = args.onactivatedata; - uilistbox->onbuttonclick = args.onbuttonclick; - uilistbox->onbuttonclickdata = args.onbuttonclickdata; + uilistbox->getvalue = args->getvalue; + uilistbox->onactivate = args->onactivate; + uilistbox->onactivatedata = args->onactivatedata; + uilistbox->onbuttonclick = args->onbuttonclick; + uilistbox->onbuttonclickdata = args->onbuttonclickdata; uilistbox->sublists = cxArrayListCreateSimple(sizeof(UiListBoxSubList), 4); uilistbox->sublists->collection.advanced_destructor = (cx_destructor_func2)sublist_destroy; uilistbox->sublists->collection.destructor_data = obj; uilistbox->first_row = NULL; - if(args.sublists) { + if(args->sublists) { // static sublist initalization - if(args.numsublists == 0 && args.sublists) { - args.numsublists = INT_MAX; + if(args->numsublists == 0 && args->sublists) { + args->numsublists = INT_MAX; } - for(int i=0;i<args.numsublists;i++) { - UiSubList sublist = args.sublists[i]; + for(int i=0;i<args->numsublists;i++) { + UiSubList sublist = args->sublists[i]; if(!sublist.varname && !sublist.value) { break; } @@ -1812,7 +1812,7 @@ // fill items ui_listbox_update(uilistbox, 0, cxListSize(uilistbox->sublists)); } else { - UiVar* var = uic_widget_var(obj->ctx, current->ctx, args.dynamic_sublist, args.varname, UI_VAR_LIST); + UiVar* var = uic_widget_var(obj->ctx, current->ctx, args->dynamic_sublist, args->varname, UI_VAR_LIST); if(var) { UiList *list = var->value; list->obj = uilistbox; @@ -1834,7 +1834,7 @@ G_CALLBACK(ui_destroy_sourcelist), uilistbox); - if(args.onactivate) { + if(args->onactivate) { g_signal_connect( listbox, "row-activated",