1 /***************************************************************************
2 FAC_toggle.cpp
3 Handle dialog factory element : Toggle
4 (C) 2006 Mean Fixounet@free.fr
5 ***************************************************************************/
6
7 /***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16 #include "ADM_toolkitGtk.h"
17 #include "DIA_factory.h"
18
19 namespace ADM_GtkFactory
20 {
21 class diaElemToggle : public diaElemToggleBase
22 {
23 protected:
24 public:
25 diaElemToggle(bool *toggleValue,const char *toggleTitle, const char *tip=NULL);
26 virtual ~diaElemToggle() ;
27 void setMe(void *dialog, void *opaque,uint32_t line);
28 void getMe(void);
29 void enable(uint32_t onoff) ;
30 void finalize(void);
31 void updateMe();
32 uint8_t link(uint32_t onoff,diaElem *w);
33 int getRequiredLayout(void);
34 };
35
36 class diaElemToggleUint : public diaElem
37 {
38 protected:
39 uint32_t *emb;
40 const char *embName;
41 void *widgetUint;
42 uint32_t _min,_max;
43 public:
44 diaElemToggleUint(uint32_t *toggleValue,const char *toggleTitle, uint32_t *uintval,
45 const char *name,uint32_t min,uint32_t max,const char *tip=NULL);
46 virtual ~diaElemToggleUint() ;
47 void setMe(void *dialog, void *opaque,uint32_t line);
48 void getMe(void);
49 void enable(uint32_t onoff) ;
50 void finalize(void);
51 void updateMe();
52 int getRequiredLayout(void);
53 };
54 class diaElemToggleInt : public diaElem
55 {
56 protected:
57 int32_t *emb;
58 const char *embName;
59 void *widgetUint;
60 int32_t _min,_max;
61 public:
62 diaElemToggleInt(uint32_t *toggleValue,const char *toggleTitle, int32_t *uintval,
63 const char *name,int32_t min,int32_t max,const char *tip=NULL);
64 virtual ~diaElemToggleInt() ;
65 void setMe(void *dialog, void *opaque,uint32_t line);
66 void getMe(void);
67 void finalize(void);
68 void updateMe();
69 void enable(uint32_t onoff) ;
70 int getRequiredLayout(void);
71 };
72
73 static void cb_menu(void *w,void *p);
74 static void cb_menu2(void *w,void *p);
75
76
77
diaElemToggle(bool * toggleValue,const char * toggleTitle,const char * tip)78 diaElemToggle::diaElemToggle(bool *toggleValue,const char *toggleTitle, const char *tip)
79 : diaElemToggleBase()
80 {
81 param=(void *)toggleValue;
82 paramTitle=toggleTitle;
83 this->tip=tip;
84 nbLink=0;
85
86 }
87
~diaElemToggle()88 diaElemToggle::~diaElemToggle()
89 {
90
91 }
link(uint32_t onoff,diaElem * w)92 uint8_t diaElemToggle::link(uint32_t onoff,diaElem *w)
93 {
94 ADM_assert(nbLink<MENU_MAX_lINK);
95 links[nbLink].onoff=onoff;
96 links[nbLink].widget=w;
97 nbLink++;
98 return 1;
99 }
setMe(void * dialog,void * opaque,uint32_t line)100 void diaElemToggle::setMe(void *dialog, void *opaque,uint32_t line)
101 {
102 GtkWidget *widget;
103
104 widget = gtk_check_button_new_with_mnemonic (paramTitle);
105 gtk_widget_show (widget);
106 myWidget=(void *)widget;
107
108 gtk_table_attach (GTK_TABLE (opaque), widget, 0, 2, line, line+1,
109 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
110 (GtkAttachOptions) (0), 0, 0);
111 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), *(uint32_t *)param);
112 if(tip)
113 {
114 gtk_widget_set_tooltip_text (widget, tip);
115 }
116 g_signal_connect(widget, "toggled", G_CALLBACK(cb_menu), (void *) this);
117 }
getMe(void)118 void diaElemToggle::getMe(void)
119 {
120 GtkWidget *widget=(GtkWidget *)myWidget;
121 bool *val=(bool *)param;
122 ADM_assert(widget);
123 *(bool *)param=gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
124 }
finalize(void)125 void diaElemToggle::finalize(void)
126 {
127 updateMe();
128 }
updateMe(void)129 void diaElemToggle::updateMe(void)
130 {
131 GtkWidget *widget=(GtkWidget *)myWidget;
132 uint32_t val;
133 uint32_t rank;
134 if(!nbLink) return;
135 ADM_assert(widget);
136
137
138 rank=gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
139 /* Now search through the linked list to see if something happens ...*/
140
141 /* 1 disable everything */
142 for(int i=0;i<nbLink;i++)
143 {
144 dialElemLink *l=&(links[i]);
145 l->widget->enable(0);
146 }
147 /* Then enable */
148 for(int i=0;i<nbLink;i++)
149 {
150 dialElemLink *l=&(links[i]);
151 if(l->onoff==rank) l->widget->enable(1);
152 }
153 }
enable(uint32_t onoff)154 void diaElemToggle::enable(uint32_t onoff)
155 {
156 gtk_widget_set_sensitive(GTK_WIDGET(myWidget),onoff);
157 }
158
getRequiredLayout(void)159 int diaElemToggle::getRequiredLayout(void) { return 0; }
160
161 //** C callback **
cb_menu(void * w,void * p)162 void cb_menu(void *w,void *p)
163 {
164 diaElemToggle *me=(diaElemToggle *)p;
165 me->updateMe();
166 }
167 //*************************************************************************
diaElemToggleUint(uint32_t * toggleValue,const char * toggleTitle,uint32_t * uintval,const char * name,uint32_t min,uint32_t max,const char * tip)168 diaElemToggleUint::diaElemToggleUint(uint32_t *toggleValue,const char *toggleTitle, uint32_t *uintval, const char *name,uint32_t min,uint32_t max,const char *tip)
169 : diaElem(ELEM_TOGGLE_UINT)
170 {
171 param=(void *)toggleValue;
172 paramTitle=toggleTitle;
173 this->tip=tip;
174 embName=name;
175 emb=uintval;
176 widgetUint=NULL;
177 _min=min;
178 _max=max;
179 }
180
~diaElemToggleUint()181 diaElemToggleUint::~diaElemToggleUint()
182 {
183
184 }
setMe(void * dialog,void * opaque,uint32_t line)185 void diaElemToggleUint::setMe(void *dialog, void *opaque,uint32_t line)
186 {
187 GtkWidget *widget,*widuint;
188
189 widget = gtk_check_button_new_with_mnemonic (paramTitle);
190 gtk_widget_show (widget);
191 myWidget=(void *)widget;
192
193 gtk_table_attach (GTK_TABLE (opaque), widget, 0, 1, line, line+1,
194 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
195 (GtkAttachOptions) (0), 0, 0);
196 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), *(uint32_t *)param);
197 if(tip)
198 {
199 gtk_widget_set_tooltip_text (widget, tip);
200 }
201 g_signal_connect(widget, "toggled", G_CALLBACK(cb_menu2), (void *) this);
202 /* Now put uint */
203 widuint = gtk_spin_button_new_with_range(_min,_max,1);
204 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON(widuint),TRUE);
205 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(widuint),0);
206 gtk_spin_button_set_value (GTK_SPIN_BUTTON(widuint),*emb);
207
208 gtk_widget_show (widuint);
209
210 gtk_table_attach (GTK_TABLE (opaque), widuint, 1, 2, line, line+1,
211 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
212 (GtkAttachOptions) (0), 0, 0);
213
214 widgetUint=widuint;
215
216 }
getMe(void)217 void diaElemToggleUint::getMe(void)
218 {
219 GtkWidget *widget=(GtkWidget *)myWidget;
220 uint32_t *val=(uint32_t *)param;
221 ADM_assert(widget);
222 *(uint32_t *)param=gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
223 *emb=gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON ((GtkWidget *)widgetUint));
224 if(*emb<_min) *emb=_min;
225 if(*emb>_max) *emb=_max;
226 }
finalize(void)227 void diaElemToggleUint::finalize(void)
228 {
229 updateMe();
230 }
updateMe(void)231 void diaElemToggleUint::updateMe(void)
232 {
233 GtkWidget *widget=(GtkWidget *)myWidget;
234 GtkWidget *wuint=(GtkWidget *)widgetUint;
235 uint32_t val;
236 uint32_t rank;
237 ADM_assert(widget);
238
239
240 rank=gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
241 gtk_widget_set_sensitive(GTK_WIDGET(wuint),rank);
242
243 }
enable(uint32_t onoff)244 void diaElemToggleUint::enable(uint32_t onoff)
245 {
246 GtkWidget *widget=(GtkWidget *)myWidget;
247 GtkWidget *wuint=(GtkWidget *)widgetUint;
248
249 gtk_widget_set_sensitive(GTK_WIDGET(widget),onoff);
250 gtk_widget_set_sensitive(GTK_WIDGET(wuint),onoff);
251 }
252
getRequiredLayout(void)253 int diaElemToggleUint::getRequiredLayout(void) { return 0; }
254
255 //** C callback **
cb_menu2(void * w,void * p)256 void cb_menu2(void *w,void *p)
257 {
258 diaElemToggleUint *me=(diaElemToggleUint *)p;
259 me->updateMe();
260 }
261 //*************************************************************************
diaElemToggleInt(uint32_t * toggleValue,const char * toggleTitle,int32_t * uintval,const char * name,int32_t min,int32_t max,const char * tip)262 diaElemToggleInt::diaElemToggleInt(uint32_t *toggleValue,const char *toggleTitle, int32_t *uintval, const char *name,int32_t min,int32_t max,const char *tip)
263 : diaElem(ELEM_TOGGLE_INT)
264 {
265 param=(void *)toggleValue;
266 paramTitle=toggleTitle;
267 this->tip=tip;
268 embName=name;
269 emb=uintval;
270 widgetUint=NULL;
271 _min=min;
272 _max=max;
273 }
274
~diaElemToggleInt()275 diaElemToggleInt::~diaElemToggleInt()
276 {
277
278 }
setMe(void * dialog,void * opaque,uint32_t line)279 void diaElemToggleInt::setMe(void *dialog, void *opaque,uint32_t line)
280 {
281 GtkWidget *widget,*widuint;
282
283 widget = gtk_check_button_new_with_mnemonic (paramTitle);
284 gtk_widget_show (widget);
285 myWidget=(void *)widget;
286
287 gtk_table_attach (GTK_TABLE (opaque), widget, 0, 1, line, line+1,
288 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
289 (GtkAttachOptions) (0), 0, 0);
290 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), *(uint32_t *)param);
291 if(tip)
292 {
293 gtk_widget_set_tooltip_text (widget, tip);
294 }
295 g_signal_connect(widget, "toggled", G_CALLBACK(cb_menu2), (void *) this);
296 /* Now put uint */
297 widuint = gtk_spin_button_new_with_range(_min,_max,1);
298 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON(widuint),TRUE);
299 gtk_spin_button_set_digits (GTK_SPIN_BUTTON(widuint),0);
300 gtk_spin_button_set_value (GTK_SPIN_BUTTON(widuint),*emb);
301
302 gtk_widget_show (widuint);
303
304 gtk_table_attach (GTK_TABLE (opaque), widuint, 1, 2, line, line+1,
305 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
306 (GtkAttachOptions) (0), 0, 0);
307
308 widgetUint=widuint;
309
310 }
getMe(void)311 void diaElemToggleInt::getMe(void)
312 {
313 GtkWidget *widget=(GtkWidget *)myWidget;
314 uint32_t *val=(uint32_t *)param;
315 ADM_assert(widget);
316 *(uint32_t *)param=gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
317 *emb=gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON ((GtkWidget *)widgetUint));
318 if(*emb<_min) *emb=_min;
319 if(*emb>_max) *emb=_max;
320 }
321
getRequiredLayout(void)322 int diaElemToggleInt::getRequiredLayout(void) { return 0; }
323
324 //** C callback **
cb_menu3(void * w,void * p)325 void cb_menu3(void *w,void *p)
326 {
327 diaElemToggleInt *me=(diaElemToggleInt *)p;
328 me->updateMe();
329 }
updateMe(void)330 void diaElemToggleInt::updateMe(void)
331 {
332 GtkWidget *widget=(GtkWidget *)myWidget;
333 GtkWidget *wuint=(GtkWidget *)widgetUint;
334 uint32_t val;
335 uint32_t rank;
336 ADM_assert(widget);
337
338
339 rank=gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
340 gtk_widget_set_sensitive(GTK_WIDGET(wuint),rank);
341
342 }
finalize(void)343 void diaElemToggleInt::finalize(void)
344 {
345 updateMe();
346 }
enable(uint32_t onoff)347 void diaElemToggleInt::enable(uint32_t onoff)
348 {
349 GtkWidget *widget=(GtkWidget *)myWidget;
350 GtkWidget *wuint=(GtkWidget *)widgetUint;
351
352 gtk_widget_set_sensitive(GTK_WIDGET(widget),onoff);
353 gtk_widget_set_sensitive(GTK_WIDGET(wuint),onoff);
354 }
355
356 } // End of namespace
357 //****************************Hoook*****************
358
gtkCreateToggleUint(uint32_t * toggleValue,const char * toggleTitle,uint32_t * uintval,const char * name,uint32_t min,uint32_t max,const char * tip)359 diaElem *gtkCreateToggleUint(uint32_t *toggleValue,const char *toggleTitle, uint32_t *uintval,
360 const char *name,uint32_t min,uint32_t max,const char *tip)
361 {
362 return new ADM_GtkFactory::diaElemToggleUint(toggleValue,toggleTitle, uintval,
363 name,min,max,tip);
364 }
gtkDestroyToggleUint(diaElem * e)365 void gtkDestroyToggleUint(diaElem *e)
366 {
367 ADM_GtkFactory::diaElemToggleUint *a=(ADM_GtkFactory::diaElemToggleUint *)e;
368 delete a;
369 }
370
gtkCreateToggleInt(uint32_t * toggleValue,const char * toggleTitle,int32_t * uintval,const char * name,int32_t min,int32_t max,const char * tip)371 diaElem *gtkCreateToggleInt(uint32_t *toggleValue,const char *toggleTitle, int32_t *uintval,
372 const char *name,int32_t min,int32_t max,const char *tip)
373 {
374 return new ADM_GtkFactory::diaElemToggleInt(toggleValue,toggleTitle, uintval,
375 name,min,max,tip);
376 }
gtkDestroyToggleInt(diaElem * e)377 void gtkDestroyToggleInt(diaElem *e)
378 {
379 ADM_GtkFactory::diaElemToggleInt *a=(ADM_GtkFactory::diaElemToggleInt *)e;
380 delete a;
381 }
gtkCreateToggle(bool * toggleValue,const char * toggleTitle,const char * tip)382 diaElem *gtkCreateToggle(bool *toggleValue,const char *toggleTitle, const char *tip)
383 {
384 return new ADM_GtkFactory::diaElemToggle(toggleValue,toggleTitle, tip);
385 }
gtkDestroyToggle(diaElem * e)386 void gtkDestroyToggle(diaElem *e)
387 {
388 ADM_GtkFactory::diaElemToggle *a=(ADM_GtkFactory::diaElemToggle *)e;
389 delete a;
390 }
391
392
393 //EOF
394