第 6 章 ウィジェットリファレンス 83
6.5 ダイアログ
6.5.4 新しいファイル選択ダイアログ
46
47 i n t m a i n (i n t ar g c , c h a r * * a r g v ) {
48 G t k W i d g e t * w i n d o w ;
49 G t k W i d g e t * h b o x ;
50 G t k W i d g e t * l a b e l ;
51 G t k W i d g e t * e n t r y ;
52 G t k W i d g e t * b u t t o n ;
53
54 g t k _ i n i t ( & a r g c , & a r g v ) ;
55 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 ) ;
56 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 F i l e S e l e c t i o n à S a m p l e " ) ;
57 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 ) ;
58 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 " ,
59 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ;
60
61 h b o x = g t k _ h b o x _ n e w ( F A L S E , 5 ) ;
62 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 ) ;
63
64 l a b e l = g t k _ l a b e l _ n e w ( " F i l e à : " ) ;
65 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 ) ;
66
67 e n t r y = g t k _ e n t r y _ n e w ( ) ;
68 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 ) , e n t r y , T R U E , T R U E , 0 ) ;
69 g _ o b j e c t _ s e t _ d a t a ( G _ O B J E C T ( e n t r y ) , " p a r e n t " , (g p o i n t e r) w i n d o w ) ;
70
71 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 _ O P E N ) ;
72 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 " ,
73 G _ C A L L B A C K ( c b _ b u t t o n ) , (g p o i n t e r) e n t r y ) ;
74 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 ) ;
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 }
G t k W i d g e t * p a r e n t , G t k F i l e C h o o s e r A c t i o n a c t i o n ,
c o n s t g c h a r * f i r s t _ b u t t o n _ t e x t , . . . ) ;
引数に与える情報は関数のプロトタイプ宣言だけではわかりにくいので例を挙げて説明します. まず,第1 引数と第2引数には, ダイアログのタイトルとそのダイアログを呼び出す親となるウィジェットを与えます. そして第3引数のGtkFileChooserActionには次に示すように4通りの選択肢があります. これは作成するダ イアログがファイルを開くために使用するのか、ファイルを保存するために使用するのかといったダイアログ の種類を指定するための引数です.
t y p e d e f e n u m {
G T K _ F I L E _ C H O O S E R _ A C T I O N _ O P E N , G T K _ F I L E _ C H O O S E R _ A C T I O N _ S A V E ,
G T K _ F I L E _ C H O O S E R _ A C T I O N _ S E L E C T _ F O L D E R , G T K _ F I L E _ C H O O S E R _ A C T I O N _ C R E A T E _ F O L D E R } G t k F i l e C h o o s e r A c t i o n;
第4引数からはダイアログに表示するボタンの指定を行います. ボタンを指定するための引数は「ボタンの ラベル」と「ボタンの種類」を組として与えます. そして,最後の引数にはNULLを終端の印として与えます. ボタンの種類はGtkResponseTypeから指定します。
以下の例は「開く」ボタンと「キャンセル」ボタンを持つファイルを開くためのダイアログを作成するもの です. 例のようにボタンのラベルとしてGtkStockItemを使用することができます.
d i a l o g =
g t k _ f i l e _ c h o o s e r _ d i a l o g _ n e w ( " F i l e à O p e n à D i a l o g " , G T K _ W I D G E T ( p a r e n t ) ,
G T K _ F I L E _ C H O O S E R _ A C T I O N _ O P E N , G T K _ S T O C K _ C A N C E L ,
図6.26 新しいファイル選択ダイアログ
G T K _ R E S P O N S E _ C A N C E , G T K _ S T O C K _ O P E N , G T K _ R E S P O N S E _ A C C E P T , N U L L ) ;
ウィジェットのプロパティ設定
ファイル選択ダイアログの設定項目を以下に示します.
• ファイル名
関数gtk file chooser get filenameによって,エントリに入力されているファイル名を取得したり,関数 gtk file chooser set filename によって,指定したファイル名をエントリに設定することができます.
g c h a r* g t k _ f i l e _ c h o o s e r _ g e t _ f i l e n a m e (G t k F i l e C h o o s e r * c h o o s e r ) ;
g b o o l e a n g t k _ f i l e _ c h o o s e r _ s e t _ f i l e n a m e (G t k F i l e C h o o s e r * c h o o s e r , c o n s t g c h a r * f i l e n a m e ) ;
また同様の関数に関数gtk file chooser get uri,関数gtk file chooser set uriがあります. これらの関 数はローカルなファイル名の代わりにURIの形式でファイル名を取得したりします. 例えばローカルな ファイルであれば, file:///で始まるファイル名となります.
g c h a r* g t k _ f i l e _ c h o o s e r _ g e t _ u r i (G t k F i l e C h o o s e r * c h o o s e r ) ;
g b o o l e a n g t k _ f i l e _ c h o o s e r _ s e t _ u r i (G t k F i l e C h o o s e r * c h o o s e r , c o n s t g c h a r * f i l e n a m e ) ;
複数のファイルを選択できる場合には,関数gtk file chooser get filenames,関数gtk file chooser get uris を使用すると選択した複数のファイル名を取得することができます. 選択したファイル名は単方向リス トとして取得されます.
G S L i s t* g t k _ f i l e _ c h o o s e r _ g e t _ f i l e n a m e s (G t k F i l e C h o o s e r * c h o o s e r ) ;
G S L i s t* g t k _ f i l e _ c h o o s e r _ g e t _ u r i s (G t k F i l e C h o o s e r * c h o o s e r ) ;
• フォルダ名
現在の開いているフォルダ名を取得したり設定するには, 関数gtk file chooser get current folder,関 数gtk file chooser set current folderを使用します. ファイル名と同様にURI用の関数として, 関数 gtk file chooser get current folder uri, 関数gtk file chooser set current folder uriがあります.
g c h a r* g t k _ f i l e _ c h o o s e r _ g e t _ c u r r e n t _ f o l d e r (G t k F i l e C h o o s e r * c h o o s e r ) ;
g b o o l e a n
g t k _ f i l e _ c h o o s e r _ s e t _ c u r r e n t _ f o l d e r (G t k F i l e C h o o s e r * c h o o s e r ,
g c h a r * f i l e n a m e ) ;
g c h a r*
g t k _ f i l e _ c h o o s e r _ g e t _ c u r r e n t _ f o l d e r _ u r i (G t k F i l e C h o o s e r * c h o o s e r ) ;
g b o o l e a n
g t k _ f i l e _ c h o o s e r _ s e t _ c u r r e n t _ f o l d e r _ u r i (G t k F i l e C h o o s e r * c h o o s e r ,
g c h a r * u r i ) ;
• ファイルフィルタ
GtkFileChooserではダイアログに表示するファイルをフィルタリングすることができます. フィルタ
を設定することにより,ダイアログの目的に応じて必要なファイルのみを表示させることができます. フィルタの扱いはGtkFileFilterを使用します. ここではGtkFileFilterの詳細については省略します が,フィルタを作成してダイアログに登録する手順は以下のようになります.
1. フィルタの作成
関数gtk file filter newで新規のフィルタを作成します.
G t k F i l e F i l t e r* g t k _ f i l e _ f i l t e r _ n e w (v o i d) ;
2. ダイアログに表示するフィルタ名の設定
関数gtk file filter set nameでダイアログに表示するフィルタ名の設定を行います. v o i d g t k _ f i l e _ f i l t e r _ s e t _ n a m e (G t k F i l e F i l t e r * f i l t e r ,
c o n s t g c h a r * n a m e ) ;
3. フィルタリング規則の設定
作成したフィルタがどのようなファイルを表示するのかフィルタリング設定を行います. フィルタ リング設定の関数には以下に示すような関数が用意されています. 詳細は省略しますが,具体的な 使用方法についてはソース 6–5–4を参考にして下さい.
v o i d g t k _ f i l e _ f i l t e r _ a d d _ p a t t e r n (G t k F i l e F i l t e r * f i l t e r , c o n s t g c h a r * p a t t e r n ) ;
v o i d g t k _ f i l e _ f i l t e r _ a d d _ m i m e _ t y p e (G t k F i l e F i l t e r * f i l t e r , c o n s t g c h a r * m i m e _ t y p e ) ;
v o i d g t k _ f i l e _ f i l t e r _ a d d _ p i x b u f _ f o r m a t s (G t k F i l e F i l t e r * f i l t e r ) ;
4. ダイアログへの登録
関数gtk file chooser add filterでダイアログにフィルタを登録します.
v o i d g t k _ f i l e _ c h o o s e r _ a d d _ f i l t e r (G t k F i l e C h o o s e r * c h o o s e r , G t k F i l e F i l t e r * f i l t e r ) ;
• 上書き保存の確認の有無
ダ イ ア ロ グ の 種 類 と し て GTK FILE CHOOSER ACTION SAVE を 指 定 し て い る 場 合 に, 選 択 さ れ た フ ァ イ ル が 既 に 存 在 す る と き に 上 書 き 確 認 の ダ イ ア ロ グ を 表 示 す る か ど う か を 設 定 し ま す. 関 数 gtk file chooser set do overwrite confirmation の 第 2 引 数 に TRUE を 指 定 す る と, 上 書 き 確 認 の ダ イ ア ロ グ が 表 示 さ れ る よ う に な り ま す. ま た, 現 在 の 設 定 を 取 得 す る に は, 関 数 gtk file chooser get do overwrite confirmationを使用します.
v o i d g t k _ f i l e _ c h o o s e r _ s e t _ d o _ o v e r w r i t e _ c o n f i r m a t i o n (G t k F i l e C h o o s e r * c h o o s e r ,
g b o o l e a n d o _ o v e r w r i t e _ c o n f i r m a t i o n ) ;
g b o o l e a n g t k _ f i l e _ c h o o s e r _ g e t _ d o _ o v e r w r i t e _ c o n f i r m a t i o n (G t k F i l e C h o o s e r * c h o o s e r ) ;
• 隠しファイルの表示の有無
関数gtk file chooser set show hiddenの第2引数にTRUEを指定すると,ピリオドで始まる隠しファ
イルも表示するようになります. また,関数gtk file chooser get show hiddenを使用することで現在の 設定を取得することができます.
v o i d g t k _ f i l e _ c h o o s e r _ s e t _ s h o w _ h i d e e n (G t k F i l e C h o o s e r * c h o o s e r , g b o o l e a n s h o w _ h i d d e n ) ;
g b o o l e a n g t k _ f i l e _ c h o o s e r _ g e t _ s h o w _ h i d e e n (G t k F i l e C h o o s e r * c h o o s e r ) ;
• 複数ファイルの選択の有無
関数gtk file chooser set select multipleの第2引数にTRUEを指定すると,ダイアログで複数のファイル を選択できるようになります. 関数gtk file chooser get select multipleを使用することで現在の設定を取得 することができます.
v o i d g t k _ f i l e _ c h o o s e r _ s e t _ s e l e c t _ m u l t i p l e (G t k F i l e C h o o s e r * c h o o s e r ,
g b o o l e a n s e l e c t _ m u l t i p l e ) ;
g b o o l e a n g t k _ f i l e _ c h o o s e r _ g e t _ s e l e c t _ m u l t i p l e (G t k F i l e C h o o s e r * c h o o s e r ) ;
サンプルプログラム
ソース6–5–4に新しいファイル選択ダイアログのサンプルプログラムを示します. 動作はソース6–5–3と同
様です. 異なる点はフィルタを設定してダイアログに表示するファイルをコントロールできるところです. 8行目から59行目までのダイアログの動作部分の詳細について説明します. まず23行目の関数でファ イルを開くためのファイル選択ダイアログを作成します. そして, 31行目から39行目でフィルタの設定 を行っています. ここでは, すべてのファイルを表示するためのフィルタと Jpeg画像フォーマットを表 示するためのフィルタを設定しています. すべてのファイルを表示するためのフィルタの設定には, 関数 gtk file filter add patternを使用して,パターンに”*”を指定しています. またJpeg画像フォーマットのため のフィルタ設定には関数gtk file filter add mime typeを使用しています.
さらにこのサンプルプログラムでは何もしていませんが, 41行目でフィルタが選択されたときに発生するシ グナル”notify::filter”に対するコールバック関数を設定しています.
ソース 6–5–4 新しいファイル選択ダイアログウィジェットのサンプルプログラム: gtkfilechooser-sample.c
1 # i n c l u d e <g t k / g t k . h >
2
3 s t a t i c v o i d f i l t e r _ c h a n g e d (G t k F i l e C h o o s e r D i a l o g * d i a l o g , g p o i n t e r d a t a ) {
4 g _ p r i n t ( " F i l e à f i l t e r à c h a n g e d . \ n " ) ;
5 }
6
7 s t a t i c v o i d c b _ b u t t o n (G t k B u t t o n * b u t t o n , g p o i n t e r d a t a ) {
8 G t k W i d g e t * d i a l o g ;
9 G t k W i d g e t * p a r e n t ;
10 G t k E n t r y * e n t r y ;
11 G t k F i l e F i l t e r * f i l t e r ;
12 G t k F i l e C h o o s e r A c t i o n a c t i o n [ ] = { G T K _ F I L E _ C H O O S E R _ A C T I O N _ O P E N ,
13 G T K _ F I L E _ C H O O S E R _ A C T I O N _ S A V E ,
14 G T K _ F I L E _ C H O O S E R _ A C T I O N _ S E L E C T _ F O L D E R ,
15 G T K _ F I L E _ C H O O S E R _ A C T I O N _ C R E A T E _ F O L D E R } ;
16 g i n t r e s p o n s e ;
17
18 p a r e n t = G T K _ W I D G E T ( g _ o b j e c t _ g e t _ d a t a ( G _ O B J E C T ( d a t a ) , " p a r e n t " ) ) ;
19 e n t r y = G T K _ E N T R Y ( d a t a ) ;
20
21 d i a l o g = g t k _ f i l e _ c h o o s e r _ d i a l o g _ n e w ( " F i l e à C h o o s e r à D i a l o g " ,
22 G T K _ W I N D O W ( p a r e n t ) ,
23 a c t i o n [ 0 ] ,
24 G T K _ S T O C K _ C A N C E L ,
25 G T K _ R E S P O N S E _ C A N C E L ,
26 G T K _ S T O C K _ O P E N ,
27 G T K _ R E S P O N S E _ A C C E P T ,
28 N U L L ) ;
29 f i l t e r = g t k _ f i l e _ f i l t e r _ n e w ( ) ;
30 g t k _ f i l e _ f i l t e r _ s e t _ n a m e ( f i l t e r , " A l l à F i l e s " ) ;
31 g t k _ f i l e _ f i l t e r _ a d d _ p a t t e r n ( f i l t e r , " * " ) ;
32 g t k _ f i l e _ c h o o s e r _ a d d _ f i l t e r ( G T K _ F I L E _ C H O O S E R ( d i a l o g ) , f i l t e r ) ;
33
34 f i l t e r = g t k _ f i l e _ f i l t e r _ n e w ( ) ;
35 g t k _ f i l e _ f i l t e r _ s e t _ n a m e ( f i l t e r , " J P E G " ) ;
36 g t k _ f i l e _ f i l t e r _ a d d _ m i m e _ t y p e ( f i l t e r , " i m a g e / j p e g " ) ;
37 g t k _ f i l e _ c h o o s e r _ a d d _ f i l t e r ( G T K _ F I L E _ C H O O S E R ( d i a l o g ) , f i l t e r ) ;
38
39 f i l t e r = g t k _ f i l e _ f i l t e r _ n e w ( ) ;
40 g t k _ f i l e _ f i l t e r _ s e t _ n a m e ( f i l t e r , " P N G " ) ;
41 g t k _ f i l e _ f i l t e r _ a d d _ m i m e _ t y p e ( f i l t e r , " i m a g e / p n g " ) ;
42 g t k _ f i l e _ c h o o s e r _ a d d _ f i l t e r ( G T K _ F I L E _ C H O O S E R ( d i a l o g ) , f i l t e r ) ;
43
44 g _ s i g n a l _ c o n n e c t ( d i a l o g , " n o t i f y : : f i l t e r " ,
45 G _ C A L L B A C K ( f i l t e r _ c h a n g e d ) , N U L L ) ;
46
47 g t k _ w i d g e t _ s h o w _ a l l ( d i a l o g ) ;
48
49 r e s p o n s e = g t k _ d i a l o g _ r u n ( G T K _ D I A L O G ( d i a l o g ) ) ;
50 i f ( r e s p o n s e = = G T K _ R E S P O N S E _ A C C E P T ) {
51 g c h a r * f i l e n a m e ;
52 g c h a r * f o l d e r ;
53
54 f i l e n a m e = g t k _ f i l e _ c h o o s e r _ g e t _ f i l e n a m e ( G T K _ F I L E _ C H O O S E R ( d i a l o g ) ) ;
55 f o l d e r = g t k _ f i l e _ c h o o s e r _ g e t _ c u r r e n t _ f o l d e r ( G T K _ F I L E _ C H O O S E R ( d i a l o g ) ) ;
56 g _ p r i n t ( " % s \ n " , f o l d e r ) ;
57 g _ f r e e ( f o l d e r ) ;
58
59 g t k _ e n t r y _ s e t _ t e x t ( e n t r y , f i l e n a m e ) ;
60 g _ f r e e ( f i l e n a m e ) ;
61 } e l s e i f ( r e s p o n s e = = G T K _ R E S P O N S E _ C A N C E L ) {
62 g _ p r i n t ( " C a n c e l à b u t t o n à w a s à p r e s s e d . \ n " ) ;
63 } e l s e {
64 g _ p r i n t ( " A n o t h e r à r e s p o n s e à w a s à r e c i e v e d . \ n " ) ;
65 }
66 g t k _ w i d g e t _ d e s t r o y ( d i a l o g ) ;
67 }
68
69 i n t m a i n (i n t ar g c , c h a r * * a r g v ) {
70 G t k W i d g e t * w i n d o w ;
71 G t k W i d g e t * h b o x ;
72 G t k W i d g e t * l a b e l ;
73 G t k W i d g e t * e n t r y ;
74 G t k W i d g e t * b u t t o n ;
75
76 g t k _ i n i t ( & a r g c , & a r g v ) ;
77 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 ) ;
78 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 F i l e C h o o s e r à S a m p l e " ) ;
79 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 ) ;
80 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 " ,
81 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ;
82
83 h b o x = g t k _ h b o x _ n e w ( F A L S E , 5 ) ;
84 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 ) ;
85
86 l a b e l = g t k _ l a b e l _ n e w ( " F i l e à : " ) ;
87 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 ) ;
88
89 e n t r y = g t k _ e n t r y _ n e w ( ) ;
90 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 ) , e n t r y , T R U E , T R U E , 0 ) ;
91 g _ o b j e c t _ s e t _ d a t a ( G _ O B J E C T ( e n t r y ) , " p a r e n t " , (g p o i n t e r) w i n d o w ) ;
92
93 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 _ O P E N ) ;
94 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 " ,
95 G _ C A L L B A C K ( c b _ b u t t o n ) , (g p o i n t e r) e n t r y ) ;
96 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 ) ;
97
98 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ;
99 g t k _ m a i n ( ) ;
100
101 r e t u r n 0 ;
102 }