diff options
Diffstat (limited to 'packages/gtk2/examples/gtk_demo/tree_store.inc')
-rw-r--r-- | packages/gtk2/examples/gtk_demo/tree_store.inc | 461 |
1 files changed, 461 insertions, 0 deletions
diff --git a/packages/gtk2/examples/gtk_demo/tree_store.inc b/packages/gtk2/examples/gtk_demo/tree_store.inc new file mode 100644 index 0000000000..dc9731c80f --- /dev/null +++ b/packages/gtk2/examples/gtk_demo/tree_store.inc @@ -0,0 +1,461 @@ +(* Tree View/Tree Store + * + * The GtkTreeStore is used to store data in tree form, to be + * used later on by a GtkTreeView to display it. This demo builds + * a simple GtkTreeStore and displays it. If you're new to the + * GtkTreeView widgets and associates, look into the GtkListStore + * example first. + * + *) + (* + * todo: translate to pascal + *) + +function do_tree_store : PGtkWidget; +begin + do_dummy ('Tree View / Tree Store - Demo'); + do_tree_store := NULL; +end; + + +(* +#include <gtk/gtk.h> + +static GtkWidget *window = NULL; + +/* TreeItem structure */ +typedef struct _TreeItem TreeItem; +struct _TreeItem +{ + const gchar *label; + gboolean alex; + gboolean havoc; + gboolean tim; + gboolean owen; + gboolean dave; + gboolean world_holiday; /* shared by the European hackers */ + TreeItem *children; +}; + +/* columns */ +enum +{ + HOLIDAY_NAME_COLUMN = 0, + ALEX_COLUMN, + HAVOC_COLUMN, + TIM_COLUMN, + OWEN_COLUMN, + DAVE_COLUMN, + + VISIBLE_COLUMN, + WORLD_COLUMN, + NUM_COLUMNS +}; + +/* tree data */ +static TreeItem january[] = +{ + {"New Years Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL }, + {"Presidential Inauguration", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL }, + {"Martin Luther King Jr. day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL }, + { NULL } +}; + +static TreeItem february[] = +{ + { "Presidents' Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL }, + { "Groundhog Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Valentine's Day", FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, NULL }, + { NULL } +}; + +static TreeItem march[] = +{ + { "National Tree Planting Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "St Patrick's Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { NULL } +}; +static TreeItem april[] = +{ + { "April Fools' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { "Army Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Earth Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { "Administrative Professionals' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { NULL } +}; + +static TreeItem may[] = +{ + { "Nurses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "National Day of Prayer", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Mothers' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { "Armed Forces Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Memorial Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL }, + { NULL } +}; + +static TreeItem june[] = +{ + { "June Fathers' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { "Juneteenth (Liberation of Slaves)", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Flag Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL }, + { NULL } +}; + +static TreeItem july[] = +{ + { "Parents' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { "Independence Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL }, + { NULL } +}; + +static TreeItem august[] = +{ + { "Air Force Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Coast Guard Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Friendship Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { NULL } +}; + +static TreeItem september[] = +{ + { "Grandparents' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { "Citizenship Day or Constitution Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Labor Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL }, + { NULL } +}; + +static TreeItem october[] = +{ + { "National Children's Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Bosses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Sweetest Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Mother-in-Law's Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Navy Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Columbus Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL }, + { "Halloween", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL }, + { NULL } +}; + +static TreeItem november[] = +{ + { "Marine Corps Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Veterans' Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL }, + { "Thanksgiving", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL }, + { NULL } +}; + +static TreeItem december[] = +{ + { "Pearl Harbor Remembrance Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { "Christmas", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL }, + { "Kwanzaa", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL }, + { NULL } +}; + + +static TreeItem toplevel[] = +{ + {"January", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, january}, + {"February", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, february}, + {"March", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, march}, + {"April", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, april}, + {"May", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, may}, + {"June", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, june}, + {"July", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, july}, + {"August", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, august}, + {"September", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, september}, + {"October", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, october}, + {"November", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, november}, + {"December", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, december}, + {NULL} +}; + + +static GtkTreeModel * +create_model (void) +{ + GtkTreeStore *model; + GtkTreeIter iter; + TreeItem *month = toplevel; + + /* create tree store */ + model = gtk_tree_store_new (NUM_COLUMNS, + G_TYPE_STRING, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN); + + /* add data to the tree store */ + while (month->label) + { + TreeItem *holiday = month->children; + + gtk_tree_store_append (model, &iter, NULL); + gtk_tree_store_set (model, &iter, + HOLIDAY_NAME_COLUMN, month->label, + ALEX_COLUMN, FALSE, + HAVOC_COLUMN, FALSE, + TIM_COLUMN, FALSE, + OWEN_COLUMN, FALSE, + DAVE_COLUMN, FALSE, + VISIBLE_COLUMN, FALSE, + WORLD_COLUMN, FALSE, + -1); + + /* add children */ + while (holiday->label) + { + GtkTreeIter child_iter; + + gtk_tree_store_append (model, &child_iter, &iter); + gtk_tree_store_set (model, &child_iter, + HOLIDAY_NAME_COLUMN, holiday->label, + ALEX_COLUMN, holiday->alex, + HAVOC_COLUMN, holiday->havoc, + TIM_COLUMN, holiday->tim, + OWEN_COLUMN, holiday->owen, + DAVE_COLUMN, holiday->dave, + VISIBLE_COLUMN, TRUE, + WORLD_COLUMN, holiday->world_holiday, + -1); + + holiday++; + } + + month++; + } + + return GTK_TREE_MODEL (model); +} + +static void +item_toggled (GtkCellRendererToggle *cell, + gchar *path_str, + gpointer data) +{ + GtkTreeModel *model = (GtkTreeModel * )data; + GtkTreePath *path = gtk_tree_path_new_from_string (path_str); + GtkTreeIter iter; + gboolean toggle_item; + + gint *column; + + column = g_object_get_data (G_OBJECT (cell), "column"); + + /* get toggled iter */ + gtk_tree_model_get_iter (model, &iter, path); + gtk_tree_model_get (model, &iter, column, &toggle_item, -1); + + /* do something with the value */ + toggle_item ^= 1; + + /* set new value */ + gtk_tree_store_set (GTK_TREE_STORE (model), &iter, column, + toggle_item, -1); + + /* clean up */ + gtk_tree_path_free (path); +} + +static void +add_columns (GtkTreeView *treeview) +{ + gint col_offset; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkTreeModel *model = gtk_tree_view_get_model (treeview); + + /* column for holiday names */ + renderer = gtk_cell_renderer_text_new (); + g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL); + + col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + -1, "Holiday", + renderer, "text", + HOLIDAY_NAME_COLUMN, + NULL); + column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1); + gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); + + /* alex column */ + renderer = gtk_cell_renderer_toggle_new (); + g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL); + g_object_set_data (G_OBJECT (renderer), "column", (gint * )ALEX_COLUMN); + + g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (item_toggled), + model); + col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + -1, "Alex", + renderer, + "active", + ALEX_COLUMN, + "visible", + VISIBLE_COLUMN, + "activatable", + WORLD_COLUMN, NULL); + + column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1); + gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), + GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50); + gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); + + /* havoc column */ + renderer = gtk_cell_renderer_toggle_new (); + g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL); + g_object_set_data (G_OBJECT (renderer), "column", (gint * )HAVOC_COLUMN); + + g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (item_toggled), + model); + col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + -1, "Havoc", + renderer, + "active", + HAVOC_COLUMN, + "visible", + VISIBLE_COLUMN, + NULL); + + column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1); + gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), + GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50); + gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); + + /* tim column */ + renderer = gtk_cell_renderer_toggle_new (); + g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL); + g_object_set_data (G_OBJECT (renderer), "column", (gint * )TIM_COLUMN); + + g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (item_toggled), + model); + col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + -1, "Tim", + renderer, + "active", + TIM_COLUMN, + "visible", + VISIBLE_COLUMN, + "activatable", + WORLD_COLUMN, NULL); + + column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1); + gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), + GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50); + gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); + + /* owen column */ + renderer = gtk_cell_renderer_toggle_new (); + g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL); + g_object_set_data (G_OBJECT (renderer), "column", (gint * )OWEN_COLUMN); + + g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (item_toggled), + model); + col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + -1, "Owen", + renderer, + "active", + OWEN_COLUMN, + "visible", + VISIBLE_COLUMN, + NULL); + + column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1); + gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), + GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50); + gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); + + /* dave column */ + renderer = gtk_cell_renderer_toggle_new (); + g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL); + g_object_set_data (G_OBJECT (renderer), "column", (gint * )DAVE_COLUMN); + + g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (item_toggled), + model); + col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview), + -1, "Dave", + renderer, + "active", + DAVE_COLUMN, + "visible", + VISIBLE_COLUMN, + NULL); + + column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1); + gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), + GTK_TREE_VIEW_COLUMN_FIXED); + gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50); + gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); +} + +GtkWidget * +do_tree_store (void) +{ + if (!window) + { + GtkWidget *vbox; + GtkWidget *sw; + GtkWidget *treeview; + GtkTreeModel *model; + + /* create window, etc */ + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_title (GTK_WINDOW (window), "Card planning sheet"); + g_signal_connect (G_OBJECT (window), "destroy", + G_CALLBACK (gtk_widget_destroyed), &window); + + vbox = gtk_vbox_new (FALSE, 8); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 8); + gtk_container_add (GTK_CONTAINER (window), vbox); + + gtk_box_pack_start (GTK_BOX (vbox), + gtk_label_new ("Jonathan's Holiday Card Planning Sheet"), + FALSE, FALSE, 0); + + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), + GTK_SHADOW_ETCHED_IN); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0); + + /* create model */ + model = create_model (); + + /* create tree view */ + treeview = gtk_tree_view_new_with_model (model); + g_object_unref (G_OBJECT (model)); + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE); + gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)), + GTK_SELECTION_MULTIPLE); + + add_columns (GTK_TREE_VIEW (treeview)); + + gtk_container_add (GTK_CONTAINER (sw), treeview); + + /* expand all rows after the treeview widget has been realized */ + g_signal_connect (G_OBJECT (treeview), "realize", + G_CALLBACK (gtk_tree_view_expand_all), NULL); + gtk_window_set_default_size (GTK_WINDOW (window), 650, 400); + } + + if (!GTK_WIDGET_VISIBLE (window)) + gtk_widget_show_all (window); + else + { + gtk_widget_destroy (window); + window = NULL; + } + + return window; +} + +*) |