list_store.inc 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. (* Tree View/List Store
  2. *
  3. * The GtkListStore is used to store data in list form, to be used
  4. * later on by a GtkTreeView to display it. This demo builds a
  5. * simple GtkListStore and displays it. See the Stock Browser
  6. * demo for a more advanced example.
  7. *
  8. *)
  9. (*
  10. * todo: translate to pascal
  11. *)
  12. function do_list_store : PGtkWidget;
  13. begin
  14. do_dummy ('Tree View / List Store - Demo');
  15. do_list_store := NULL;
  16. end;
  17. (*
  18. #include <gtk/gtk.h>
  19. static GtkWidget *window = NULL;
  20. typedef struct
  21. {
  22. const gboolean fixed;
  23. const guint number;
  24. const gchar *severity;
  25. const gchar *description;
  26. }
  27. Bug;
  28. enum
  29. {
  30. COLUMN_FIXED,
  31. COLUMN_NUMBER,
  32. COLUMN_SEVERITY,
  33. COLUMN_DESCRIPTION,
  34. NUM_COLUMNS
  35. };
  36. static Bug data[] =
  37. {
  38. { FALSE, 60482, "Normal", "scrollable notebooks and hidden tabs" },
  39. { FALSE, 60620, "Critical", "gdk_window_clear_area (gdkwindow-win32.c) is not thread-safe" },
  40. { FALSE, 50214, "Major", "Xft support does not clean up correctly" },
  41. { TRUE, 52877, "Major", "GtkFileSelection needs a refresh method. " },
  42. { FALSE, 56070, "Normal", "Can't click button after setting in sensitive" },
  43. { TRUE, 56355, "Normal", "GtkLabel - Not all changes propagate correctly" },
  44. { FALSE, 50055, "Normal", "Rework width/height computations for TreeView" },
  45. { FALSE, 58278, "Normal", "gtk_dialog_set_response_sensitive () doesn't work" },
  46. { FALSE, 55767, "Normal", "Getters for all setters" },
  47. { FALSE, 56925, "Normal", "Gtkcalender size" },
  48. { FALSE, 56221, "Normal", "Selectable label needs right-click copy menu" },
  49. { TRUE, 50939, "Normal", "Add shift clicking to GtkTextView" },
  50. { FALSE, 6112, "Enhancement","netscape-like collapsable toolbars" },
  51. { FALSE, 1, "Normal", "First bug :=)" },
  52. };
  53. static GtkTreeModel *
  54. create_model (void)
  55. {
  56. gint i = 0;
  57. GtkListStore *store;
  58. GtkTreeIter iter;
  59. /* create list store */
  60. store = gtk_list_store_new (NUM_COLUMNS,
  61. G_TYPE_BOOLEAN,
  62. G_TYPE_UINT,
  63. G_TYPE_STRING,
  64. G_TYPE_STRING);
  65. /* add data to the list store */
  66. for (i = 0; i < G_N_ELEMENTS (data); i++)
  67. {
  68. gtk_list_store_append (store, &iter);
  69. gtk_list_store_set (store, &iter,
  70. COLUMN_FIXED, data[i].fixed,
  71. COLUMN_NUMBER, data[i].number,
  72. COLUMN_SEVERITY, data[i].severity,
  73. COLUMN_DESCRIPTION, data[i].description,
  74. -1);
  75. }
  76. return GTK_TREE_MODEL (store);
  77. }
  78. static void
  79. fixed_toggled (GtkCellRendererToggle *cell,
  80. gchar *path_str,
  81. gpointer data)
  82. {
  83. GtkTreeModel *model = (GtkTreeModel * )data;
  84. GtkTreeIter iter;
  85. GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
  86. gboolean fixed;
  87. /* get toggled iter */
  88. gtk_tree_model_get_iter (model, &iter, path);
  89. gtk_tree_model_get (model, &iter, COLUMN_FIXED, &fixed, -1);
  90. /* do something with the value */
  91. fixed ^= 1;
  92. /* set new value */
  93. gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_FIXED, fixed, -1);
  94. /* clean up */
  95. gtk_tree_path_free (path);
  96. }
  97. static void
  98. add_columns (GtkTreeView *treeview)
  99. {
  100. GtkCellRenderer *renderer;
  101. GtkTreeViewColumn *column;
  102. GtkTreeModel *model = gtk_tree_view_get_model (treeview);
  103. /* column for fixed toggles */
  104. renderer = gtk_cell_renderer_toggle_new ();
  105. g_signal_connect (G_OBJECT (renderer), "toggled",
  106. G_CALLBACK (fixed_toggled), model);
  107. column = gtk_tree_view_column_new_with_attributes ("Fixed?",
  108. renderer,
  109. "active", COLUMN_FIXED,
  110. NULL);
  111. /* set this column to a fixed sizing (of 50 pixels) */
  112. gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
  113. GTK_TREE_VIEW_COLUMN_FIXED);
  114. gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
  115. gtk_tree_view_append_column (treeview, column);
  116. /* column for bug numbers */
  117. renderer = gtk_cell_renderer_text_new ();
  118. column = gtk_tree_view_column_new_with_attributes ("Bug number",
  119. renderer,
  120. "text",
  121. COLUMN_NUMBER,
  122. NULL);
  123. gtk_tree_view_column_set_sort_column_id (column, COLUMN_NUMBER);
  124. gtk_tree_view_append_column (treeview, column);
  125. /* column for severities */
  126. renderer = gtk_cell_renderer_text_new ();
  127. column = gtk_tree_view_column_new_with_attributes ("Severity",
  128. renderer,
  129. "text",
  130. COLUMN_SEVERITY,
  131. NULL);
  132. gtk_tree_view_column_set_sort_column_id (column, COLUMN_SEVERITY);
  133. gtk_tree_view_append_column (treeview, column);
  134. /* column for description */
  135. renderer = gtk_cell_renderer_text_new ();
  136. column = gtk_tree_view_column_new_with_attributes ("Description",
  137. renderer,
  138. "text",
  139. COLUMN_DESCRIPTION,
  140. NULL);
  141. gtk_tree_view_column_set_sort_column_id (column, COLUMN_DESCRIPTION);
  142. gtk_tree_view_append_column (treeview, column);
  143. }
  144. GtkWidget *
  145. do_list_store (void)
  146. {
  147. if (!window)
  148. {
  149. GtkWidget *vbox;
  150. GtkWidget *label;
  151. GtkWidget *sw;
  152. GtkTreeModel *model;
  153. GtkWidget *treeview;
  154. /* create window, etc */
  155. window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  156. gtk_window_set_title (GTK_WINDOW (window), "GtkListStore demo");
  157. g_signal_connect (G_OBJECT (window), "destroy",
  158. G_CALLBACK (gtk_widget_destroyed), &window);
  159. gtk_container_set_border_width (GTK_CONTAINER (window), 8);
  160. vbox = gtk_vbox_new (FALSE, 8);
  161. gtk_container_add (GTK_CONTAINER (window), vbox);
  162. label = gtk_label_new ("This is the bug list (note: not based on real data, it would be nice to have a nice ODBC interface to bugzilla or so, though).");
  163. gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
  164. sw = gtk_scrolled_window_new (NULL, NULL);
  165. gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
  166. GTK_SHADOW_ETCHED_IN);
  167. gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
  168. GTK_POLICY_NEVER,
  169. GTK_POLICY_AUTOMATIC);
  170. gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
  171. /* create tree model */
  172. model = create_model ();
  173. /* create tree view */
  174. treeview = gtk_tree_view_new_with_model (model);
  175. gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
  176. gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview),
  177. COLUMN_DESCRIPTION);
  178. g_object_unref (G_OBJECT (model));
  179. gtk_container_add (GTK_CONTAINER (sw), treeview);
  180. /* add columns to the tree view */
  181. add_columns (GTK_TREE_VIEW (treeview));
  182. /* finish & show */
  183. gtk_window_set_default_size (GTK_WINDOW (window), 280, 250);
  184. }
  185. if (!GTK_WIDGET_VISIBLE (window))
  186. gtk_widget_show_all (window);
  187. else
  188. {
  189. gtk_widget_destroy (window);
  190. window = NULL;
  191. }
  192. return window;
  193. }
  194. *)