GtkTreeView only displays one column



I'm trying to use GtkTreeView with GtkListStore to show a list of rows,
each containing a radio button and a bit of text (file leafname). The
trouble is I can only get the TreeView to show one column at a time. The
bits of code I'm using to do this are:

enum {
    cfColumn_Radio,
    cfColumn_Name,
    cfColumn_NColumns
};

static void configlet_list_build(ConfigletList *cl)
{
    DynamicOptions *dynopts;
    char **file_list;
    char **file;
    const char *selected_name = configlet_get_configured_name(cl);

    if (cl->list)
    {
        gtk_list_store_clear(cl->list);
    }
    else
    {
        cl->list = gtk_list_store_new(cfColumn_NColumns,
                G_TYPE_BOOLEAN, G_TYPE_STRING);
    }

    dynopts = dynamic_options_get(cl->family);
    file_list = dynamic_options_list(dynopts);

    for (file = file_list; *file; ++file)
    {
        GtkTreeIter iter;

        gtk_list_store_append(cl->list, &iter);
        gtk_list_store_set(cl->list, &iter,
                cfColumn_Radio, !strcmp(selected_name, *file),
                cfColumn_Name, *file,
                -1);
    }
    g_strfreev(file_list);
}

static void configlet_list_init(ConfigletList *cl, GtkWidget *widget,
        Options *options, const char *family)
{
    GtkTreeViewColumn *rcolumn, *tcolumn;
    GtkCellRenderer *radio;

    cl->tvwidget = GTK_TREE_VIEW(widget);
    cl->options = options;
    cl->family = family;
    cl->list = gtk_list_store_new(cfColumn_NColumns,
            G_TYPE_BOOLEAN, G_TYPE_STRING);
    gtk_tree_view_set_model(cl->tvwidget, GTK_TREE_MODEL(cl->list));

    radio = gtk_cell_renderer_toggle_new();
    gtk_cell_renderer_toggle_set_radio(GTK_CELL_RENDERER_TOGGLE(radio), TRUE);
    rcolumn = gtk_tree_view_column_new_with_attributes(
                NULL,
                radio,
                "active",
                cfColumn_Radio,
                NULL);
    gtk_tree_view_column_set_sizing(rcolumn, GTK_TREE_VIEW_COLUMN_FIXED);
    gtk_tree_view_append_column(cl->tvwidget, rcolumn);

    tcolumn = gtk_tree_view_column_new_with_attributes(
                NULL,
                gtk_cell_renderer_text_new(),
                "text",
                cfColumn_Name,
                NULL);
    gtk_tree_view_column_set_sizing(tcolumn, GTK_TREE_VIEW_COLUMN_FIXED);
    gtk_tree_view_append_column(cl->tvwidget, tcolumn);
    gtk_tree_view_column_set_visible(rcolumn, TRUE);

    gtk_tree_selection_set_mode(gtk_tree_view_get_selection(cl->tvwidget),
            GTK_SELECTION_BROWSE);
    configlet_list_build(cl);
    configlet_select_name(cl, configlet_get_configured_name(cl));
    gtk_widget_realize(widget);
    gtk_tree_view_columns_autosize(cl->tvwidget);
}

On entry to configlet_list_init, widget has been looked up by glade and
is a GtkTreeView contained by a GtkScrolledWindow with H Policy =
Automatic and V Policy = Always. I've tried lots of different things,
like adding extra columns, adding them in reverse order using insert
instead of append, but it always only displays the rightmost visible
column. Forcing rcolumn to be visible doesn't help, but if I make
tcolumn invisible, it does display rcolumn instead. The last two lines
are what I added to see if that would help, but it didn't.

I must be doing something wrong, but I can't see how the above differes
fundamentally from the example at
<http://developer.gnome.org/doc/API/2.0/gtk/TreeWidget.html>. Can anyone
help?

-- 
TH * http://www.realh.co.uk



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