第 7 章 ウィジェットリファレンス 113
7.3 入力ウィジェット
7.3.2 コンボボックスエントリ
コンボボックスエントリ(GtkComboBoxEntry)は,コンボボックスとエントリを合成した複合ウィジェットです.コンボ ボックスはあらかじめ設定された項目からある項目を選択するウィジェットですが,コンボボックスエントリはエントリに入力 した文字列を新たな項目として追加可能なウィジェットです.
コンボボックス(エントリ)を扱うためにはGtkTreeViewウィジェットの知識が必要となります.より詳しく理解するため
には,GtkTreeViewウィジェットの解説(7.6節,p.179)を先に読まれることをおすすめします.
オブジェクトの階層構造 G O b j e c t
+ - - - -G I n i t i a l l y U n o w n e d + - - - -G t k O b j e c t
+ - - - -G t k W i d g e t
+ - - - -G t k C o n t a i n e r + - - - -G t k B i n
+ - - - -G t k C o m b o B o x
+ - - - -G t k C o m b o B o x E n t r y
ウィジェットの作成
コンボボックスエントリウィジェットを作成する関数を以下に示します.
• gtk combo box entry new text
コンボボックスエントリを作成する一番簡単な関数です.
G t k W i d g e t* g t k _ c o m b o _ b o x _ e n t r y _ n e w _ t e x t (v o i d) ;
• gtk combo box entry new
コンボボックスエントリを作成する関数です.この関数を使ってウィジェットを作成した場合は,その後で関数 gtk combo box set modelと関数gtk combo box entry set text columnを呼び出してコンボアイテムの設定をする必 要があります.この手間を省いてくれるのが上記の関数gtk combo box entry new textです.
G t k W i d g e t* g t k _ c o m b o _ b o x _ e n t r y _ n e w (v o i d) ;
• gtk combo box entry new with model
コンボアイテムのモデルを指定してコンボボックスエントリを作成する関数です.この関数を使用するには
Gtk-TreeModelの知識が必要です.
G t k W i d g e t*
g t k _ c o m b o _ b o x _ e n t r y _ n e w _ w i t h _ m o d e l (G t k T r e e M o d e l * m o d e l , g i n t t e x t _ c o l u m n ) ;
シグナルとコールバック関数
表7.10にコンボボックスエントリウィジェットのシグナルを示します.このシグナルはコンボボックスに対するシグナル です.
changedシグナルに対するコールバック関数のプロトタイプ宣言は次のようになります.
v o i d u s e r _ f u n c t i o n (G t k C o m b o B o x * c o m b o b o x , g p o i n t e r u s e r _ d a t a ) ;
ウィジェットのプロパティ設定
• 選択されているアイテムのインデックス
現在選択されているコンボアイテムが何番目のアイテムかを知りたいときには関数gtk combo box get activeを使用し ます.
g i n t g t k _ c o m b o _ b o x _ g e t _ a c t i v e (G t k C o m b o B o x * c o m b o _ b o x ) ;
また,標準値としてあらかじめアイテムを選択(または自動選択)したいときには,関数gtk combo box set activeを 使用します.アイテムのインデックスは0から始まります.
v o i d
g t k _ c o m b o _ b o x _ s e t _ a c t i v e (G t k C o m b o B o x * c o m b o _ b o x , g i n t i n d e x _ ) ;
• 選択されているアイテムの文字列
現在選択されているコンボアイテムの文字列を知りたいときには,ソース7–3–2のようにします.
ソース7-3-2 コンボアイテムの文字列の取得
1 G t k C o m b o B o x * c o m b o b o x ;
2 G t k T r e e M o d e l * m o d e l ;
3 G t k T r e e I t e r i t e r ;
4 g c h a r * l a b e l ;
5 m o d e l = g t k _ c o m b o _ b o x _ g e t _ m o d e l ( c o m b o b o x ) ;
6 i f ( g t k _ c o m b o _ b o x _ g e t _ a c t i v e _ i t e r ( c o m b o b o x , & i t e r ) )
7 {
8 g t k _ t r e e _ m o d e l _ g e t ( m o d e l , & i t e r , 0 , & l a b e l , -1);
9 }
関数gtk combo box get active iterは現在選択されているアイテムのGtkTreeIterを取得する関数です.選択されていない
場合はFALSEが返ります.
g b o o l e a n g t k _ c o m b o _ b o x _ g e t _ a c t i v e _ i t e r (G t k C o m b o B o x * c o m b o _ b o x , G t k T r e e I t e r * i t e r ) ;
関数gtk tree model getは設定されたモデルから指定した位置のデータを取得する関数です.第3番目の引数から,データ
のインデックス,データを格納する変数を並べて与えます.これは複数並べて記述することが可能です.関数の最後の引数は必 ず−1で終わらなければいけません.
v o i d g t k _ t r e e _ m o d e l _ g e t (G t k T r e e M o d e l * t r e e _ m o d e l , G t k T r e e I t e r * i t e r ,
. . . ) ;
サンプルプログラム
ソース7–3–3にコンボボックスエントリウィジェットのサンプルプログラムを示します.コンボボックスにはあらかじめ2
つのアイテムが登録されていて,アイテムを選択すると選択したアイテムのインデックスと文字列を端末に表示します.また,
エントリ内に文字列を入力(エンターキーの入力で確定)すると,その文字列が新しいアイテムとして登録されます.そして,
アイテム数が5を超えた場合には,先頭のアイテムを削除して,新しいアイテムを追加し,アイテム数が常に5つになるように してあります.
表7.10 コンボボックスエントリウィジェットのシグナル シグナル 説明
changed コンボアイテムが変更したときに発生するシグナル.
ソース7-3-3 コンボボックスエントリウィジェットのサンプルプログラム: gtkcomboboxentry-sample.c
1 # i n c l u d e <g t k / g t k . h >
2
3 # d e f i n e C O M B O _ L I S T _ L I M I T 5
4
5 s t a t i c G L i s t * c o m b o l i s t = N U L L ;
6
7 s t a t i c G L i s t*
8 a p p e n d _ i t e m (G t k C o m b o B o x * c o m b o b o x ,
9 G L i s t * c o m b o l i s t ,
10 c o n s t g c h a r * i t e m _ l a b e l )
11 {
12 g t k _ c o m b o _ b o x _ a p p e n d _ t e x t ( c o m b o b o x , i t e m _ l a b e l ) ;
13 c o m b o l i s t = g _ l i s t _ a p p e n d ( c o m b o l i s t , g _ s t r d u p ( i t e m _ l a b e l ) ) ;
14
15 r e t u r n c o m b o l i s t ;
16 }
17
18 s t a t i c G L i s t*
19 r e m o v e _ i t e m (G t k C o m b o B o x * c o m b o b o x ,
20 G L i s t * c o m b o l i s t ,
21 g i n t i n d e x )
22 {
23 g t k _ c o m b o _ b o x _ r e m o v e _ t e x t ( c o m b o b o x , i n d e x ) ;
24 g _ f r e e ( g _ l i s t _ n t h _ d a t a ( c o m b o l i s t , i n d e x ) ) ;
25 c o m b o l i s t
26 = g _ l i s t _ r e m o v e _ l i n k ( c o m b o l i s t , g _ l i s t _ n t h ( c o m b o l i s t , i n d e x ) ) ;
27
28 r e t u r n c o m b o l i s t ;
29 }
30
31 s t a t i c v o i d
32 c b _ c o m b o _ c h a n g e d (G t k C o m b o B o x * c o m b o b o x ,
33 g p o i n t e r u s e r _ d a t a )
34 {
35 G t k T r e e M o d e l * m o d e l ;
36 G t k T r e e I t e r i t e r ;
37 g c h a r * t e x t ;
38
39 m o d e l = g t k _ c o m b o _ b o x _ g e t _ m o d e l ( c o m b o b o x ) ;
40 i f ( g t k _ c o m b o _ b o x _ g e t _ a c t i v e _ i t e r ( c o m b o b o x , & i t e r ) )
41 {
42 g t k _ t r e e _ m o d e l _ g e t ( m o d e l , & i t e r , 0 , & t e x t , -1);
43 g _ p r i n t ( " I t e m n u m b e r i s % d ( % s ) \ n " ,
44 g t k _ c o m b o _ b o x _ g e t _ a c t i v e ( c o m b o b o x ) , t e x t ) ;
45 }
46 }
47
48 s t a t i c v o i d
49 c b _ c o m b o _ e n t r y _ a c t i v a t e (G t k E n t r y * e n t r y ,
50 g p o i n t e r u s e r _ d a t a )
51 {
52 G t k C o m b o B o x * c o m b o b o x ;
53 G L i s t * l i s t ;
54 g b o o l e a n e x i s t _ f l a g = F A L S E ;
55 c o n s t g c h a r * n e w _ t e x t ;
56
57 n e w _ t e x t = g t k _ e n t r y _ g e t _ t e x t ( e n t r y ) ;
58 i f ( ! n e w _ t e x t | | s t r c m p ( n e w _ t e x t , " " ) = = 0 ) r e t u r n;
59
60 f o r ( l i s t = c o m b o l i s t ; l i s t ; l i s t = g _ l i s t _ n e x t ( l i s t ) )
61 {
62 i f ( s t r c m p ( n e w _ t e x t , (g c h a r * ) l i s t - >d a t a ) = = 0 )
63 {
64 e x i s t _ f l a g = T R U E ;
65 b r e a k;
66 }
67 }
68 i f ( ! e x i s t _ f l a g )
69 {
70 c o m b o b o x = G T K _ C O M B O _ B O X ( u s e r _ d a t a ) ;
71 c o m b o l i s t = a p p e n d _ i t e m ( c o m b o b o x , c o m b o l i s t , n e w _ t e x t ) ;
72 i f ( g _ l i s t _ l e n g t h ( c o m b o l i s t ) > C O M B O _ L I S T _ L I M I T )
73 {
74 c o m b o l i s t = r e m o v e _ i t e m ( c o m b o b o x , c o m b o l i s t , 0 ) ;
75 }
76 g _ p r i n t ( " A p p e n d a n e w i t e m l a b e l ’%s ’.\n " , n e w _ t e x t ) ;
77 }
78 }
79 80 i n t
81 m a i n (i n t a r g c , c h a r * * a r g v )
82 {
83 G t k W i d g e t * w i n d o w ;
84 G t k W i d g e t * h b o x ;
85 G t k W i d g e t * l a b e l ;
86 G t k W i d g e t * c o m b o ;
87 G t k W i d g e t * b u t t o n ;
88
89 g t k _ i n i t ( & a r g c , & a r g v ) ;
90
91 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 ) ;
92 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 C o m b o B o x E n t r y S a m p l e " ) ;
93 g t k _ w i n d o w _ s e t _ r e s i z a b l e ( G T K _ W I N D O W ( w i n d o w ) , F A L S E ) ;
94 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 ) ;
95 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 " ,
96 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ;
97 h b o x = g t k _ h b o x _ n e w ( F A L S E , 5 ) ;
98 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 ) , h b o x ) ;
99
100 l a b e l = g t k _ l a b e l _ n e w ( " I n p u t : " ) ;
101 g t k _ b o x _ p a c k _ s t a r t ( G T K _ B O X ( h b o x ) , l a b e l , F A L S E , F A L S E , 0 ) ;
102
103 c o m b o = g t k _ c o m b o _ b o x _ e n t r y _ n e w _ t e x t ( ) ;
104 c o m b o l i s t = a p p e n d _ i t e m ( G T K _ C O M B O _ B O X ( c o m b o ) , c o m b o l i s t , " 1 s t I t e m " ) ;
105 c o m b o l i s t = a p p e n d _ i t e m ( G T K _ C O M B O _ B O X ( c o m b o ) , c o m b o l i s t , " 2 n d I t e m " ) ;
106 g t k _ c o m b o _ b o x _ s e t _ a c t i v e ( G T K _ C O M B O _ B O X ( c o m b o ) , 0 ) ;
107
108 g _ s i g n a l _ c o n n e c t ( G _ O B J E C T ( c o m b o ) , " c h a n g e d " ,
109 G _ C A L L B A C K ( c b _ c o m b o _ c h a n g e d ) , N U L L ) ;
110 g _ s i g n a l _ c o n n e c t ( G _ O B J E C T ( G T K _ B I N ( c o m b o ) - >c h i l d ) , " a c t i v a t e " ,
111 G _ C A L L B A C K ( c b _ c o m b o _ e n t r y _ a c t i v a t e ) , c o m b o ) ;
112
113 g t k _ b o x _ p a c k _ s t a r t ( G T K _ B O X ( h b o x ) , c o m b o , T R U E , T R U E , 0 ) ;
114
115 b u t t o n = g t k _ b u t t o n _ n e w _ f r o m _ s t o c k ( G T K _ S T O C K _ Q U I T ) ;
116 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 " ,
117 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ;
118 g t k _ b o x _ p a c k _ s t a r t ( G T K _ B O X ( h b o x ) , b u t t o n , F A L S E , F A L S E , 0 ) ;
119
120 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ;
121 g t k _ m a i n ( ) ;
122
123 r e t u r n 0 ;
124 }