ui/gtk/list.c

changeset 594
fc854e0ab924
parent 593
7061c9cf3b52
child 598
7b03db81caf8
--- 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",

mercurial