第 7 章 ウィジェットリファレンス 113
7.5 ダイアログ
7.5.3 ファイル選択ダイアログ
88
89 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ;
90 g t k _ m a i n ( ) ;
91
92 r e t u r n 0 ;
93 }
表7.13 GtkFileChooserActionの値
値 説明
GTK FILE CHOOSER ACTION OPEN ファイルを開くダイアログを選択する.
GTK FILE CHOOSER ACTION SAVE ファイルを保存するダイアログを選択する.
GTK FILE CHOOSER ACTION SELECT FOLDER ディレクトリを選択するダイアログを選択する.
GTK FILE CHOOSER ACTION CREATE FOLDER ディレクトリを作成するダイアログを選択する.
そして引数の最後には,終端の印としてNULLを与えます.
以下の例は,「開く」ボタンと「キャンセル」ボタンを持つ,ファイルを開くためのダイアログを作成するものです.この例の ように,ボタンのラベルとして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 ,
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:///”で始まる URIとなります.
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. フィルタリング規則の設定
作成したフィルタがどのようなファイルを表示するのか,フィルタリング設定を行います.フィルタリング設定の関 数には以下に示すような関数が用意されています.詳細は省略しますが,具体的な使用方法はソース7–5–3を参考 にしてください.
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 d 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 d 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 ) ;
サンプルプログラム
ソース7–5–3にファイル選択ダイアログのサンプルプログラムを示します.プログラムを実行した画面で,「開く」ボタンを
押すと図7.24のようなファイルを選択するダイアログが表示されます.
9行目から79行目までのダイアログの動作部分の詳細について説明します.まず28–35行目の関数で,ファイルを開くため のファイル選択ダイアログを作成します.
36–49行目でフィルタを設定しています.ここでは,すべてのファイルを表示するフィルタと,JPEG画像とPNG画像を表
示するフィルタをそれぞれ設定しています.すべてのファイルを表示するフィルタの設定には,関数gtk file filter add pattern を 使 用 し て ,パ タ ー ン に “*” を 指 定 し て い ま す .ま た JPEG 画 像 フ ォ ー マ ッ ト の た め の フ ィ ル タ 設 定 に は ,関 数 gtk file filter add mime typeを使用しています.
さらにこのサンプルプログラムでは何もしていませんが,51–52行目でフィルタが選択されたときに発生するシグナル
notify::filterに対するコールバック関数を設定しています.
ソース7-5-3 ファイル選択ダイアログのサンプルプログラム: 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
4 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 )
5 {
6 g _ p r i n t ( " F i l e f i l t e r c h a n g e d . \ n " ) ;
7 }
8
9 s t a t i c v o i d
10 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 )
11 {
12 G t k W i d g e t * d i a l o g ;
13 G t k W i d g e t * p a r e n t ;
14 G t k E n t r y * e n t r y ;
15 G t k F i l e F i l t e r * f i l t e r ;
16 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 ,
17 G T K _ F I L E _ C H O O S E R _ A C T I O N _ S A V E ,
18 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 ,
19 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
20 } ;
21 g i n t r e s p o n s e ;
22 g c h a r * f i l e n a m e ;
23 g c h a r * f o l d e r ;
24
25 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 " ) ) ;
26 e n t r y = G T K _ E N T R Y ( d a t a ) ;
27
28 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 " ,
29 G T K _ W I N D O W ( p a r e n t ) ,
30 a c t i o n [ 0 ] ,
31 G T K _ S T O C K _ C A N C E L ,
32 G T K _ R E S P O N S E _ C A N C E L ,
33 G T K _ S T O C K _ O P E N ,
34 G T K _ R E S P O N S E _ A C C E P T ,
35 N U L L ) ;
36 f i l t e r = g t k _ f i l e _ f i l t e r _ n e w ( ) ;
37 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 " ) ;
38 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 , " * " ) ;
39 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 ) ;
40
41 f i l t e r = g t k _ f i l e _ f i l t e r _ n e w ( ) ;
42 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 " ) ;
43 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 " ) ;
44 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 ) ;
45
46 f i l t e r = g t k _ f i l e _ f i l t e r _ n e w ( ) ;
47 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 " ) ;
48 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 " ) ;
49 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 ) ;
50
51 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 " ,
52 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 ) ;
53
54 g t k _ w i d g e t _ s h o w _ a l l ( d i a l o g ) ;
55
56 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 ) ) ;
57 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 )
58 {
59 f i l e n a m e
60 = 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 ) ) ;
61 f o l d e r
62 = 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
63 ( d i a l o g ) ) ;
64 g _ p r i n t ( " % s \ n " , f o l d e r ) ;
65 g _ f r e e ( f o l d e r ) ;
66
67 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 ) ;
68 g _ f r e e ( f i l e n a m e ) ;
69 }
70 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 )
71 {
72 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 " ) ;
73 }
74 e l s e
75 {
76 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 " ) ;
77 }
78 g t k _ w i d g e t _ d e s t r o y ( d i a l o g ) ;
79 }
80 81 i n t
82 m a i n (i n t ar g c , c h a r * * a r g v )
83 {
84 G t k W i d g e t * w i n d o w ;
85 G t k W i d g e t * h b o x ;
86 G t k W i d g e t * l a b e l ;
87 G t k W i d g e t * e n t r y ;
88 G t k W i d g e t * b u t t o n ;
89
90 g t k _ i n i t ( & a r g c , & a r g v ) ;
91
92 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 ) ;
93 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 " ) ;
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
98 h b o x = g t k _ h b o x _ n e w ( F A L S E , 5 ) ;
99 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 ) ;
100
101 l a b e l = g t k _ l a b e l _ n e w ( " F i l e : " ) ;
102 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 ) ;
103
104 e n t r y = g t k _ e n t r y _ n e w ( ) ;
105 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 ) ;
106 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 ) ;
107
108 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 ) ;
109 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 " ,
110 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 ) ;
111 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 ) ;
112
113 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ;
114 g t k _ m a i n ( ) ;
115
116 r e t u r n 0 ;
117 }