1 /*
2  * This file is part of gtkD.
3  *
4  * gtkD is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation; either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * gtkD is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with gtkD; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
17  */
18 
19 
20 /*****************************************************************************
21 
22     Authors: Frank Benoit <keinfarbton@googlemail.com>
23              muntyan #gtk+
24 
25     This demo shows a table with key/value pairs. The values can be edited.
26     There are two types of values: strings and bools. Dependent of the type,
27     either a CellRendererText or CellRendererToggle is used to show and edit
28     the value.
29 
30     This is done by connecting the visibility of a CellRenderer to a
31     ListStore column.
32 
33 *****************************************************************************/
34 module DemoMultiCellRenderer;
35 
36 import gtk.Main;
37 import gdk.Event;
38 import gtk.Window;
39 import gtk.Widget;
40 import gtk.TreeIter;
41 import gtk.TreePath;
42 import gtk.TreeView;
43 import gtk.TreeViewColumn;
44 import gtk.CellRendererText;
45 import gtk.CellRendererToggle;
46 import gtk.ListStore;
47 
48 enum {
49     COLUMN_NAME,
50     COLUMN_TEXT,
51     COLUMN_TEXT_VISIBLE,
52     COLUMN_BOOL,
53     COLUMN_BOOL_VISIBLE
54 }
55 
56 void main(string[] args){
57     Main.init(args);
58     ListStore store = new ListStore( [
59         GType.STRING,
60         GType.STRING,
61         GType.INT,
62         GType.INT,
63         GType.INT] );
64 
65     void appendRecord( string name, string value, bool isBoolean ){
66         auto it = store.createIter();
67         store.setValue( it, COLUMN_NAME, name );
68         store.setValue( it, COLUMN_TEXT, value );
69         store.setValue( it, COLUMN_TEXT_VISIBLE, !isBoolean );
70         store.setValue( it, COLUMN_BOOL, value == "true" );
71         store.setValue( it, COLUMN_BOOL_VISIBLE, isBoolean  );
72     }
73     // fill store with data
74     appendRecord( "Loops", "10", false );
75     appendRecord( "Name", "keinfarbton", false );
76     appendRecord( "Verbose", "true", true );
77 
78     auto wnd = new Window( "Celleditor Demo" );
79     auto tv  = new TreeView();
80     wnd.add(tv);
81 
82     // create first column with text renderer
83     TreeViewColumn column = new TreeViewColumn();
84     column.setTitle( "Name" );
85     tv.appendColumn(column);
86 
87     CellRendererText cell_text = new CellRendererText();
88     column.packStart(cell_text, 0 );
89     column.addAttribute(cell_text, "text", COLUMN_NAME);
90 
91     // create second column with two renderers
92     column = new TreeViewColumn();
93     column.setTitle( "Value" );
94     tv.appendColumn(column);
95 
96     CellRendererToggle cell_bool = new CellRendererToggle();
97     column.packStart(cell_bool, 0 );
98     column.addAttribute(cell_bool, "active", COLUMN_BOOL);
99     column.addAttribute(cell_bool, "visible", COLUMN_BOOL_VISIBLE);
100 
101     cell_text = new CellRendererText();
102     column.packStart(cell_text, 0 );
103     column.addAttribute(cell_text, "text", COLUMN_TEXT);
104     column.addAttribute(cell_text, "visible", COLUMN_TEXT_VISIBLE);
105     cell_text.setProperty( "editable", 1 );
106 
107     // change value in store on toggle event
108     cell_bool.addOnToggled( delegate void(string p, CellRendererToggle){
109         auto path = new TreePath( p );
110         auto it = new TreeIter( store, path );
111         store.setValue(it, COLUMN_BOOL, it.getValueInt( COLUMN_BOOL ) ? 0 : 1 );
112     });
113 
114     // change the text in the store on end of edit
115     cell_text.addOnEdited( delegate void(string p, string v, CellRendererText cell ){
116         auto path = new TreePath( p );
117         auto it = new TreeIter( store, path );
118         store.setValue( it, COLUMN_TEXT, v );
119     });
120 
121     tv.setModel(store);
122     wnd.showAll();
123 
124     wnd.addOnDelete( delegate bool (Event event, Widget widget) {
125         widget.destroy();
126         Main.quit();
127         return false;
128     });
129 
130     Main.run();
131 }
132