Reputation:
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 |
Upvotes: 3
Views: 3488
Reputation: 7434
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;
}
Upvotes: 6