• 検索結果がありません。

UI マネージャ

ドキュメント内 ÆþÌçGTK+ (ページ 172-177)

第 7 章 ウィジェットリファレンス 113

7.4 メニューウィジェット

7.4.3 UI マネージャ

118 m e n u = g t k _ m e n u _ n e w ( ) ;

119 g t k _ m e n u _ i t e m _ s e t _ s u b m e n u ( G T K _ M E N U _ I T E M ( i t e m ) , m e n u ) ;

120 {

121 i t e m = g t k _ t e a r o f f _ m e n u _ i t e m _ n e w ( ) ;

122 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 ( m e n u ) , i t e m ) ;

123

124 i t e m = g t k _ c h e c k _ m e n u _ i t e m _ n e w _ w i t h _ l a b e l ( " S h o w H i d d e n F o l d e r s " ) ;

125 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 ( m e n u ) , i t e m ) ;

126 g t k _ w i d g e t _ a d d _ a c c e l e r a t o r ( i t e m , " a c t i v a t e " , a c c e l _ g r o u p ,

127 G D K _ H ,

128 G D K _ C O N T R O L _ M A S K , G T K _ A C C E L _ V I S I B L E ) ;

129

130 i t e m = g t k _ i m a g e _ m e n u _ i t e m _ n e w _ w i t h _ l a b e l ( " S o r t b y . . . " ) ;

131 i m a g e = g t k _ i m a g e _ n e w _ f r o m _ s t o c k ( G T K _ S T O C K _ S O R T _ A S C E N D I N G ,

132 G T K _ I C O N _ S I Z E _ M E N U ) ;

133 g t k _ i m a g e _ m e n u _ i t e m _ s e t _ i m a g e ( G T K _ I M A G E _ M E N U _ I T E M ( i t e m ) , i m a g e ) ;

134 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 ( m e n u ) , i t e m ) ;

135 m e n u = g t k _ m e n u _ n e w ( ) ;

136 g t k _ m e n u _ i t e m _ s e t _ s u b m e n u ( G T K _ M E N U _ I T E M ( i t e m ) , m e n u ) ;

137 {

138 i t e m = g t k _ r a d i o _ m e n u _ i t e m _ n e w _ w i t h _ l a b e l ( g r o u p , " F i l e t y p e " ) ;

139 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 ( m e n u ) , i t e m ) ;

140 g t k _ c h e c k _ m e n u _ i t e m _ s e t _ a c t i v e ( G T K _ C H E C K _ M E N U _ I T E M ( i t e m ) , T R U E ) ;

141

142 g r o u p = g t k _ r a d i o _ m e n u _ i t e m _ g e t _ g r o u p ( G T K _ R A D I O _ M E N U _ I T E M ( i t e m ) ) ;

143 i t e m = g t k _ r a d i o _ m e n u _ i t e m _ n e w _ w i t h _ l a b e l ( g r o u p , " F i l e s i z e " ) ;

144 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 ( m e n u ) , i t e m ) ;

145

146 g r o u p = g t k _ r a d i o _ m e n u _ i t e m _ g e t _ g r o u p ( G T K _ R A D I O _ M E N U _ I T E M ( i t e m ) ) ;

147 i t e m = g t k _ r a d i o _ m e n u _ i t e m _ n e w _ w i t h _ l a b e l ( g r o u p , " U p d a t e t i m e " ) ;

148 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 ( m e n u ) , i t e m ) ;

149 }

150 }

151 r e t u r n p o p u p m e n u ;

152 }

153 154 i n t

155 m a i n (i n t ar g c , c h a r * * a r g v )

156 {

157 G t k W i d g e t * w i n d o w ;

158 G t k W i d g e t * e v e n t b o x ;

159 G t k W i d g e t * p o p u p m e n u ;

160

161 g t k _ i n i t ( & a r g c , & a r g v ) ;

162

163 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 ) ;

164 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 P o p u p M e n u S a m p l e " ) ;

165 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 ) ;

166 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 ) ;

167 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 " ,

168 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ;

169

170 p o p u p m e n u = c r e a t e _ p o p u p m e n u ( G T K _ W I N D O W ( w i n d o w ) ) ;

171 g t k _ w i d g e t _ s h o w _ a l l ( p o p u p m e n u ) ;

172

173 e v e n t b o x = g t k _ e v e n t _ b o x _ n e w ( ) ;

174 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 ) , e v e n t b o x ) ;

175 g _ s i g n a l _ c o n n e c t ( G _ O B J E C T ( e v e n t b o x ) , " b u t t o n _ p r e s s _ e v e n t " ,

176 G _ C A L L B A C K ( c b _ p o p u p _ m e n u ) , p o p u p m e n u ) ;

177

178 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ;

179 g t k _ m a i n ( ) ;

180

181 r e t u r n 0 ;

182 }

オブジェクトの階層構造 G O b j e c t

+ - - - -G t k U I M a n a g e r

UIマネージャの作成

ウィジェットの作成には関数gtk ui manager newを使用します.

G t k U I M a n a g e r* g t k _ u i _ m a n a g e r _ n e w (v o i d) ;

メニューアイテムの定義

メニューアイテムの定義はGtkActionEntryという構造体を用いて行います.GtkActionEntry構造体は次のように定義さ れています.

t y p e d e f s t r u c t {

c o n s t g c h a r * n a m e ; c o n s t g c h a r * s t o c k _ i d ; c o n s t g c h a r * l a b e l ; c o n s t g c h a r * a c c e l e r a t o r ; c o n s t g c h a r * t o o l t i p ; G C a l l b a c k c a l l b a c k ; } G t k A c t i o n E n t r y;

構造体のメンバの説明を以下にまとめます.

name

メニューアイテムを特定するための文字列です.

stock id

メニューアイテムの先頭に表示するアイコン用のGtkStockItemで定義された文字列です.

label

メニューアイテムに表示するラベルです.文字の前にアンダースコアを挿入することで,その文字の下にアンダースコア が表示されアクセラレータキーとして動作します.

accelerator

メ ニ ュ ー ア イ テ ム の シ ョ ー ト カ ッ ト を 設 定 す る た め の 文 字 列 で す .”<control>O” や ”<control><shift>S”,

”<alt><shift>X”のように指定します.

tooltips

メニューアイテムの説明のための文字列です.

callback

メニューアイテムがクリックされたときに呼び出すコールバック関数です.

図7.19 UIマネージャ

今説明したメニューアイテムは普通のメニューアイテムでチェックボタンやラジオボタンの機能を持つメニューアイテムの 定義は,それぞれGtkToggleActionEntryとGtkRadioActionEntryという構造体を用いて行います.GtkToggleActionEntry 構造体は次のように定義されています.

t y p e d e f s t r u c t {

c o n s t g c h a r * n a m e ; c o n s t g c h a r * s t o c k _ i d ; c o n s t g c h a r * l a b e l ; c o n s t g c h a r * a c c e l e r a t o r ; c o n s t g c h a r * t o o l t i p ; G C a l l b a c k c a l l b a c k ; g b o o l e a n i s _ a c t i v e ; } G t k T o g g l e A c t i o n E n t r y;

GtkToggleActionEntry構造体は,GtkActionEntry構造体のメンバにis activeというアイテムがアクティブ状態かどうか

を表すgboolean型のメンバが追加されたものです.

GtkRadioActionEntry構造体は次のように定義されています.

t y p e d e f s t r u c t {

c o n s t g c h a r * n a m e ; c o n s t g c h a r * s t o c k _ i d ; c o n s t g c h a r * l a b e l ; c o n s t g c h a r * a c c e l e r a t o r ; c o n s t g c h a r * t o o l t i p ;

g i n t v a l u e ;

} G t k R a d i o A c t i o n E n t r y;

GtkRadioActionEntry 構 造 体 は ,callback メ ン バ が な く ,同 じ ラ ジ オ メ ニ ュ ー ア イ テ ム の 中 の ID を 表 す value と い う gint 型 の メ ン バ が 追 加 さ れ て い ま す .ラ ジ オ メ ニ ュ ー ア イ テ ム の コ ー ル バ ッ ク 関 数 は こ の 後 説 明 す る 関 数 gtk action group add radio actionsで設定します.

アクショングループの作成とメニューアイテムの登録

UIマネージャを利用したメニュー作成に密接に関連するウィジェットが,アクショングループ(GtkActionGroup)です.こ のウィジェットは,メニューアイテムをまとめて扱うためのウィジェットです.

アクショングループの作成は関数gtk action group newを使用します.引数の文字列には,作成するアクショングループを 特定するための名前を指定します.

G t k A c t i o n G r o u p* g t k _ a c t i o n _ g r o u p _ n e w (c o n s t g c h a r * n a m e ) ;

そして次の3つの関数で,作成したアクショングループに対してメニューアイテムを登録します.

gtk action group add actions

GtkActionEntry構造体で用意したメニューアイテムをアクショングループに登録するための関数です.第3引数にはメ

ニューアイテムの数,第4引数にはコールバック関数に渡すデータを指定します.

v o i d

g t k _ a c t i o n _ g r o u p _ a d d _ a c t i o n s (G t k A c t i o n G r o u p * a c t i o n _ g r o u p , c o n s t G t k A c t i o n E n t r y * e n t r i e s ,

g u i n t n _ e n t r i e s ,

g p o i n t e r u s e r _ d a t a ) ;

gtk action group add toggle actions

GtkActionToggleEntry構造体で用意したメニューアイテムをアクショングループに登録するための関数です.

v o i d g t k _ a c t i o n _ g r o u p _ a d d _ t o g g l e _ a c t i o n s (G t k A c t i o n G r o u p * a c t i o n _ g r o u p ,

c o n s t G t k T o g g l e A c t i o n E n t r y * e n t r i e s ,

g u i n t n _ e n t r i e s ,

g p o i n t e r u s e r _ d a t a ) ;

gtk action group add radio actions

GtkActionRadioEntry構造体で用意したメニューアイテムをアクショングループに登録するための関数です.第4引数

には初期状態でアクティブにするアイテム番号(GtkActionRadioEntry構造体のvalueの値)を指定します.また第5 引数でコールバック関数を指定します.

v o i d g t k _ a c t i o n _ g r o u p _ a d d _ r a d i o _ a c t i o n s (G t k A c t i o n G r o u p * a c t i o n _ g r o u p ,

c o n s t G t k R a d i o A c t i o n E n t r y * e n t r i e s ,

g u i n t n _ e n t r i e s ,

g i n t v a l u e ,

G C a l l b a c k o n _ c h a n g e ,

g p o i n t e r u s e r _ d a t a ) ;

メニューの階層構造の定義

今まではメニューアイテム1つずつの定義について説明してきました.ではメニューの構成はどうやって決定したらいいので しょう.前節までに説明した方法では,サブメニューを追加してどのメニューアイテムを配置するのかなどを,すべてGTK+

の関数を呼び出して設定する必要がありました.

GtkUIManagerを使用してメニューを構成する場合には,メニューの階層構造をテキストで記述するだけで済んでしまいま

す.簡単なメニューの階層構造の例を次に示します.

s t a t i c c o n s t g c h a r * u i _ i n f o =

" <ui > "

" <m e n u b a r n a m e = ’M e n u B a r ’ >"

" <m e n u a c t i o n = ’F i l e M e n u ’ >"

" <m e n u i t e m a c t i o n = ’N e w ’/ >"

" <m e n u i t e m a c t i o n = ’O p e n ’/ >"

" <m e n u i t e m a c t i o n = ’S a v e ’/ >"

" <m e n u i t e m a c t i o n = ’S a v e A s ’/ >"

" <s e p a r a t o r / >"

" <m e n u i t e m a c t i o n = ’Q u i t ’/ >"

" </m e n u > "

" </m e n u b a r > "

" </ui > " ;

文字列は“<ui>”で始まり,“</ui>”で終わる必要があります.基本的な記述は「識別子」と「属性」という形式で行いま

す.メニューアイテムの記述は“<menuitem action=’New’/>”のように記述して,actionの属性にはGtkActionEntry構造 体のnameメンバの値を記述します.

サンプルプログラム

ソース7–4–4にGtkUIManagerを用いたサンプルプログラムのソースコードを示します.

ソース7-4-4 UIマネージャのサンプルプログラム: gtkuimanager-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 c b _ t e s t 1 (v o i d)

5 {

6 g _ p r i n t ( " . . . \ n " ) ;

7 }

8

9 s t a t i c v o i d

10 c b _ t e s t 2 (G t k W i d g e t * w i d g e t , g p o i n t e r u s e r _ d a t a )

11 {

12 g _ p r i n t ( " % s \ n " , (g c h a r * ) u s e r _ d a t a ) ;

13 }

14

15 s t a t i c G t k A c t i o n E n t r y e n t r i e s [ ] =

16 {

17 { " F i l e M e n u " , N U L L , " _ F i l e " } ,

18 { " E d i t M e n u " , N U L L , " _ E d i t " } ,

19 { " V i e w M e n u " , N U L L , " _ V i e w " } ,

20 { " S o r t M e n u " , G T K _ S T O C K _ S O R T _ A S C E N D I N G , " S o r t b y . . . " } ,

21 { " N e w " , N U L L , " _ N e w " , " <c o n t r o l > N " , N U L L , c b _ t e s t 1 } ,

22 { " O p e n " , N U L L , " _ O p e n " , " <c o n t r o l > O " , N U L L , G _ C A L L B A C K ( c b _ t e s t 2 ) } ,

23 { " S a v e " , N U L L , " _ S a v e " , " <c o n t r o l > S " , N U L L , N U L L } ,

24 { " S a v e A s " , N U L L , " S a v e _ a s " , " <s h i f t > <c o n t r o l > S " , N U L L , N U L L } ,

25 { " Q u i t " , N U L L , " _ Q u i t " , " <c o n t r o l > Q " , N U L L , g t k _ m a i n _ q u i t } ,

26 { " C u t " , G T K _ S T O C K _ C U T , " C _ u t " , " <c o n t r o l > X " , N U L L , N U L L } ,

27 { " C o p y " , G T K _ S T O C K _ C O P Y , " _ C o p y " , " <c o n t r o l > C " , N U L L , N U L L } ,

28 { " P a s t e " , G T K _ S T O C K _ P A S T E , " _ P a s t e " , " <c o n t r o l > V " , N U L L , N U L L } ,

29 { " D e l e t e " , G T K _ S T O C K _ D E L E T E , " _ D e l e t e " , " <c o n t r o l > D " , N U L L , N U L L }

30 } ;

31

32 s t a t i c G t k T o g g l e A c t i o n E n t r y t o g g l e _ e n t r i e s [ ] =

33 {

34 { " S h o w H i d d e n " , N U L L , " S h o w H i d d e n F o l d e r s " , " <c o n t r o l > H " ,

35 NU L L , N U L L , F A L S E }

36 } ;

37 38 e n u m

39 {

40 S O R T _ F I L E _ T Y P E ,

41 S O R T _ F I L E _ S I Z E ,

42 S O R T _ U P D A T E _ T I M E

43 } ;

44

45 s t a t i c G t k R a d i o A c t i o n E n t r y r a d i o _ e n t r i e s [ ] =

46 {

47 { " F i l e T y p e " , N U L L , " F i l e t y p e " , N U L L , N U L L , S O R T _ F I L E _ T Y P E } ,

48 { " F i l e S i z e " , N U L L , " F i l e s i z e " , N U L L , N U L L , S O R T _ F I L E _ S I Z E } ,

49 { " U p d a t e T i m e " , N U L L , " U p d a t e t i m e " , N U L L , N U L L , S O R T _ U P D A T E _ T I M E }

50 } ;

51

52 s t a t i c g u i n t n _ e n t r i e s = G _ N _ E L E M E N T S ( e n t r i e s ) ;

53 s t a t i c g u i n t n _ t o g g l e _ e n t r i e s = G _ N _ E L E M E N T S ( t o g g l e _ e n t r i e s ) ;

54 s t a t i c g u i n t n _ r a d i o _ e n t r i e s = G _ N _ E L E M E N T S ( r a d i o _ e n t r i e s ) ;

55

56 s t a t i c c o n s t g c h a r * u i _ i n f o =

57 " <ui > "

58 " <m e n u b a r n a m e = ’M e n u B a r ’ >"

59 " <m e n u a c t i o n = ’F i l e M e n u ’ >"

60 " <m e n u i t e m a c t i o n = ’N e w ’/ >"

61 " <m e n u i t e m a c t i o n = ’O p e n ’/ >"

62 " <m e n u i t e m a c t i o n = ’S a v e ’/ >"

63 " <m e n u i t e m a c t i o n = ’S a v e A s ’/ >"

64 " <s e p a r a t o r / >"

65 " <m e n u i t e m a c t i o n = ’Q u i t ’/ >"

66 " </m e n u > "

67 " <m e n u a c t i o n = ’E d i t M e n u ’ >"

68 " <m e n u i t e m a c t i o n = ’C u t ’/ >"

69 " <m e n u i t e m a c t i o n = ’C o p y ’/ >"

70 " <m e n u i t e m a c t i o n = ’P a s t e ’/ >"

71 " <m e n u i t e m a c t i o n = ’D e l e t e ’/ >"

72 " </m e n u > "

73 " <m e n u a c t i o n = ’V i e w M e n u ’ >"

74 " <m e n u i t e m a c t i o n = ’S h o w H i d d e n ’/ >"

75 " <m e n u a c t i o n = ’S o r t M e n u ’ >"

76 " <m e n u i t e m a c t i o n = ’F i l e T y p e ’/ >"

77 " <m e n u i t e m a c t i o n = ’F i l e S i z e ’/ >"

78 " <m e n u i t e m a c t i o n = ’U p d a t e T i m e ’/ >"

79 " </m e n u > "

80 " </m e n u > "

81 " </m e n u b a r > "

82 " </ui > " ;

83

84 s t a t i c v o i d

85 a c t i v a t e _ r a d i o _ a c t i o n (G t k A c t i o n * a c t i o n ,

86 G t k R a d i o A c t i o n * c u r r e n t )

87 {

88 g _ p r i n t ( " R a d i o a c t i o n \ " % s \ " s e l e c t e d \ n " ,

89 g t k _ a c t i o n _ g e t _ n a m e ( G T K _ A C T I O N ( c u r r e n t ) ) ) ;

90 }

91

92 s t a t i c G t k W i d g e t*

93 c r e a t e _ m e n u (G t k W i d g e t * p a r e n t )

94 {

95 G t k U I M a n a g e r * u i ;

96 G t k A c t i o n G r o u p * a c t i o n s ;

97 s t a t i c g c h a r * t e x t = " H e l l o " ;

98

99 a c t i o n s = g t k _ a c t i o n _ g r o u p _ n e w ( " A c t i o n s " ) ;

100 g t k _ a c t i o n _ g r o u p _ a d d _ a c t i o n s ( a c t i o n s , e n t r i e s , n _ e n t r i e s ,

101 (g p o i n t e r) t e x t ) ;

102 g t k _ a c t i o n _ g r o u p _ a d d _ t o g g l e _ a c t i o n s ( a c t i o n s ,

103 t o g g l e _ e n t r i e s , n _ t o g g l e _ e n t r i e s ,

104 N U L L ) ;

105 g t k _ a c t i o n _ g r o u p _ a d d _ r a d i o _ a c t i o n s ( a c t i o n s ,

106 r a d i o _ e n t r i e s , n _ r a d i o _ e n t r i e s ,

107 S O R T _ F I L E _ T Y P E ,

108 G _ C A L L B A C K ( a c t i v a t e _ r a d i o _ a c t i o n ) ,

109 N U L L ) ;

110

111 u i = g t k _ u i _ m a n a g e r _ n e w ( ) ;

112 g t k _ u i _ m a n a g e r _ i n s e r t _ a c t i o n _ g r o u p ( ui , a c t i o n s , 0 ) ;

113 g t k _ u i _ m a n a g e r _ s e t _ a d d _ t e a r o f f s ( ui , T R U E ) ;

114 g t k _ w i n d o w _ a d d _ a c c e l _ g r o u p ( G T K _ W I N D O W ( p a r e n t ) ,

115 g t k _ u i _ m a n a g e r _ g e t _ a c c e l _ g r o u p ( u i ) ) ;

116 g t k _ u i _ m a n a g e r _ a d d _ u i _ f r o m _ s t r i n g ( ui , u i _ i n f o , -1 , N U L L ) ;

117

118 r e t u r n g t k _ u i _ m a n a g e r _ g e t _ w i d g e t ( ui , " / M e n u B a r " ) ;

119 }

120 121 i n t

122 m a i n (i n t a r g c , c h a r * * a r g v )

123 {

124 G t k W i d g e t * w i n d o w ;

125 G t k W i d g e t * m e n u b a r ;

126

127 g t k _ i n i t ( & a r g c , & a r g v ) ;

128 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 ) ;

129 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 U I M a n a g e r S a m p l e " ) ;

130 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);

131 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 ) ;

132 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 " ,

133 G _ C A L L B A C K ( g t k _ m a i n _ q u i t ) , N U L L ) ;

134

135 m e n u b a r = c r e a t e _ m e n u ( w i n d o w ) ;

136 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 ) , m e n u b a r ) ;

137

138 g t k _ w i d g e t _ s h o w _ a l l ( w i n d o w ) ;

139 g t k _ m a i n ( ) ;

140

141 r e t u r n 0 ;

142 }

ドキュメント内 ÆþÌçGTK+ (ページ 172-177)