/src/wrappers/gtk/examples/gtk-demo/editable_cells.e

http://github.com/tybor/Liberty · Specman e · 417 lines · 21 code · 83 blank · 313 comment · 2 complexity · c4ea91858edeaf4cb90eb012b96e5d9c MD5 · raw file

  1. indexing
  2. description: "."
  3. copyright: "[
  4. Copyright (C) 2006 Paolo Redaelli, GTK+ team
  5. This library is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU Lesser General Public License
  7. as published by the Free Software Foundation; either version 2.1 of
  8. the License, or (at your option) any later version.
  9. This library is distributed in the hope that it will be useful, but
  10. WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. Lesser General Public License for more details.
  13. You should have received a copy of the GNU Lesser General Public
  14. License along with this library; if not, write to the Free Software
  15. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  16. 02110-1301 USA
  17. ]"
  18. class EDITABLE_CELLS
  19. creation make
  20. feature
  21. -- /* Tree View/Editable Cells
  22. -- *
  23. -- * This demo demonstrates the use of editable cells in a GtkTreeView. If
  24. -- * you're new to the GtkTreeView widgets and associates, look into
  25. -- * the GtkListStore example first. It also shows how to use the
  26. -- * GtkCellRenderer::editing-started signal to do custom setup of the
  27. -- * editable widget.
  28. -- *
  29. -- * The cell renderers used in this demo are GtkCellRendererText,
  30. -- * GtkCellRendererCombo and GtkCellRendererProgress.
  31. -- */
  32. -- #include <gtk/gtk.h>
  33. -- #include <string.h>
  34. -- #include <stdlib.h>
  35. -- static GtkWidget *window = NULL;
  36. -- typedef struct
  37. -- {
  38. -- gint number;
  39. -- gchar *product;
  40. -- gint yummy;
  41. -- }
  42. -- Item;
  43. -- enum
  44. -- {
  45. -- COLUMN_ITEM_NUMBER,
  46. -- COLUMN_ITEM_PRODUCT,
  47. -- COLUMN_ITEM_YUMMY,
  48. -- NUM_ITEM_COLUMNS
  49. -- };
  50. -- enum
  51. -- {
  52. -- COLUMN_NUMBER_TEXT,
  53. -- NUM_NUMBER_COLUMNS
  54. -- };
  55. -- static GArray *articles = NULL;
  56. -- static void
  57. -- add_items (void)
  58. -- {
  59. -- Item foo;
  60. -- g_return_if_fail (articles != NULL);
  61. -- foo.number = 3;
  62. -- foo.product = g_strdup ("bottles of coke");
  63. -- foo.yummy = 20;
  64. -- g_array_append_vals (articles, &foo, 1);
  65. -- foo.number = 5;
  66. -- foo.product = g_strdup ("packages of noodles");
  67. -- foo.yummy = 50;
  68. -- g_array_append_vals (articles, &foo, 1);
  69. -- foo.number = 2;
  70. -- foo.product = g_strdup ("packages of chocolate chip cookies");
  71. -- foo.yummy = 90;
  72. -- g_array_append_vals (articles, &foo, 1);
  73. -- foo.number = 1;
  74. -- foo.product = g_strdup ("can vanilla ice cream");
  75. -- foo.yummy = 60;
  76. -- g_array_append_vals (articles, &foo, 1);
  77. -- foo.number = 6;
  78. -- foo.product = g_strdup ("eggs");
  79. -- foo.yummy = 10;
  80. -- g_array_append_vals (articles, &foo, 1);
  81. -- }
  82. -- static GtkTreeModel *
  83. -- create_items_model (void)
  84. -- {
  85. -- gint i = 0;
  86. -- GtkListStore *model;
  87. -- GtkTreeIter iter;
  88. -- /* create array */
  89. -- articles = g_array_sized_new (FALSE, FALSE, sizeof (Item), 1);
  90. -- add_items ();
  91. -- /* create list store */
  92. -- model = gtk_list_store_new (NUM_ITEM_COLUMNS, G_TYPE_INT, G_TYPE_STRING,
  93. -- G_TYPE_INT, G_TYPE_BOOLEAN);
  94. -- /* add items */
  95. -- for (i = 0; i < articles->len; i++)
  96. -- {
  97. -- gtk_list_store_append (model, &iter);
  98. -- gtk_list_store_set (model, &iter,
  99. -- COLUMN_ITEM_NUMBER,
  100. -- g_array_index (articles, Item, i).number,
  101. -- COLUMN_ITEM_PRODUCT,
  102. -- g_array_index (articles, Item, i).product,
  103. -- COLUMN_ITEM_YUMMY,
  104. -- g_array_index (articles, Item, i).yummy,
  105. -- -1);
  106. -- }
  107. -- return GTK_TREE_MODEL (model);
  108. -- }
  109. -- static GtkTreeModel *
  110. -- create_numbers_model (void)
  111. -- {
  112. -- #define N_NUMBERS 10
  113. -- gint i = 0;
  114. -- GtkListStore *model;
  115. -- GtkTreeIter iter;
  116. -- /* create list store */
  117. -- model = gtk_list_store_new (NUM_NUMBER_COLUMNS, G_TYPE_STRING, G_TYPE_INT);
  118. -- /* add numbers */
  119. -- for (i = 0; i < N_NUMBERS; i++)
  120. -- {
  121. -- char str[2] = { '0' + i, '\0' };
  122. -- gtk_list_store_append (model, &iter);
  123. -- gtk_list_store_set (model, &iter,
  124. -- COLUMN_NUMBER_TEXT, str,
  125. -- -1);
  126. -- }
  127. -- return GTK_TREE_MODEL (model);
  128. -- #undef N_NUMBERS
  129. -- }
  130. -- static void
  131. -- add_item (GtkWidget *button, gpointer data)
  132. -- {
  133. -- Item foo;
  134. -- GtkTreeIter iter;
  135. -- GtkTreeModel *model = (GtkTreeModel *)data;
  136. -- g_return_if_fail (articles != NULL);
  137. -- foo.number = 0;
  138. -- foo.product = g_strdup ("Description here");
  139. -- foo.yummy = 50;
  140. -- g_array_append_vals (articles, &foo, 1);
  141. -- gtk_list_store_append (GTK_LIST_STORE (model), &iter);
  142. -- gtk_list_store_set (GTK_LIST_STORE (model), &iter,
  143. -- COLUMN_ITEM_NUMBER, foo.number,
  144. -- COLUMN_ITEM_PRODUCT, foo.product,
  145. -- COLUMN_ITEM_YUMMY, foo.yummy,
  146. -- -1);
  147. -- }
  148. -- static void
  149. -- remove_item (GtkWidget *widget, gpointer data)
  150. -- {
  151. -- GtkTreeIter iter;
  152. -- GtkTreeView *treeview = (GtkTreeView *)data;
  153. -- GtkTreeModel *model = gtk_tree_view_get_model (treeview);
  154. -- GtkTreeSelection *selection = gtk_tree_view_get_selection (treeview);
  155. -- if (gtk_tree_selection_get_selected (selection, NULL, &iter))
  156. -- {
  157. -- gint i;
  158. -- GtkTreePath *path;
  159. -- path = gtk_tree_model_get_path (model, &iter);
  160. -- i = gtk_tree_path_get_indices (path)[0];
  161. -- gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
  162. -- g_array_remove_index (articles, i);
  163. -- gtk_tree_path_free (path);
  164. -- }
  165. -- }
  166. -- static gboolean
  167. -- separator_row (GtkTreeModel *model,
  168. -- GtkTreeIter *iter,
  169. -- gpointer data)
  170. -- {
  171. -- GtkTreePath *path;
  172. -- gint idx;
  173. -- path = gtk_tree_model_get_path (model, iter);
  174. -- idx = gtk_tree_path_get_indices (path)[0];
  175. -- gtk_tree_path_free (path);
  176. -- return idx == 5;
  177. -- }
  178. -- static void
  179. -- editing_started (GtkCellRenderer *cell,
  180. -- GtkCellEditable *editable,
  181. -- const gchar *path,
  182. -- gpointer data)
  183. -- {
  184. -- gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (editable),
  185. -- separator_row, NULL, NULL);
  186. -- }
  187. -- static void
  188. -- cell_edited (GtkCellRendererText *cell,
  189. -- const gchar *path_string,
  190. -- const gchar *new_text,
  191. -- gpointer data)
  192. -- {
  193. -- GtkTreeModel *model = (GtkTreeModel *)data;
  194. -- GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
  195. -- GtkTreeIter iter;
  196. -- gint column = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column"));
  197. -- gtk_tree_model_get_iter (model, &iter, path);
  198. -- switch (column)
  199. -- {
  200. -- case COLUMN_ITEM_NUMBER:
  201. -- {
  202. -- gint i;
  203. -- i = gtk_tree_path_get_indices (path)[0];
  204. -- g_array_index (articles, Item, i).number = atoi (new_text);
  205. -- gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
  206. -- g_array_index (articles, Item, i).number, -1);
  207. -- }
  208. -- break;
  209. -- case COLUMN_ITEM_PRODUCT:
  210. -- {
  211. -- gint i;
  212. -- gchar *old_text;
  213. -- gtk_tree_model_get (model, &iter, column, &old_text, -1);
  214. -- g_free (old_text);
  215. -- i = gtk_tree_path_get_indices (path)[0];
  216. -- g_free (g_array_index (articles, Item, i).product);
  217. -- g_array_index (articles, Item, i).product = g_strdup (new_text);
  218. -- gtk_list_store_set (GTK_LIST_STORE (model), &iter, column,
  219. -- g_array_index (articles, Item, i).product, -1);
  220. -- }
  221. -- break;
  222. -- }
  223. -- gtk_tree_path_free (path);
  224. -- }
  225. -- static void
  226. -- add_columns (GtkTreeView *treeview,
  227. -- GtkTreeModel *items_model,
  228. -- GtkTreeModel *numbers_model)
  229. -- {
  230. -- GtkCellRenderer *renderer;
  231. -- /* number column */
  232. -- renderer = gtk_cell_renderer_combo_new ();
  233. -- g_object_set (renderer,
  234. -- "model", numbers_model,
  235. -- "text-column", COLUMN_NUMBER_TEXT,
  236. -- "has-entry", FALSE,
  237. -- "editable", TRUE,
  238. -- NULL);
  239. -- g_signal_connect (renderer, "edited",
  240. -- G_CALLBACK (cell_edited), items_model);
  241. -- g_signal_connect (renderer, "editing-started",
  242. -- G_CALLBACK (editing_started), NULL);
  243. -- g_object_set_data (G_OBJECT (renderer), "column", GINT_TO_POINTER (COLUMN_ITEM_NUMBER));
  244. -- gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  245. -- -1, "Number", renderer,
  246. -- "text", COLUMN_ITEM_NUMBER,
  247. -- NULL);
  248. -- /* product column */
  249. -- renderer = gtk_cell_renderer_text_new ();
  250. -- g_object_set (renderer,
  251. -- "editable", TRUE,
  252. -- NULL);
  253. -- g_signal_connect (renderer, "edited",
  254. -- G_CALLBACK (cell_edited), items_model);
  255. -- g_object_set_data (G_OBJECT (renderer), "column", GINT_TO_POINTER (COLUMN_ITEM_PRODUCT));
  256. -- gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  257. -- -1, "Product", renderer,
  258. -- "text", COLUMN_ITEM_PRODUCT,
  259. -- NULL);
  260. -- /* yummy column */
  261. -- renderer = gtk_cell_renderer_progress_new ();
  262. -- g_object_set_data (G_OBJECT (renderer), "column", GINT_TO_POINTER (COLUMN_ITEM_YUMMY));
  263. -- gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  264. -- -1, "Yummy", renderer,
  265. -- "value", COLUMN_ITEM_YUMMY,
  266. -- NULL);
  267. -- }
  268. -- GtkWidget *
  269. -- do_editable_cells (GtkWidget *do_widget)
  270. -- {
  271. -- if (!window)
  272. -- {
  273. -- GtkWidget *vbox;
  274. -- GtkWidget *hbox;
  275. -- GtkWidget *sw;
  276. -- GtkWidget *treeview;
  277. -- GtkWidget *button;
  278. -- GtkTreeModel *items_model;
  279. -- GtkTreeModel *numbers_model;
  280. -- /* create window, etc */
  281. -- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  282. -- gtk_window_set_screen (GTK_WINDOW (window),
  283. -- gtk_widget_get_screen (do_widget));
  284. -- gtk_window_set_title (GTK_WINDOW (window), "Shopping list");
  285. -- gtk_container_set_border_width (GTK_CONTAINER (window), 5);
  286. -- g_signal_connect (window, "destroy",
  287. -- G_CALLBACK (gtk_widget_destroyed), &window);
  288. -- vbox = gtk_vbox_new (FALSE, 5);
  289. -- gtk_container_add (GTK_CONTAINER (window), vbox);
  290. -- gtk_box_pack_start (GTK_BOX (vbox),
  291. -- gtk_label_new ("Shopping list (you can edit the cells!)"),
  292. -- FALSE, FALSE, 0);
  293. -- sw = gtk_scrolled_window_new (NULL, NULL);
  294. -- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
  295. -- GTK_SHADOW_ETCHED_IN);
  296. -- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
  297. -- GTK_POLICY_AUTOMATIC,
  298. -- GTK_POLICY_AUTOMATIC);
  299. -- gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
  300. -- /* create models */
  301. -- items_model = create_items_model ();
  302. -- numbers_model = create_numbers_model ();
  303. -- /* create tree view */
  304. -- treeview = gtk_tree_view_new_with_model (items_model);
  305. -- gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
  306. -- gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
  307. -- GTK_SELECTION_SINGLE);
  308. -- add_columns (GTK_TREE_VIEW (treeview), items_model, numbers_model);
  309. -- g_object_unref (numbers_model);
  310. -- g_object_unref (items_model);
  311. -- gtk_container_add (GTK_CONTAINER (sw), treeview);
  312. -- /* some buttons */
  313. -- hbox = gtk_hbox_new (TRUE, 4);
  314. -- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
  315. -- button = gtk_button_new_with_label ("Add item");
  316. -- g_signal_connect (button, "clicked",
  317. -- G_CALLBACK (add_item), items_model);
  318. -- gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
  319. -- button = gtk_button_new_with_label ("Remove item");
  320. -- g_signal_connect (button, "clicked",
  321. -- G_CALLBACK (remove_item), treeview);
  322. -- gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
  323. -- gtk_window_set_default_size (GTK_WINDOW (window), 320, 200);
  324. -- }
  325. -- if (!GTK_WIDGET_VISIBLE (window))
  326. -- gtk_widget_show_all (window);
  327. -- else
  328. -- {
  329. -- gtk_widget_destroy (window);
  330. -- window = NULL;
  331. -- }
  332. -- return window;
  333. -- }
  334. end