第 7 章 ウィジェットリファレンス 113
7.6 ツリービュー
7.6.1 簡単なリスト表示
リストデータを表示する手順は次のようになります.この流れを簡単な例(図7.26)をもとに解説します.ソースコード
はソース7–6–1のようになります.
1. リストモデルの作成 2. 列の作成と属性の割り当て 3. リストデータの追加
図7.26 リストの作成
リストモデルの作成(44–45行目)
リスト表示のためのモデルにはGtkListStoreを使用します.モデル作成には,関数gtk list store newを使います.
G t k L i s t S t o r e* g t k _ l i s t _ s t o r e _ n e w (g i n t n _ c o l u m n s , . . . ) ;
ま ず 第 1引 数 に は デ ー タ の 項 目 数 を 指 定 し ,残 り の 引 数 に は そ れ ぞ れ の 項 目 の デ ー タ 型 を G TYPE BOOLEAN,
G TYPE INT,G TYPE STRING,GDK TYPE PIXBUFなどのマクロで指定します.データの項目数は表示するデー
タ数だけではなく,セルの色などの属性なども含めた項目数を表します.これについては,次の例で詳しく説明します.
列の作成と属性の設定(49–54行目)
モデルを作成したら,次は各列の作成と属性の割り当てを行います.列を扱う場合には,GtkTreeViewColumnと GtkCell-Rendererを組み合わせて使用します.GtkTreeViewColumnは列全体を扱う変数で,GtkCellRendererは列データの描画を扱 う変数と考えてください.
GtkTreeViewColumnの作成には,関数gtk tree view column newを使用します.
G t k T r e e V i e w C o l u m n* g t k _ t r e e _ v i e w _ c o l u m n _ n e w (v o i d) ;
GtkCellRendererの作成は,列データにどんな種類のデータを描画するかによって,以下の関数を選択的に使用します.
• gtk cell renderer text new
数値や文字列を表示する場合にこの関数を使用します.
G t k C e l l R e n d e r e r* g t k _ c e l l _ r e n d e r e r _ t e x t _ n e w (v o i d) ;
• gtk cell renderer toggle new
TRUE,FALSEのデータをチェックボタンで表示する場合にこの関数を使用します.
G t k C e l l R e n d e r e r* g t k _ c e l l _ r e n d e r e r _ t o g g l e _ n e w (v o i d) ;
• gtk cell renderer pixbuf new
アイコンデータを表示する場合にこの関数を使用します.
G t k C e l l R e n d e r e r* g t k _ c e l l _ r e n d e r e r _ p i x b u f _ n e w (v o i d) ;
関 数gtk tree view column new で GtkTreeViewColumn を 作 成 し た 場 合 に は ,関 数gtk tree view column set title , gtk tree view column pack start,gtk tree view column set attributesを呼び出す必要があります.
表7.14 列の属性 属性 説明
text 数値や文字列を表示する列に対して設定する.
active ブール値をチェックボタンで表示する列に対して設定する.
pixbuf アイコンを表示する列に対して設定する.
1. 列のタイトル設定(51行目)
v o i d
g t k _ t r e e _ v i e w _ c o l u m n _ s e t _ t i t l e (G t k T r e e V i e w C o l u m n * t r e e _ c o l u m n , c o n s t g c h a r * t i t l e ) ; 2. GtkTreeViewColumnへのGtkCellRendererの登録(52行目)
v o i d
g t k _ t r e e _ v i e w _ c o l u m n _ p a c k _ s t a r t (G t k T r e e V i e w C o l u m n * t r e e _ c o l u m n , G t k C e l l R e n d e r e r * c e l l ,
g b o o l e a n e x p a n d ) ;
3. 列属性の割り当て(53–54行目)
関数gtk tree view column set attributesで,列に対して複数の属性を割り当てることができます.第3引数からは属 性と列番号を対にして与えて,引数の最後にはNULLを与えます.また,これまでの設定を保持したまま新しい設定を 追加したい場合には,関数gtk tree view column add attributeを使用します.
v o i d
g t k _ t r e e _ v i e w _ c o l u m n _ s e t _ a t t r i b u t e s (G t k T r e e V i e w C o l u m n * t r e e _ c o l u m n , G t k C e l l R e n d e r e r * c e l l _ r e n d e r e r , . . . ) ;
v o i d
g t k _ t r e e _ v i e w _ c o l u m n _ a d d _ a t t r i b u t e (G t k T r e e V i e w C o l u m n * t r e e _ c o l u m n , G t k C e l l R e n d e r e r * c e l l _ r e n d e r e r , c o n s t g c h a r * a t t r i b u t e ,
g i n t c o l u m n ) ;
リストデータを表示するために最低限使用する属性を表7.14に示します.このほかにも列に表示するデータの種類によって さまざまな属性があります.
関数gtk tree view column newを使用して列を作成した場合は,上記で説明したようにいくつかの関数を呼び出す必要があ
りますが,関数gtk tree view column new with attributes を使用すると上記の手順を一括して行うことができます(58–60 行目).
G t k T r e e V i e w C o l u m n*
g t k _ t r e e _ v i e w _ c o l u m n _ n e w _ w i t h _ a t t r i b u t e s (c o n s t g c h a r * t i t l e , G t k C e l l R e n d e r e r * c e l l , . . . ) ;
列のツリービューへの追加(55,61行目)
作成した列(GtkTreeViewColumn)をツリービューに追加するには,関数gtk tree view append columnを使います.関 数の戻り値として新しい列を追加した後の列数が返ります.
g i n t g t k _ t r e e _ v i e w _ a p p e n d _ c o l u m n (G t k T r e e V i e w * t r e e _ v i e w , G t k T r e e V i e w C o l u m n * c o l u m n ) ;
リストデータの追加(27–33行目)
リストデータの追加は次の手順で行います.
1. 行の追加(29行目)
行の追加は関数gtk list store appendを用います.
v o i d g t k _ l i s t _ s t o r e _ a p p e n d (G t k L i s t S t o r e * l i s t _ s t o r e , G t k T r e e I t e r * i t e r ) ; 2. 追加した行へのデータ登録(30–32行目)
関数gtk list store appendで取得したGtkTreeIterは,行データへのアクセスポイントとなります.このGtkTreeIter
を関数gtk list store setの引数に与えて,データを登録します.第3引数から列番号とデータを対にして指定し,最後
の引数は−1で終わります.
v o i d g t k _ l i s t _ s t o r e _ s e t (G t k L i s t S t o r e * l i s t _ s t o r e , G t k T r e e I t e r * i t e r , . . . ) ;
ソース7-6-1 リストの作成とデータの登録: gtkliststore-sample1.c
1 # i n c l u d e <g t k / g t k . h >
2 3 e n u m
4 {
5 C O L U M N _ I D ,
6 C O L U M N _ N A M E ,
7 N _ C O L U M N S
8 } ;
9
10 t y p e d e f s t r u c t _ L i s t D a t a
11 {
12 g u i n t i d ;
13 g c h a r * n a m e ;
14 } L i s t D a t a ;
15
16 s t a t i c L i s t D a t a d a t a [ ] = { {0 , " M i k e " } , {1 , " J o J o " } } ;
17
18 s t a t i c v o i d
19 a d d _ d a t a (G t k T r e e V i e w * t r e e v i e w )
20 {
21 G t k L i s t S t o r e * s t o r e ;
22 G t k T r e e I t e r i t e r ;
23 i n t n ;
24
25 s t o r e = G T K _ L I S T _ S T O R E ( g t k _ t r e e _ v i e w _ g e t _ m o d e l ( t r e e v i e w ) ) ;
26
27 f o r ( n = 0 ; n < s i z e o f ( d a t a ) / s i z e o f ( d a t a [ 0 ] ) ; n + + )
28 {
29 g t k _ l i s t _ s t o r e _ a p p e n d ( s t o r e , & i t e r ) ;
30 g t k _ l i s t _ s t o r e _ s e t ( s t o r e , & i t e r ,
31 C O L U M N _ I D , d a t a [ n ] . id ,
32 C O L U M N _ N A M E , d a t a [ n ] . n a m e , -1);
33 }
34 }
35
36 s t a t i c G t k W i d g e t*
37 c r e a t e _ l i s t _ m o d e l (v o i d)
38 {
39 G t k W i d g e t * t r e e v i e w ;
40 G t k L i s t S t o r e * l i s t s t o r e ;
41 G t k C e l l R e n d e r e r * r e n d e r e r ;
42 G t k T r e e V i e w C o l u m n * c o l u m n ;
43
44 l i s t s t o r e = g t k _ l i s t _ s t o r e _ n e w ( N _ C O L U M N S ,
45 G _ T Y P E _ U I N T , G _ T Y P E _ S T R I N G ) ;
46 t r e e v i e w = g t k _ t r e e _ v i e w _ n e w _ w i t h _ m o d e l ( G T K _ T R E E _ M O D E L ( l i s t s t o r e ) ) ;
47 g _ o b j e c t _ u n r e f ( l i s t s t o r e ) ;
48
49 r e n d e r e r = g t k _ c e l l _ r e n d e r e r _ t e x t _ n e w ( ) ;
50 c o l u m n = g t k _ t r e e _ v i e w _ c o l u m n _ n e w ( ) ;
51 g t k _ t r e e _ v i e w _ c o l u m n _ s e t _ t i t l e ( c o l u m n , " I D " ) ;
52 g t k _ t r e e _ v i e w _ c o l u m n _ p a c k _ s t a r t ( c o l u m n , r e n d e r e r , F A L S E ) ;
53 g t k _ t r e e _ v i e w _ c o l u m n _ s e t _ a t t r i b u t e s ( c o l u m n , r e n d e r e r ,
54 " t e x t " , C O L U M N _ I D , N U L L ) ;
55 g t k _ t r e e _ v i e w _ a p p e n d _ c o l u m n ( G T K _ T R E E _ V I E W ( t r e e v i e w ) , c o l u m n ) ;
56
57 r e n d e r e r = g t k _ c e l l _ r e n d e r e r _ t e x t _ n e w ( ) ;
58 c o l u m n =
59 g t k _ t r e e _ v i e w _ c o l u m n _ n e w _ w i t h _ a t t r i b u t e s ( " N a m e " , r e n d e r e r ,
60 " t e x t " , C O L U M N _ N A M E , N U L L ) ;
61 g t k _ t r e e _ v i e w _ a p p e n d _ c o l u m n ( G T K _ T R E E _ V I E W ( t r e e v i e w ) , c o l u m n ) ;
62
63 r e t u r n t r e e v i e w ;
64 }
65 66 i n t
67 m a i n (i n t a r g c , c h a r * * a r g v )
68 {
69 G t k W i d g e t * w i n d o w ;
70 G t k W i d g e t * t r e e v i e w ;
71
72 g t k _ i n i t ( & a r g c , & a r g v ) ;
73
74 w i n d o w = g t k _ w i n d o w _ n e w ( G T K _ W I N D O W _ T O P L E V E L ) ;
75 g t k _ w i n d o w _ s e t _ t i t l e ( G T K _ W I N D O W ( w i n d o w ) , " G t k L i s t S t o r e S a m p l e 1 " ) ;
76 g t k _ c o n t a i n e r _ s e t _ b o r d e r _ w i d t h ( G T K _ C O N T A I N E R ( w i n d o w ) , 5 ) ;
77 g _ s i g n a l _ c o n n e c t ( G _ O B J E C T ( w i n d o w ) , " d e s t r o y " ,
78 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ;
79 g t k _ w i d g e t _ s e t _ s i z e _ r e q u e s t ( w i n d o w , 3 0 0 , 1 0 0 ) ;
80
81 t r e e v i e w = c r e a t e _ l i s t _ m o d e l ( ) ;
82 g t k _ c o n t a i n e r _ a d d ( G T K _ C O N T A I N E R ( w i n d o w ) , t r e e v i e w ) ;
83
84 a d d _ d a t a ( G T K _ T R E E _ V I E W ( t r e e v i e w ) ) ;
85
86 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ;
87 g t k _ m a i n ( ) ;
88
89 r e t u r n 0 ;
90 }