tree_store.inc 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. (* Tree View/Tree Store
  2. *
  3. * The GtkTreeStore is used to store data in tree form, to be
  4. * used later on by a GtkTreeView to display it. This demo builds
  5. * a simple GtkTreeStore and displays it. If you're new to the
  6. * GtkTreeView widgets and associates, look into the GtkListStore
  7. * example first.
  8. *
  9. *)
  10. (*
  11. * todo: translate to pascal
  12. *)
  13. function do_tree_store : PGtkWidget;
  14. begin
  15. do_dummy ('Tree View / Tree Store - Demo');
  16. do_tree_store := NULL;
  17. end;
  18. (*
  19. #include <gtk/gtk.h>
  20. static GtkWidget *window = NULL;
  21. /* TreeItem structure */
  22. typedef struct _TreeItem TreeItem;
  23. struct _TreeItem
  24. {
  25. const gchar *label;
  26. gboolean alex;
  27. gboolean havoc;
  28. gboolean tim;
  29. gboolean owen;
  30. gboolean dave;
  31. gboolean world_holiday; /* shared by the European hackers */
  32. TreeItem *children;
  33. };
  34. /* columns */
  35. enum
  36. {
  37. HOLIDAY_NAME_COLUMN = 0,
  38. ALEX_COLUMN,
  39. HAVOC_COLUMN,
  40. TIM_COLUMN,
  41. OWEN_COLUMN,
  42. DAVE_COLUMN,
  43. VISIBLE_COLUMN,
  44. WORLD_COLUMN,
  45. NUM_COLUMNS
  46. };
  47. /* tree data */
  48. static TreeItem january[] =
  49. {
  50. {"New Years Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
  51. {"Presidential Inauguration", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
  52. {"Martin Luther King Jr. day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
  53. { NULL }
  54. };
  55. static TreeItem february[] =
  56. {
  57. { "Presidents' Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
  58. { "Groundhog Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  59. { "Valentine's Day", FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, NULL },
  60. { NULL }
  61. };
  62. static TreeItem march[] =
  63. {
  64. { "National Tree Planting Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  65. { "St Patrick's Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  66. { NULL }
  67. };
  68. static TreeItem april[] =
  69. {
  70. { "April Fools' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  71. { "Army Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  72. { "Earth Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  73. { "Administrative Professionals' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  74. { NULL }
  75. };
  76. static TreeItem may[] =
  77. {
  78. { "Nurses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  79. { "National Day of Prayer", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  80. { "Mothers' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  81. { "Armed Forces Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  82. { "Memorial Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
  83. { NULL }
  84. };
  85. static TreeItem june[] =
  86. {
  87. { "June Fathers' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  88. { "Juneteenth (Liberation of Slaves)", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  89. { "Flag Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
  90. { NULL }
  91. };
  92. static TreeItem july[] =
  93. {
  94. { "Parents' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  95. { "Independence Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
  96. { NULL }
  97. };
  98. static TreeItem august[] =
  99. {
  100. { "Air Force Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  101. { "Coast Guard Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  102. { "Friendship Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  103. { NULL }
  104. };
  105. static TreeItem september[] =
  106. {
  107. { "Grandparents' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  108. { "Citizenship Day or Constitution Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  109. { "Labor Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
  110. { NULL }
  111. };
  112. static TreeItem october[] =
  113. {
  114. { "National Children's Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  115. { "Bosses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  116. { "Sweetest Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  117. { "Mother-in-Law's Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  118. { "Navy Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  119. { "Columbus Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
  120. { "Halloween", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
  121. { NULL }
  122. };
  123. static TreeItem november[] =
  124. {
  125. { "Marine Corps Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  126. { "Veterans' Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
  127. { "Thanksgiving", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
  128. { NULL }
  129. };
  130. static TreeItem december[] =
  131. {
  132. { "Pearl Harbor Remembrance Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  133. { "Christmas", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
  134. { "Kwanzaa", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
  135. { NULL }
  136. };
  137. static TreeItem toplevel[] =
  138. {
  139. {"January", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, january},
  140. {"February", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, february},
  141. {"March", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, march},
  142. {"April", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, april},
  143. {"May", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, may},
  144. {"June", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, june},
  145. {"July", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, july},
  146. {"August", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, august},
  147. {"September", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, september},
  148. {"October", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, october},
  149. {"November", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, november},
  150. {"December", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, december},
  151. {NULL}
  152. };
  153. static GtkTreeModel *
  154. create_model (void)
  155. {
  156. GtkTreeStore *model;
  157. GtkTreeIter iter;
  158. TreeItem *month = toplevel;
  159. /* create tree store */
  160. model = gtk_tree_store_new (NUM_COLUMNS,
  161. G_TYPE_STRING,
  162. G_TYPE_BOOLEAN,
  163. G_TYPE_BOOLEAN,
  164. G_TYPE_BOOLEAN,
  165. G_TYPE_BOOLEAN,
  166. G_TYPE_BOOLEAN,
  167. G_TYPE_BOOLEAN,
  168. G_TYPE_BOOLEAN);
  169. /* add data to the tree store */
  170. while (month->label)
  171. {
  172. TreeItem *holiday = month->children;
  173. gtk_tree_store_append (model, &iter, NULL);
  174. gtk_tree_store_set (model, &iter,
  175. HOLIDAY_NAME_COLUMN, month->label,
  176. ALEX_COLUMN, FALSE,
  177. HAVOC_COLUMN, FALSE,
  178. TIM_COLUMN, FALSE,
  179. OWEN_COLUMN, FALSE,
  180. DAVE_COLUMN, FALSE,
  181. VISIBLE_COLUMN, FALSE,
  182. WORLD_COLUMN, FALSE,
  183. -1);
  184. /* add children */
  185. while (holiday->label)
  186. {
  187. GtkTreeIter child_iter;
  188. gtk_tree_store_append (model, &child_iter, &iter);
  189. gtk_tree_store_set (model, &child_iter,
  190. HOLIDAY_NAME_COLUMN, holiday->label,
  191. ALEX_COLUMN, holiday->alex,
  192. HAVOC_COLUMN, holiday->havoc,
  193. TIM_COLUMN, holiday->tim,
  194. OWEN_COLUMN, holiday->owen,
  195. DAVE_COLUMN, holiday->dave,
  196. VISIBLE_COLUMN, TRUE,
  197. WORLD_COLUMN, holiday->world_holiday,
  198. -1);
  199. holiday++;
  200. }
  201. month++;
  202. }
  203. return GTK_TREE_MODEL (model);
  204. }
  205. static void
  206. item_toggled (GtkCellRendererToggle *cell,
  207. gchar *path_str,
  208. gpointer data)
  209. {
  210. GtkTreeModel *model = (GtkTreeModel * )data;
  211. GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
  212. GtkTreeIter iter;
  213. gboolean toggle_item;
  214. gint *column;
  215. column = g_object_get_data (G_OBJECT (cell), "column");
  216. /* get toggled iter */
  217. gtk_tree_model_get_iter (model, &iter, path);
  218. gtk_tree_model_get (model, &iter, column, &toggle_item, -1);
  219. /* do something with the value */
  220. toggle_item ^= 1;
  221. /* set new value */
  222. gtk_tree_store_set (GTK_TREE_STORE (model), &iter, column,
  223. toggle_item, -1);
  224. /* clean up */
  225. gtk_tree_path_free (path);
  226. }
  227. static void
  228. add_columns (GtkTreeView *treeview)
  229. {
  230. gint col_offset;
  231. GtkCellRenderer *renderer;
  232. GtkTreeViewColumn *column;
  233. GtkTreeModel *model = gtk_tree_view_get_model (treeview);
  234. /* column for holiday names */
  235. renderer = gtk_cell_renderer_text_new ();
  236. g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
  237. col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  238. -1, "Holiday",
  239. renderer, "text",
  240. HOLIDAY_NAME_COLUMN,
  241. NULL);
  242. column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1);
  243. gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
  244. /* alex column */
  245. renderer = gtk_cell_renderer_toggle_new ();
  246. g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
  247. g_object_set_data (G_OBJECT (renderer), "column", (gint * )ALEX_COLUMN);
  248. g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (item_toggled),
  249. model);
  250. col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  251. -1, "Alex",
  252. renderer,
  253. "active",
  254. ALEX_COLUMN,
  255. "visible",
  256. VISIBLE_COLUMN,
  257. "activatable",
  258. WORLD_COLUMN, NULL);
  259. column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1);
  260. gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
  261. GTK_TREE_VIEW_COLUMN_FIXED);
  262. gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
  263. gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
  264. /* havoc column */
  265. renderer = gtk_cell_renderer_toggle_new ();
  266. g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
  267. g_object_set_data (G_OBJECT (renderer), "column", (gint * )HAVOC_COLUMN);
  268. g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (item_toggled),
  269. model);
  270. col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  271. -1, "Havoc",
  272. renderer,
  273. "active",
  274. HAVOC_COLUMN,
  275. "visible",
  276. VISIBLE_COLUMN,
  277. NULL);
  278. column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1);
  279. gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
  280. GTK_TREE_VIEW_COLUMN_FIXED);
  281. gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
  282. gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
  283. /* tim column */
  284. renderer = gtk_cell_renderer_toggle_new ();
  285. g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
  286. g_object_set_data (G_OBJECT (renderer), "column", (gint * )TIM_COLUMN);
  287. g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (item_toggled),
  288. model);
  289. col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  290. -1, "Tim",
  291. renderer,
  292. "active",
  293. TIM_COLUMN,
  294. "visible",
  295. VISIBLE_COLUMN,
  296. "activatable",
  297. WORLD_COLUMN, NULL);
  298. column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1);
  299. gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
  300. GTK_TREE_VIEW_COLUMN_FIXED);
  301. gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
  302. gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
  303. /* owen column */
  304. renderer = gtk_cell_renderer_toggle_new ();
  305. g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
  306. g_object_set_data (G_OBJECT (renderer), "column", (gint * )OWEN_COLUMN);
  307. g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (item_toggled),
  308. model);
  309. col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  310. -1, "Owen",
  311. renderer,
  312. "active",
  313. OWEN_COLUMN,
  314. "visible",
  315. VISIBLE_COLUMN,
  316. NULL);
  317. column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1);
  318. gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
  319. GTK_TREE_VIEW_COLUMN_FIXED);
  320. gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
  321. gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
  322. /* dave column */
  323. renderer = gtk_cell_renderer_toggle_new ();
  324. g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
  325. g_object_set_data (G_OBJECT (renderer), "column", (gint * )DAVE_COLUMN);
  326. g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (item_toggled),
  327. model);
  328. col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
  329. -1, "Dave",
  330. renderer,
  331. "active",
  332. DAVE_COLUMN,
  333. "visible",
  334. VISIBLE_COLUMN,
  335. NULL);
  336. column = gtk_tree_view_get_column (GTK_TREE_VIEW (treeview), col_offset - 1);
  337. gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
  338. GTK_TREE_VIEW_COLUMN_FIXED);
  339. gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
  340. gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
  341. }
  342. GtkWidget *
  343. do_tree_store (void)
  344. {
  345. if (!window)
  346. {
  347. GtkWidget *vbox;
  348. GtkWidget *sw;
  349. GtkWidget *treeview;
  350. GtkTreeModel *model;
  351. /* create window, etc */
  352. window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  353. gtk_window_set_title (GTK_WINDOW (window), "Card planning sheet");
  354. g_signal_connect (G_OBJECT (window), "destroy",
  355. G_CALLBACK (gtk_widget_destroyed), &window);
  356. vbox = gtk_vbox_new (FALSE, 8);
  357. gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
  358. gtk_container_add (GTK_CONTAINER (window), vbox);
  359. gtk_box_pack_start (GTK_BOX (vbox),
  360. gtk_label_new ("Jonathan's Holiday Card Planning Sheet"),
  361. FALSE, FALSE, 0);
  362. sw = gtk_scrolled_window_new (NULL, NULL);
  363. gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
  364. GTK_SHADOW_ETCHED_IN);
  365. gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
  366. GTK_POLICY_AUTOMATIC,
  367. GTK_POLICY_AUTOMATIC);
  368. gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
  369. /* create model */
  370. model = create_model ();
  371. /* create tree view */
  372. treeview = gtk_tree_view_new_with_model (model);
  373. g_object_unref (G_OBJECT (model));
  374. gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
  375. gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),
  376. GTK_SELECTION_MULTIPLE);
  377. add_columns (GTK_TREE_VIEW (treeview));
  378. gtk_container_add (GTK_CONTAINER (sw), treeview);
  379. /* expand all rows after the treeview widget has been realized */
  380. g_signal_connect (G_OBJECT (treeview), "realize",
  381. G_CALLBACK (gtk_tree_view_expand_all), NULL);
  382. gtk_window_set_default_size (GTK_WINDOW (window), 650, 400);
  383. }
  384. if (!GTK_WIDGET_VISIBLE (window))
  385. gtk_widget_show_all (window);
  386. else
  387. {
  388. gtk_widget_destroy (window);
  389. window = NULL;
  390. }
  391. return window;
  392. }
  393. *)