第 6 章 ウィジェットリファレンス 83
6.6 ツリービュー
6.6.1 簡単なリスト表示
45 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 ) , b u t t o n ) ;
46 g _ s i g n a l _ c o n n e c t ( G _ O B J E C T ( b u t t o n ) , " c l i c k e d " ,
47 G _ C A L L B A C K ( c b _ s h o w _ d i a l o g ) , N U L L ) ;
48
49 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ;
50 g t k _ m a i n ( ) ;
51
52 r e t u r n 0 ;
53 }
1. リストモデルの作成 2. 列の作成と属性の割り当て 3. リストデータの追加
図6.28 リストの作成
リストモデルの作成(37–38行目)
リスト表示のためのモデルには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 な ど の マ ク ロ で 指 定します. データの項目数は表示するデータ数だけではなく, セルの色などの属性なども含めた項目数を表し ます. このことについては,次の例で詳しく説明します.
列の作成と属性の設定(42–48行目)
モデルを作成したら, 次は各列の作成と属性の割り当てを行います. 列を扱う場合には, GtkTreeView-Column とGtkCellRenderer を組み合わせて使用します. 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 を呼び出す必要があり ます.
1. 列のタイトル設定(44行目)
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の登録(45行目) 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. 列属性の割り当て(46–47行目)
関数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 ) ;
リストデータを表示するために最低限使用する属性を表6.12に示します. この他にも列に表示するデータの 種類によって様々な属性があります.
関数gtk tree view column newを使用して列を作成した場合は, 上記で説明したように幾つかの関数を呼
び出す必要がありますが, 関数gtk tree view column new with attributesを使用すると上記の手順を一括し て行うことができます(51–53行目).
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 , . . . ) ;
表6.12 列の属性
属性 説明
”text” 数値や文字列を表示する列に対して設定します.
”active” ブール値をチェックボタンで表示する列に対して設定します.
”pixbuf” アイコンを表示する列に対して設定します.
列のツリービューへの追加(48行目)
作成した列(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 ) ;
リストデータの追加(24–27行目)
リストデータの追加は次の手順で行います. 1. 行の追加(24行目)
行の追加は関数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. 追加した行へのデータ登録(25–27行目)
関数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 ,
. . . ) ;
ソース 6–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 C O L U M N _ I D ,
5 C O L U M N _ N A M E ,
6 N _ C O L U M N S
7 } ;
8
9 t y p e d e f s t r u c t _ L i s t D a t a {
10 g u i n t i d ;
11 g c h a r * n a m e ;
12 } L i s t D a t a ;
13
14 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 " } } ;
15
16 s t a t i c v o i d 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 ) {
17 G t k L i s t S t o r e * s t o r e ;
18 G t k T r e e I t e r i t e r ;
19 i n t n ;
20
21 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 ) ) ;
22
23 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 + + ) {
24 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 ) ;
25 g t k _ l i s t _ s t o r e _ s e t ( s t o r e , & i t e r ,
26 C O L U M N _ I D , d a t a [ n ] . id ,
27 C O L U M N _ N A M E , d a t a [ n ] . n a m e , -1);
28 }
29 }
30
31 s t a t i c G t k W i d g e t* c r e a t e _ l i s t _ m o d e l (v o i d) {
32 G t k W i d g e t * t r e e v i e w ;
33 G t k L i s t S t o r e * l i s t s t o r e ;
34 G t k C e l l R e n d e r e r * r e n d e r e r ;
35 G t k T r e e V i e w C o l u m n * c o l u m n ;
36
37 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 ,
38 G _ T Y P E _ U I N T , G _ T Y P E _ S T R I N G ) ;
39 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 ) ) ;
40 g _ o b j e c t _ u n r e f ( l i s t s t o r e ) ;
41
42 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 ( ) ;
43 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 ( ) ;
44 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 " ) ;
45 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 ) ;
46 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 ,
47 " t e x t " , C O L U M N _ I D , N U L L ) ;
48 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 ) ;
49
50 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 ( ) ;
51 c o l u m n =
52 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 ,
53 " t e x t " , C O L U M N _ N A M E , N U L L ) ;
54 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 ) ;
55
56 r e t u r n t r e e v i e w ;
57 }
58
59 i n t m a i n (i n t ar g c , c h a r * * a r g v ) {
60 G t k W i d g e t * w i n d o w ;
61 G t k W i d g e t * t r e e v i e w ;
62
63 g t k _ i n i t ( & a r g c , & a r g v ) ;
64 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 ) ;
65 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 " ) ;
66 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 ) ;
67 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 " ,
68 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ;
69 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 ) ;
70
71 t r e e v i e w = c r e a t e _ l i s t _ m o d e l ( ) ;
72 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 ) ;
73
74 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 ) ) ;
75
76 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ;
77 g t k _ m a i n ( ) ;
78
79 r e t u r n 0 ;
80 }