diff -r 71446363dcf9 -r 471ca81a72f5 ui/gtk/list.c --- 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;inumcolumns;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);