On Sat, May 05, 2007 at 06:20:05PM +0800, Jason Brisbane wrote: > I have a treeview that is populated with an Integer value (from a mysql > database) that is populated into a G_TYPE_STRING.
Why? Inappropriate data representation is the source of all your problems. > This displays > correctly but the sort function using: > gtk_tree_view_column_set_sort_column_id (col, x); > gtk_tree_view_column_set_sort_indicator (col, TRUE); > > sorts the values as Alphanumeric, not numeric. > ... > > Do I need to hook in a Sort function and use the Modelsort instead of Model? You do if you want to keep integers represented as strings. > Should sorting a integer value be a basic function of a treeview/liststore? It *can* sort by integer columns. GtkCellRendererText can even diplay (format) a G_TYPE_INT column without the need of an explicitly set cell data function. But if you want to sort strings by some random associated value you have to tell it how to compare these values. > Should I be setting an attribute of the column as "integer" instead of > "text"? No, you should use integer data model (i.e. G_TYPE_INT) for integers. If you need to present them as text, format them to text: either by using GtkCellRendererText built-in capabilities or an explicite cell data function that sets the "text" attribute. If rendering the presentation is very expensive, you may want to cache the presentations in the model *in addition* to the primary value, but this is not the case anyway. I attach a simple program that demonstrates sorting by two integer columns: one presented as plain number the other as date+time. Yeti -- http://gwyddion.net/ =========================================================================== #include <time.h> #include <sys/stat.h> #include <gtk/gtk.h> #include <glib/gstdio.h> enum { COLUMN_NAME, COLUMN_SIZE, COLUMN_DATE, N_COLUMNS }; static void fill_model(GtkListStore *store) { GDir *dir; if ((dir = g_dir_open(".", 0, NULL))) { const gchar *name; while ((name = g_dir_read_name(dir))) { struct stat st; if (!g_stat(name, &st)) { guint64 time, size; GtkTreeIter iter; time = st.st_mtime; size = st.st_size; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, COLUMN_NAME, name, COLUMN_SIZE, size, COLUMN_DATE, time, -1); } /* else something */ } } /* else something */ } static void render_date(G_GNUC_UNUSED GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, G_GNUC_UNUSED gpointer data) { guint64 i; time_t time; struct tm *tm; gchar s[24]; gtk_tree_model_get(model, iter, COLUMN_DATE, &i, -1); time = i; tm = localtime(&time); strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", tm); /* ISO 8601 */ g_object_set(G_OBJECT(renderer), "text", s, NULL); } int main(int argc, char *argv[]) { GtkWidget *window, *view, *scrlwindow; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkListStore *store; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(window), 360, 240); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); scrlwindow = gtk_scrolled_window_new(NULL, NULL); gtk_container_add(GTK_CONTAINER(window), scrlwindow); store = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_INT64, G_TYPE_INT64); fill_model(store); view = gtk_tree_view_new(); gtk_container_add(GTK_CONTAINER(scrlwindow), view); gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), COLUMN_NAME, GTK_SORT_ASCENDING); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("Name", renderer, "text", COLUMN_NAME, NULL); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, COLUMN_NAME); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL); column = gtk_tree_view_column_new_with_attributes("Size", renderer, "text", COLUMN_SIZE, NULL); gtk_tree_view_column_set_sort_column_id(column, COLUMN_SIZE); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("Date", renderer, NULL); gtk_tree_view_column_set_cell_data_func(column, renderer, &render_date, NULL, NULL); gtk_tree_view_column_set_sort_column_id(column, COLUMN_DATE); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); gtk_widget_show_all(window); gtk_main(); return 0; } _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list