Question

I would like to create a simple table in gtk with the following content:

| test name | 0 | 10 |

I simply want to create this, but gtk doesn't make this easy. I have made a GtkListStore which contains all the information I need, but apparently I need to create a GtkTreeViewColumn as well. I need to pass the values to gtk_tree_view_column_new_with_attributes, but the problem is that I don't know any attribute names and I can't find them anywhere. The only attribute I found was "text", but I pass unsigned integers as well. Could someone tell me what these attributes are, and how to create a simple table? (I read https://developer.gnome.org/gtk3/stable/TreeWidget.html btw)

enum { FILE_NAME = 0, FILE_OFFSET, FILE_SIZE };

GtkWidget*          tree;
GtkListStore*       store;
GtkTreeIter         iter;
GtkCellRenderer*    renderer;
GtkTreeViewColumn*  column;

store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT);
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, FILE_NAME, "test name", FILE_OFFSET, 0, 
        FILE_SIZE, 10, -1);

tree = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
g_object_unref (G_OBJECT (store));
renderer = gtk_cell_renderer_text_new ();

column = gtk_tree_view_column_new_with_attributes ("Name", renderer, 
        "text", FILE_NAME, NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);

With the posted code I get the following result:

| name ?    |
| test name |
Was it helpful?

Solution

You must understand model and view are separated concepts.

GtkListStore is the model and contains the data to be shown. It can also have a bunch of other data not needed by the view, e.g. it can be the result of a more general SQL query.

GtkTreeView is the view and you must instruct it on how to present the data on the screen. It does it by packing different columns inside a rectangular region. The following example gives you an idea of what can be accomplished:

#include <gtk/gtk.h>

enum {
    FILE_NAME,
    FILE_OFFSET,
    FILE_SIZE,
    FILE_DESCRIPTION, /* Not used by the view, maybe used elsewhere */
    COLOR,            /* Just to show how the model can affect the view */
    N_COLUMNS
};

gint main(gint argc, gchar **argv)
{
    GtkListStore*      model;
    GtkWidget*         view;
    GtkTreeViewColumn* column;
    GtkWidget*         window;

    gtk_init(&argc, &argv);

    /* MODEL */
    model = gtk_list_store_new(N_COLUMNS,
                               G_TYPE_STRING,   /* FILE_NAME */
                               G_TYPE_UINT,     /* FILE_OFFSET */
                               G_TYPE_UINT,     /* FILE_SIZE */
                               G_TYPE_STRING,   /* FILE_DESCRIPTION */
                               G_TYPE_STRING    /* COLOR */
                              );
    gtk_list_store_insert_with_values(model, NULL, -1,
                                      FILE_NAME, "test name",
                                      FILE_OFFSET, 0,
                                      FILE_SIZE, 10,
                                      -1);
    gtk_list_store_insert_with_values(model, NULL, -1,
                                      FILE_NAME, "Dummy",
                                      FILE_OFFSET, 123,
                                      COLOR, "black",
                                      -1);
    gtk_list_store_insert_with_values(model, NULL, -1,
                                      COLOR, "blue",
                                      -1);

    /* VIEW */
    view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
    g_object_unref(model);

    column = gtk_tree_view_column_new_with_attributes("Name",
                                                      gtk_cell_renderer_text_new(),
                                                      "text", FILE_NAME,
                                                      "background", COLOR,
                                                      NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);

    column = gtk_tree_view_column_new_with_attributes("Offset",
                                                      gtk_cell_renderer_spin_new(),
                                                      "text", FILE_OFFSET,
                                                      NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);

    column = gtk_tree_view_column_new_with_attributes("Size",
                                                      gtk_cell_renderer_text_new(),
                                                      "text", FILE_SIZE,
                                                      NULL);
    gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);

    /* MAIN */
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_container_add(GTK_CONTAINER(window), view);
    gtk_widget_show_all(window);

    gtk_main ();

    return 0;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top