#include "gtktlview.h" #include "gtktlcelltext.h" #include "gtktlcellpixbuf.h" #include "gtklistmodel.h" #include "gtkmodelsimple.h" #define LINES 8 enum { POEM_COLUMN = 0, REFRAIN_COLUMN, COLOR_COLUMN, PIXBUF_COLUMN, }; static GdkPixbuf *note; static struct { char *poem; char *refrain; char *color; } model [LINES] = { { "The more it snows", "(TiddlyPom)", "SlateBlue" }, { "The more it goes", "(TiddlyPom)", "MediumSlateBlue" }, { "The more it goes", "(TiddlyPom)", "DarkSlateBlue" }, { "on snowing.", "", "DarkSlateBlue" }, { "And nobody knows", "(TiddlyPom)", "SlateBlue" }, { "How cold my toes", "(TiddlyPom)", "MediumSlateBlue" }, { "How cold my toes", "(TiddlyPom)", "DarkSlateBlue" }, { "are growing.", "", "DarkSlateBlue" } }; /* Our TLModel::get_node callback. * We represent nodes as integers, so we can simply return the indices of the * path. */ GtkTLNode simple_get_node (GtkTLModel *tlmodel, GtkTLPath *path, gpointer data) { return GINT_TO_POINTER (gtk_tlpath_get_indices (path)[0]); } /* Our TLModel::get_value callback. * As our nodes are all offsets, we can just use them as an array offset into * the table above. */ void simple_node_get_value (GtkTLModel *TLModel, GtkTLNode node, gint column, GValue *value, gpointer data) { /* This is a hack until g_value_init gets fixed */ value->g_type = 0; if (column == PIXBUF_COLUMN) g_value_init (value, G_TYPE_OBJECT); else g_value_init (value, G_TYPE_STRING); switch (column) { case POEM_COLUMN: g_value_set_string (value, model[(GPOINTER_TO_INT (node)) - 1].poem); break; case REFRAIN_COLUMN: g_value_set_string (value, model[(GPOINTER_TO_INT (node)) - 1].refrain); break; case COLOR_COLUMN: g_value_set_string (value, model[(GPOINTER_TO_INT (node)) - 1].color); break; case PIXBUF_COLUMN: g_value_set_object (value, G_OBJECT (note)); break; } } /* Our TLModel::node_next callback. * As we are indexing our nodes by an int, we can just add one to the old one, * until LINES is reached. */ gboolean simple_node_next (GtkTLModel *tlmodel, GtkTLNode *node, gpointer data) { if (((gint)(*node)) >= LINES) return FALSE; *((gint *)node) = ((gint)(*node)) + 1; return TRUE; } int main (int argc, char *argv[]) { GValue value = {0, }; GtkWidget *window; GtkWidget *scrolled_window; GtkWidget *tlview; GtkObject *model; GtkObject *column; GtkTLCell *cell; gtk_init (&argc, &argv); note = gdk_pixbuf_new_from_file ("note.png"); /* Make the Widgets/Objects */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size (GTK_WINDOW (window), 150, 250); scrolled_window = gtk_scrolled_window_new (NULL, NULL); model = gtk_model_simple_new (); tlview = gtk_tlview_new_with_model (GTK_TLMODEL (model)); /* Put them together */ gtk_container_add (GTK_CONTAINER (scrolled_window), tlview); gtk_container_add (GTK_CONTAINER (window), scrolled_window); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL); gtk_signal_connect (GTK_OBJECT (model), "node_next", GTK_SIGNAL_FUNC (simple_node_next), NULL); gtk_signal_connect (GTK_OBJECT (model), "get_node", GTK_SIGNAL_FUNC (simple_get_node), NULL); gtk_signal_connect (GTK_OBJECT (model), "node_get_value", GTK_SIGNAL_FUNC (simple_node_get_value), NULL); /* The Note Column */ cell = gtk_tlcell_pixbuf_new (); column = gtk_tlcolumn_new_with_vals ("Note", cell, "pixbuf", PIXBUF_COLUMN, NULL); gtk_tlview_add_column (GTK_TLVIEW (tlview), GTK_TLCOLUMN (column)); /* The Poem Column */ cell = gtk_tlcell_text_new (); g_value_init (&value, G_TYPE_STRING); g_value_set_string (&value, "sans bold 14"); g_object_set_param (G_OBJECT (cell), "font", &value); column = gtk_tlcolumn_new_with_vals ("Poem", cell, "text", POEM_COLUMN, NULL); gtk_tlview_add_column (GTK_TLVIEW (tlview), GTK_TLCOLUMN (column)); /* The Refrain Column */ cell = gtk_tlcell_text_new (); g_value_set_string (&value, "sans italic 14"); g_object_set_param (G_OBJECT (cell), "font", &value); column = gtk_tlcolumn_new_with_vals ("Refrain", cell, "text", REFRAIN_COLUMN, "foreground", COLOR_COLUMN, NULL); gtk_tlview_add_column (GTK_TLVIEW (tlview), GTK_TLCOLUMN (column)); gtk_widget_show_all (window); gtk_main (); return 0; }