ui/gtk/list.c

changeset 979
471ca81a72f5
parent 973
aa39a986da78
--- a/ui/gtk/list.c	Mon Dec 08 10:53:56 2025 +0100
+++ b/ui/gtk/list.c	Mon Dec 08 11:36:46 2025 +0100
@@ -412,7 +412,7 @@
     }
 }
 
-static void column_factory_unbind(GtkSignalListItemFactory *self, GtkListItem *item, UiColData *col) {
+static void column_factory_unbind(GtkSignalListItemFactory *self, GtkListItem *item, UiColData *col) {  
     ObjWrapper *obj = gtk_list_item_get_item(item);
     UiListView *listview = col->listview;
     CxHashKey row_key = cx_hash_key(&obj->i, sizeof(int));
@@ -473,6 +473,7 @@
     GtkListItemFactory *factory = gtk_signal_list_item_factory_new();
     g_signal_connect(factory, "setup", G_CALLBACK(column_factory_setup), &listview->coldata);
     g_signal_connect(factory, "bind", G_CALLBACK(column_factory_bind), &listview->coldata);
+    g_signal_connect(factory, "unbind", G_CALLBACK(column_factory_unbind), &listview->coldata);
     
     GtkSelectionModel *selection_model = create_selection_model(listview, ls, args->multiselection);
     GtkWidget *view = gtk_list_view_new(GTK_SELECTION_MODEL(selection_model), factory);
@@ -757,11 +758,27 @@
     }
     
     gtk_column_view_set_model(GTK_COLUMN_VIEW(listview->widget), NULL);
+    cxMapClear(listview->bound_rows);
     
     if(insert_index) {
-        listview->columns[insert_index] = insert_index;
+        int prev = 0;
+        if(insert_index > 0) {
+            prev = listview->columns[insert_index-1];
+        }
+        listview->columns[insert_index] = prev+1;
         add_column(listview, insert_index);
-        // TODO: adjust data_column if insert_index < numcolumns
+        
+        if(insert_index+1 < listview->numcolumns) {
+            // the data index of trailing columns must be adjusted
+            UiModelType type = model->types[insert_index];
+            int add = 1;
+            if(type == UI_ICON_TEXT || type == UI_ICON_TEXT_FREE) {
+                add++;
+            }
+            for(int i=insert_index+1;i<listview->numcolumns;i++) {
+                listview->columns[i] += add;
+            }
+        }
     } // TODO: delete_index
     
     GListStore *ls = g_list_store_new(G_TYPE_OBJECT);
@@ -904,6 +921,7 @@
     UiListView *view = list->obj;
     view->current_row = -1;
     if(i < 0) {
+        cxMapClear(view->bound_rows);
         ui_update_liststore(view->liststore, list);
     } else {
         void *value = list->get(list, i);

mercurial