1;; Copyright (C) 2004 Patrick Bernaud
2;; GNU General Public License version 2 or later. No warrantee.
3
4(define-module (demos list-store)
5  :use-module (oop goops)
6  :use-module (gnome gobject)
7  :use-module (gnome gtk))
8
9
10(define data
11  '((#f 60482 "Normal"      "scrollable notebooks and hidden tabs")
12    (#f 60620 "Critical"    "gdk_window_clear_area (gdkwindow-win32.c) is not thread-safe")
13    (#f 50214 "Major"       "Xft support does not clean up correctly")
14    (#t 52877 "Major"       "GtkFileSelection needs a refresh method. ")
15    (#f 56070 "Normal"      "Can't click button after setting in sensitive")
16    (#t 56355 "Normal"      "GtkLabel - Not all changes propagate correctly")
17    (#f 50055 "Normal"      "Rework width/height computations for TreeView")
18    (#f 58278 "Normal"      "gtk_dialog_set_response_sensitive () doesn't work")
19    (#f 55767 "Normal"      "Getters for all setters")
20    (#f 56925 "Normal"      "Gtkcalender size")
21    (#f 56221 "Normal"      "Selectable label needs right-click copy menu")
22    (#t 50939 "Normal"      "Add shift clicking to GtkTextView")
23    (#f 6112  "Enhancement" "netscape-like collapsable toolbars")
24    (#f 1     "Normal"      "First bug :=)")))
25
26
27(define (populate-model store)
28  ;; add data to the list store
29  (for-each
30   (lambda (b)
31     (let ((iter (gtk-list-store-append store)))
32       (for-each
33	(lambda (col data)
34	  (set-value store iter col data))
35	'(0 1 2 3) b)))
36   data))
37
38(define (fixed-toggled treemodel pathstr)
39  (let* (
40	 ;; get toggled iter
41	 (iter  (get-iter treemodel pathstr))
42	 ;; get current value and invert
43	 (fixed (not (get-value treemodel iter 0))))
44    ;; set the new value
45    (set-value treemodel iter 0 fixed)))
46
47(define (add-columns treeview)
48  (let* ((model    (get-model treeview))
49	 ;; column for fixed toggles
50	 (renderer1 (make <gtk-cell-renderer-toggle>))
51	 (column1   (make <gtk-tree-view-column>
52		      :title "Fixed?"
53		      ;; set this column to a fixed sizing (of 50 pixels)
54		      :sizing 'fixed
55		      :fixed-width 50))
56	 ;; column for bug numbers
57	 (renderer2 (make <gtk-cell-renderer-text>))
58	 (column2   (make <gtk-tree-view-column>
59		      :title "Bug number"))
60	 ;; column for severities
61	 (renderer3 (make <gtk-cell-renderer-text>))
62	 (column3   (make <gtk-tree-view-column>
63		      :title "Severity"))
64	 ;; column for description
65	 (renderer4 (make <gtk-cell-renderer-text>))
66	 (column4   (make <gtk-tree-view-column>
67		      :title "Description"))
68	 )
69    (connect renderer1 'toggled (lambda (w p)
70				  (fixed-toggled model p)))
71    (pack-start column1 renderer1 #f)
72    (add-attribute column1 renderer1 "active" 0)
73    (append-column treeview column1)
74
75    (pack-start column2 renderer2 #f)
76    (add-attribute column2 renderer2 "text" 1)
77    (set-sort-column-id column2 1)
78    (append-column treeview column2)
79
80    (pack-start column3 renderer3 #f)
81    (add-attribute column3 renderer3 "text" 2)
82    (set-sort-column-id column3 2)
83    (append-column treeview column3)
84
85    (pack-start column4 renderer4 #f)
86    (add-attribute column4 renderer4 "text" 3)
87    (set-sort-column-id column4 4)
88    (append-column treeview column4)))
89
90(define (main)
91  (let* (
92	 ;; create window, etc
93	 (window   (make <gtk-window>
94		     :type 'toplevel :title "GtkListStore demo"
95		     :default-width 280 :default-height 250 :border-width 8))
96	 (vbox     (make <gtk-vbox> :homogeneous #f :spacing 8))
97	 (label    (make <gtk-label>
98		     :label (string-append
99			     "This is the bug list (note: not based on real "
100			     "data, it would be nice to have a nice ODBC "
101			     "interface to bugzilla or so, though).")))
102	 (sw       (make <gtk-scrolled-window>
103		     :hscrollbar-policy 'never :vscrollbar-policy 'automatic
104		     :shadow-type 'etched-in))
105	 ;; create list store
106	 (model    (gtk-list-store-new (list <gboolean>
107					     <guint>
108					     <gchararray>
109					     <gchararray>)))
110	 ;; create tree view
111	 (treeview (make <gtk-tree-view>
112		     :model model :rules-hint #t :search-column 3)))
113    (populate-model model)
114
115    (add window vbox)
116
117    (pack-start vbox label #f #f 0)
118
119    (pack-start vbox sw #t #t 0)
120
121    (add sw treeview)
122
123    ;; add columns to the tree view
124    (add-columns treeview)
125
126    (show-all window)))
127
128
129(define name "Tree View/List Store")
130(define description
131  (string-append
132   "The GtkListStore is used to store data in list form, to be used "
133   "later on by a GtkTreeView to display it. This demo builds a "
134   "simple GtkListStore and displays it. See the Stock Browser "
135   "demo for a more advanced example."))
136