Re: Sorting Integer value treeview column



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;
}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]