editable_cells.inc 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. (* Tree View/Editable Cells
  2. *
  3. * This demo demonstrates the use of editable cells in a GtkTreeView. If
  4. * you're new to the GtkTreeView widgets and associates, look into
  5. * the GtkListStore example first.
  6. *
  7. *)
  8. (*
  9. * todo: translate to pascal
  10. *)
  11. function do_editable_cells : PGtkWidget;
  12. begin
  13. do_dummy ('Tree View / Editable Cells - Demo');
  14. do_editable_cells := NULL;
  15. end;
  16. (*
  17. #include <gtk/gtk.h>
  18. #include <string.h>
  19. #include <stdlib.h>
  20. static GtkWidget *window = NULL;
  21. typedef struct
  22. {
  23. gint number;
  24. gchar *product;
  25. gboolean editable;
  26. }
  27. Item;
  28. enum
  29. {
  30. COLUMN_NUMBER,
  31. COLUMN_PRODUCT,
  32. COLUMN_EDITABLE,
  33. NUM_COLUMNS
  34. };
  35. static GArray *articles = NULL;
  36. static void
  37. add_items (void)
  38. {
  39. Item foo;
  40. g_return_if_fail (articles != NULL);
  41. foo.number = 3;
  42. foo.product = g_strdup ("bottles of coke");
  43. foo.editable = TRUE;
  44. g_array_append_vals (articles, &foo, 1);
  45. foo.number = 5;
  46. foo.product = g_strdup ("packages of noodles");
  47. foo.editable = TRUE;
  48. g_array_append_vals (articles, &foo, 1);
  49. foo.number = 2;
  50. foo.product = g_strdup ("packages of chocolate chip cookies");
  51. foo.editable = TRUE;
  52. g_array_append_vals (articles, &foo, 1);
  53. foo.number = 1;
  54. foo.product = g_strdup ("can vanilla ice cream");
  55. foo.editable = TRUE;
  56. g_array_append_vals (articles, &foo, 1);
  57. foo.number = 6;
  58. foo.product = g_strdup ("eggs");
  59. foo.editable = TRUE;
  60. g_array_append_vals (articles, &foo, 1);
  61. }
  62. static GtkTreeModel *
  63. create_model (void)
  64. {
  65. gint i = 0;
  66. GtkListStore *model;
  67. GtkTreeIter iter;
  68. /* create array */
  69. articles = g_array_sized_new (FALSE, FALSE, sizeof (Item), 1);
  70. add_items ();
  71. /* create list store */
  72. model = gtk_list_store_new (NUM_COLUMNS, G_TYPE_INT, G_TYPE_STRING,
  73. G_TYPE_BOOLEAN);
  74. /* add items */
  75. for (i = 0; i < articles->len; i++)
  76. {
  77. gtk_list_store_append (model, &iter);
  78. gtk_list_store_set (model, &iter,
  79. COLUMN_NUMBER,
  80. g_array_index (articles, Item, i).number,
  81. COLUMN_PRODUCT,
  82. g_array_index (articles, Item, i).product,
  83. COLUMN_EDITABLE,
  84. g_array_index (articles, Item, i).editable,
  85. -1);
  86. }
  87. return GTK_TREE_MODEL (model);
  88. }
  89. static void
  90. add_item (GtkWidget *button, gpointer data)
  91. {
  92. Item foo;
  93. GtkTreeIter iter;
  94. GtkTreeModel *model = (GtkTreeModel * )data;
  95. g_return_if_fail (articles != NULL);
  96. foo.number = 0;
  97. foo.product = g_strdup ("Description here");
  98. foo.editable = TRUE;
  99. g_array_append_vals (articles, &foo, 1);
  100. gtk_list_store_append (GTK_LIST_STORE (model), &iter);
  101. gtk_list_store_set (GTK_LIST_STORE (model), &iter,
  102. COLUMN_NUMBER, foo.number,
  103. COLUMN_PRODUCT, foo.product,
  104. COLUMN_EDITABLE, foo.editable,
  105. -1);
  106. }
  107. static void
  108. remove_item (GtkWidget *widget, gpointer data)
  109. {
  110. GtkTreeIter iter;
  111. GtkTreeView *treeview = (GtkTreeView * )data;
  112. GtkTreeModel *model = gtk_tree_view_get_model (treeview);
  113. GtkTreeSelection *selection = gtk_tree_view_get_selection (treeview);
  114. if (gtk_tree_selection_get_selected (selection, NULL, &iter))
  115. {
  116. gint i;
  117. GtkTreePath *path;
  118. path = gtk_tree_model_get_path (model, &iter);
  119. i = gtk_tree_path_get_indices (path)[0];
  120. gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
  121. g_array_remove_index (articles, i);
  122. gtk_tree_path_free (path);
  123. }
  124. }
  125. static void
  126. cell_edited (GtkCellRendererText *cell,
  127. const gchar *path_string,
  128. const gchar *new_text,
  129. gpointer data)
  130. {
  131. GtkTreeModel *model = (GtkTreeModel * )data;
  132. GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
  133. GtkTreeIter iter;
  134. gint *column;
  135. column = g_object_get_data (G_OBJECT (cell), "column");
  136. gtk_tree_model_get_iter (model, &iter, path);
  137. switch (GPOINTER_TO_INT (column))
  138. {
  139. case COLUMN_NUMBER:
  140. {
  141. gint i;
  142. i = gtk_tree_path_get_indices (path)[0];
  143. g_array_index (articles, Item, i).number = atoi (new_text);
  144. gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
  145. g_array_index (articles, Item, i).number, -1);
  146. }
  147. break;
  148. case COLUMN_PRODUCT:
  149. {
  150. gint i;
  151. gchar *old_text;
  152. gtk_tree_model_get (model, &iter, column, &old_text, -1);
  153. g_free (old_text);
  154. i = gtk_tree_path_get_indices (path)[0];
  155. g_free (g_array_index (articles, Item, i).product);
  156. g_array_index (articles, Item, i).product = g_strdup (new_text);
  157. gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
  158. g_array_index (articles, Item, i).product, -1);
  159. }
  160. break;
  161. }
  162. gtk_tree_path_free (path);
  163. }
  164. static void
  165. add_columns (GtkTreeView *treeview)
  166. {
  167. GtkCellRenderer *renderer;
  168. GtkTreeModel *model = gtk_tree_view_get_model (treeview);
  169. /* number column */
  170. renderer = gtk_cell_renderer_text_new ();
  171. g_signal_connect (G_OBJECT (renderer), "edited",
  172. G_CALLBACK (cell_edited), model);
  173. g_object_set_data (G_OBJECT (renderer), "column", (gint * )COLUMN_NUMBER);
  174. gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  175. -1, "Number", renderer,
  176. "text", COLUMN_NUMBER,
  177. "editable", COLUMN_EDITABLE,
  178. NULL);
  179. /* product column */
  180. renderer = gtk_cell_renderer_text_new ();
  181. g_signal_connect (G_OBJECT (renderer), "edited",
  182. G_CALLBACK (cell_edited), model);
  183. g_object_set_data (G_OBJECT (renderer), "column", (gint * )COLUMN_PRODUCT);
  184. gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  185. -1, "Product", renderer,
  186. "text", COLUMN_PRODUCT,
  187. "editable", COLUMN_EDITABLE,
  188. NULL);
  189. }
  190. GtkWidget *
  191. do_editable_cells (void)
  192. {
  193. if (!window)
  194. {
  195. GtkWidget *vbox;
  196. GtkWidget *hbox;
  197. GtkWidget *sw;
  198. GtkWidget *treeview;
  199. GtkWidget *button;
  200. GtkTreeModel *model;
  201. /* create window, etc */
  202. window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  203. gtk_window_set_title (GTK_WINDOW (window), "Shopping list");
  204. gtk_container_set_border_width (GTK_CONTAINER (window), 5);
  205. g_signal_connect (G_OBJECT (window), "destroy",
  206. G_CALLBACK (gtk_widget_destroyed), &window);
  207. vbox = gtk_vbox_new (FALSE, 5);
  208. gtk_container_add (GTK_CONTAINER (window), vbox);
  209. gtk_box_pack_start (GTK_BOX (vbox),
  210. gtk_label_new ("Shopping list (you can edit the cells!)"),
  211. FALSE, FALSE, 0);
  212. sw = gtk_scrolled_window_new (NULL, NULL);
  213. gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
  214. GTK_SHADOW_ETCHED_IN);
  215. gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
  216. GTK_POLICY_AUTOMATIC,
  217. GTK_POLICY_AUTOMATIC);
  218. gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
  219. /* create model */
  220. model = create_model ();
  221. /* create tree view */
  222. treeview = gtk_tree_view_new_with_model (model);
  223. g_object_unref (G_OBJECT (model));
  224. gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
  225. gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
  226. GTK_SELECTION_SINGLE);
  227. add_columns (GTK_TREE_VIEW (treeview));
  228. gtk_container_add (GTK_CONTAINER (sw), treeview);
  229. /* some buttons */
  230. hbox = gtk_hbox_new (TRUE, 4);
  231. gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
  232. button = gtk_button_new_with_label ("Add item");
  233. g_signal_connect (G_OBJECT (button), "clicked",
  234. G_CALLBACK (add_item), model);
  235. gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
  236. button = gtk_button_new_with_label ("Remove item");
  237. g_signal_connect (G_OBJECT (button), "clicked",
  238. G_CALLBACK (remove_item), treeview);
  239. gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
  240. gtk_window_set_default_size (GTK_WINDOW (window), 320, 200);
  241. }
  242. if (!GTK_WIDGET_VISIBLE (window))
  243. gtk_widget_show_all (window);
  244. else
  245. {
  246. gtk_widget_destroy (window);
  247. window = NULL;
  248. }
  249. return window;
  250. }
  251. *)