You can save the sort order of an id column in the liststore with an array. It might be useful to keep a copy of the current id order so that it could be restored if need be.
I don’t have how to update a liststore with joined tables figured out without a copy. Maybe update a sqlite in memory database and go through and compare and update all row values in the liststore that have changed.
Eric
/*
gcc -Wall sort_list1.c -o sort_list1 `pkg-config --cflags --libs gtk+-3.0`
With Ubuntu18.04 and GTK3.22.
*/
#include<gtk/gtk.h>
enum
{
ID,
PROGRAM,
IMAGE,
COLUMNS
};
static void get_list_order(GtkTreeModel *tree_model, GtkTreePath *path, GtkTreeIter *iter, gpointer new_order, GArray *list_order)
{
gint i=0;
GtkTreeIter tree_iter;
guint value=0;
gint len=list_order->len;
for(i=len;i>0;i--) g_array_remove_index_fast(list_order, i-1);
if(gtk_tree_model_get_iter_first(tree_model, &tree_iter))
{
do{
gtk_tree_model_get(tree_model, &tree_iter, 0, &value, -1);
g_print("%i ", value);
g_array_append_val(list_order, value);
}while(gtk_tree_model_iter_next(tree_model, &tree_iter));
g_print("\n ");
}
for(i=0;i<list_order->len;i++) g_print("%i ", g_array_index(list_order, gint, i));
g_print("\n");
}
int main(int argc, char *argv[])
{
gtk_init(&argc, &argv);
GtkWidget *window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Tree Sort");
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 300, 150);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
gint i=0;
GArray *list_order=g_array_new(FALSE, FALSE, sizeof(gint));
GtkTreeIter iter;
GtkListStore *store = gtk_list_store_new(COLUMNS, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_INT);
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, ID, 0, PROGRAM, "R", IMAGE, 1, -1);
g_array_append_val(list_order, i);
i=2;
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, ID, 1, PROGRAM, "R", IMAGE, 2, -1);
g_array_append_val(list_order, i);
i=1;
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, ID, 2, PROGRAM, "R", IMAGE, 3, -1);
g_array_append_val(list_order, i);
i=3;
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, ID, 3, PROGRAM, "A", IMAGE, 1, -1);
g_array_append_val(list_order, i);
i=4;
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, ID, 4, PROGRAM, "A", IMAGE, 2, -1);
g_array_append_val(list_order, i);
i=5;
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, ID, 5, PROGRAM, "A", IMAGE, 3, -1);
g_array_append_val(list_order, i);
i=6;
gtk_list_store_append(store, &iter);
gtk_list_store_set(store, &iter, ID, 6, PROGRAM, "S", IMAGE, 1, -1);
g_array_append_val(list_order, i);
//Order the list with the array.
//gtk_list_store_reorder(store, (gint*)(list_order->data));
GtkTreeModel *sort_model=gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(store));
g_signal_connect(sort_model, "rows-reordered", G_CALLBACK(get_list_order), list_order);
g_object_unref(G_OBJECT(store));
GtkWidget *tree=gtk_tree_view_new_with_model(sort_model);
gtk_widget_set_hexpand(tree, TRUE);
gtk_widget_set_vexpand(tree, TRUE);
GtkCellRenderer *renderer1 = gtk_cell_renderer_text_new();
g_object_set(renderer1, "editable", FALSE, NULL);
GtkTreeViewColumn *column1 = gtk_tree_view_column_new_with_attributes("ID", renderer1, "text", ID, NULL);
gtk_tree_view_column_set_sort_column_id(column1, 0);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column1);
GtkTreeViewColumn *column2=gtk_tree_view_column_new_with_attributes("Program", renderer1, "text", PROGRAM, NULL);
gtk_tree_view_column_set_sort_column_id(column2, 1);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column2);
GtkTreeViewColumn *column3=gtk_tree_view_column_new_with_attributes("Image", renderer1, "text", IMAGE, NULL);
//gtk_tree_view_column_set_sort_column_id(column3, 2);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column3);
GtkWidget *scroll=gtk_scrolled_window_new(NULL, NULL);
gtk_container_add(GTK_CONTAINER(scroll), tree);
gtk_container_add(GTK_CONTAINER(window), scroll);
gtk_widget_show_all(window);
gtk_main();
g_array_free(list_order, TRUE);
return 0;
}