123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- (* Tree View/Editable Cells
- *
- * This demo demonstrates the use of editable cells in a GtkTreeView. If
- * you're new to the GtkTreeView widgets and associates, look into
- * the GtkListStore example first.
- *
- *)
- (*
- * todo: translate to pascal
- *)
- function do_editable_cells : PGtkWidget;
- begin
- do_dummy ('Tree View / Editable Cells - Demo');
- do_editable_cells := NULL;
- end;
- (*
- #include <gtk/gtk.h>
- #include <string.h>
- #include <stdlib.h>
- static GtkWidget *window = NULL;
- typedef struct
- {
- gint number;
- gchar *product;
- gboolean editable;
- }
- Item;
- enum
- {
- COLUMN_NUMBER,
- COLUMN_PRODUCT,
- COLUMN_EDITABLE,
- NUM_COLUMNS
- };
- static GArray *articles = NULL;
- static void
- add_items (void)
- {
- Item foo;
- g_return_if_fail (articles != NULL);
- foo.number = 3;
- foo.product = g_strdup ("bottles of coke");
- foo.editable = TRUE;
- g_array_append_vals (articles, &foo, 1);
- foo.number = 5;
- foo.product = g_strdup ("packages of noodles");
- foo.editable = TRUE;
- g_array_append_vals (articles, &foo, 1);
- foo.number = 2;
- foo.product = g_strdup ("packages of chocolate chip cookies");
- foo.editable = TRUE;
- g_array_append_vals (articles, &foo, 1);
- foo.number = 1;
- foo.product = g_strdup ("can vanilla ice cream");
- foo.editable = TRUE;
- g_array_append_vals (articles, &foo, 1);
- foo.number = 6;
- foo.product = g_strdup ("eggs");
- foo.editable = TRUE;
- g_array_append_vals (articles, &foo, 1);
- }
- static GtkTreeModel *
- create_model (void)
- {
- gint i = 0;
- GtkListStore *model;
- GtkTreeIter iter;
- /* create array */
- articles = g_array_sized_new (FALSE, FALSE, sizeof (Item), 1);
- add_items ();
- /* create list store */
- model = gtk_list_store_new (NUM_COLUMNS, G_TYPE_INT, G_TYPE_STRING,
- G_TYPE_BOOLEAN);
- /* add items */
- for (i = 0; i < articles->len; i++)
- {
- gtk_list_store_append (model, &iter);
- gtk_list_store_set (model, &iter,
- COLUMN_NUMBER,
- g_array_index (articles, Item, i).number,
- COLUMN_PRODUCT,
- g_array_index (articles, Item, i).product,
- COLUMN_EDITABLE,
- g_array_index (articles, Item, i).editable,
- -1);
- }
- return GTK_TREE_MODEL (model);
- }
- static void
- add_item (GtkWidget *button, gpointer data)
- {
- Item foo;
- GtkTreeIter iter;
- GtkTreeModel *model = (GtkTreeModel * )data;
- g_return_if_fail (articles != NULL);
- foo.number = 0;
- foo.product = g_strdup ("Description here");
- foo.editable = TRUE;
- g_array_append_vals (articles, &foo, 1);
- gtk_list_store_append (GTK_LIST_STORE (model), &iter);
- gtk_list_store_set (GTK_LIST_STORE (model), &iter,
- COLUMN_NUMBER, foo.number,
- COLUMN_PRODUCT, foo.product,
- COLUMN_EDITABLE, foo.editable,
- -1);
- }
- static void
- remove_item (GtkWidget *widget, gpointer data)
- {
- GtkTreeIter iter;
- GtkTreeView *treeview = (GtkTreeView * )data;
- GtkTreeModel *model = gtk_tree_view_get_model (treeview);
- GtkTreeSelection *selection = gtk_tree_view_get_selection (treeview);
- if (gtk_tree_selection_get_selected (selection, NULL, &iter))
- {
- gint i;
- GtkTreePath *path;
- path = gtk_tree_model_get_path (model, &iter);
- i = gtk_tree_path_get_indices (path)[0];
- gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
- g_array_remove_index (articles, i);
- gtk_tree_path_free (path);
- }
- }
- static void
- cell_edited (GtkCellRendererText *cell,
- const gchar *path_string,
- const gchar *new_text,
- gpointer data)
- {
- GtkTreeModel *model = (GtkTreeModel * )data;
- GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
- GtkTreeIter iter;
- gint *column;
- column = g_object_get_data (G_OBJECT (cell), "column");
- gtk_tree_model_get_iter (model, &iter, path);
- switch (GPOINTER_TO_INT (column))
- {
- case COLUMN_NUMBER:
- {
- gint i;
- i = gtk_tree_path_get_indices (path)[0];
- g_array_index (articles, Item, i).number = atoi (new_text);
- gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
- g_array_index (articles, Item, i).number, -1);
- }
- break;
- case COLUMN_PRODUCT:
- {
- gint i;
- gchar *old_text;
- gtk_tree_model_get (model, &iter, column, &old_text, -1);
- g_free (old_text);
- i = gtk_tree_path_get_indices (path)[0];
- g_free (g_array_index (articles, Item, i).product);
- g_array_index (articles, Item, i).product = g_strdup (new_text);
- gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
- g_array_index (articles, Item, i).product, -1);
- }
- break;
- }
- gtk_tree_path_free (path);
- }
- static void
- add_columns (GtkTreeView *treeview)
- {
- GtkCellRenderer *renderer;
- GtkTreeModel *model = gtk_tree_view_get_model (treeview);
- /* number column */
- renderer = gtk_cell_renderer_text_new ();
- g_signal_connect (G_OBJECT (renderer), "edited",
- G_CALLBACK (cell_edited), model);
- g_object_set_data (G_OBJECT (renderer), "column", (gint * )COLUMN_NUMBER);
- gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
- -1, "Number", renderer,
- "text", COLUMN_NUMBER,
- "editable", COLUMN_EDITABLE,
- NULL);
- /* product column */
- renderer = gtk_cell_renderer_text_new ();
- g_signal_connect (G_OBJECT (renderer), "edited",
- G_CALLBACK (cell_edited), model);
- g_object_set_data (G_OBJECT (renderer), "column", (gint * )COLUMN_PRODUCT);
- gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
- -1, "Product", renderer,
- "text", COLUMN_PRODUCT,
- "editable", COLUMN_EDITABLE,
- NULL);
- }
- GtkWidget *
- do_editable_cells (void)
- {
- if (!window)
- {
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *sw;
- GtkWidget *treeview;
- GtkWidget *button;
- GtkTreeModel *model;
- /* create window, etc */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title (GTK_WINDOW (window), "Shopping list");
- gtk_container_set_border_width (GTK_CONTAINER (window), 5);
- g_signal_connect (G_OBJECT (window), "destroy",
- G_CALLBACK (gtk_widget_destroyed), &window);
- vbox = gtk_vbox_new (FALSE, 5);
- gtk_container_add (GTK_CONTAINER (window), vbox);
- gtk_box_pack_start (GTK_BOX (vbox),
- gtk_label_new ("Shopping list (you can edit the cells!)"),
- 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_SINGLE);
- add_columns (GTK_TREE_VIEW (treeview));
- gtk_container_add (GTK_CONTAINER (sw), treeview);
- /* some buttons */
- hbox = gtk_hbox_new (TRUE, 4);
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
- button = gtk_button_new_with_label ("Add item");
- g_signal_connect (G_OBJECT (button), "clicked",
- G_CALLBACK (add_item), model);
- gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
- button = gtk_button_new_with_label ("Remove item");
- g_signal_connect (G_OBJECT (button), "clicked",
- G_CALLBACK (remove_item), treeview);
- gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
- gtk_window_set_default_size (GTK_WINDOW (window), 320, 200);
- }
- if (!GTK_WIDGET_VISIBLE (window))
- gtk_widget_show_all (window);
- else
- {
- gtk_widget_destroy (window);
- window = NULL;
- }
- return window;
- }
- *)
|