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 <QGridLayout>
17 #include <QSpinBox>
18 
19 #include "T_toggle.h"
20 #include "ADM_default.h"
21 #include "DIA_factory.h"
22 #include "ADM_dialogFactoryQt4.h"
23 
24 extern const char *shortkey(const char *);
25 
26 namespace ADM_qt4Factory
27 {
28 class diaElemToggle : public diaElemToggleBase,QtFactoryUtils
29 {
30   protected:
31 public:
32             diaElemToggle(bool *toggleValue,const char *toggleTitle, const char *tip=NULL);
33   virtual   ~diaElemToggle() ;
34   void      setMe(void *dialog, void *opaque,uint32_t line);
35   void      getMe(void);
36   void      enable(uint32_t onoff) ;
37   void      finalize(void);
38   void      updateMe();
39   uint8_t   link(uint32_t onoff,diaElem *w);
40   int getRequiredLayout(void);
41 };
42 
43 class diaElemToggleUint : public diaElem,QtFactoryUtils
44 {
45   protected:
46         uint32_t *emb;
47         const char *embName;
48         void *widgetUint;
49         uint32_t _min,_max;
50 public:
51             diaElemToggleUint(uint32_t *toggleValue,const char *toggleTitle, uint32_t *uintval,
52             					const char *name,uint32_t min,uint32_t max,const char *tip=NULL);
53   virtual   ~diaElemToggleUint() ;
54   void      setMe(void *dialog, void *opaque,uint32_t line);
55   void      getMe(void);
56   void      enable(uint32_t onoff) ;
57   void      finalize(void);
58   void      updateMe();
59   int getRequiredLayout(void);
60 };
61 class diaElemToggleInt : public diaElem,QtFactoryUtils
62 {
63   protected:
64 	  		 int32_t *emb;
65 	         const char *embName;
66 	         void *widgetUint;
67 	         int32_t _min,_max;
68 public:
69             diaElemToggleInt(uint32_t *toggleValue,const char *toggleTitle, int32_t *uintval,
70             				const char *name,int32_t min,int32_t max,const char *tip=NULL);
71   virtual   ~diaElemToggleInt() ;
72   void      setMe(void *dialog, void *opaque,uint32_t line);
73   void      getMe(void);
74   void      finalize(void);
75   void      updateMe();
76   void      enable(uint32_t onoff) ;
77   int getRequiredLayout(void);
78 };
79 
changed(int i)80 void ADM_QCheckBox::changed(int i)
81 {
82 	switch(_type)
83 	{
84 		case TT_TOGGLE:
85 			((diaElemToggle *)_toggle)->updateMe();break;
86 		case TT_TOGGLE_UINT:
87 			((diaElemToggleUint *)_toggle)->updateMe();break;
88 		case TT_TOGGLE_INT:
89 			((diaElemToggleInt *)_toggle)->updateMe();break;
90 		default:
91 			ADM_assert(0);break;
92 	}
93 }
94 
ADM_QCheckBox(const QString & str,QWidget * root,void * toggle,TOG_TYPE type)95 ADM_QCheckBox::ADM_QCheckBox(const QString & str,QWidget *root,void *toggle,TOG_TYPE type) : QCheckBox(str,root)
96 {
97 	_toggle=toggle;
98 	_type=type;
99 }
100 
connectMe(void)101 void ADM_QCheckBox::connectMe(void)
102 {
103 	QObject::connect(this, SIGNAL(stateChanged(int)), this, SLOT(changed(int )));
104 }
105 
diaElemToggle(bool * toggleValue,const char * toggleTitle,const char * tip)106 diaElemToggle::diaElemToggle(bool *toggleValue,const char *toggleTitle, const char *tip)
107   : diaElemToggleBase(),QtFactoryUtils(toggleTitle)
108 {
109   param=(void *)toggleValue;
110   this->tip=tip;
111   myWidget=NULL;
112   nbLink=0;
113 }
114 
~diaElemToggle()115 diaElemToggle::~diaElemToggle()
116 {
117 //  ADM_QCheckBox *box=(ADM_QCheckBox *)myWidget;
118  // if(box) delete box;
119   myWidget=NULL;
120 }
setMe(void * dialog,void * opaque,uint32_t l)121 void diaElemToggle::setMe(void *dialog, void *opaque,uint32_t l)
122 {
123  ADM_QCheckBox *box=new ADM_QCheckBox(myQtTitle,(QWidget *)dialog,this,TT_TOGGLE);
124  QVBoxLayout *layout=(QVBoxLayout*) opaque;
125  myWidget=(void *)box;
126  if( *(bool *)param)
127  {
128     box->setCheckState(Qt::Checked);
129  }
130 
131  layout->addWidget(box);
132  box->connectMe();
133 }
getMe(void)134 void diaElemToggle::getMe(void)
135 {
136   ADM_QCheckBox *box=(ADM_QCheckBox *)myWidget;
137   bool *val=(bool *)param;
138   if(Qt::Checked==box->checkState())
139   {
140     *val=true;
141   }else
142     *val=false;
143 }
enable(uint32_t onoff)144 void diaElemToggle::enable(uint32_t onoff)
145 {
146   ADM_QCheckBox *box=(ADM_QCheckBox *)myWidget;
147   ADM_assert(box);
148   if(onoff)
149     box->setEnabled(true);
150   else
151     box->setDisabled(true);
152 }
153 
finalize(void)154 void   diaElemToggle::finalize(void)
155 {
156   updateMe();
157 }
updateMe(void)158 void   diaElemToggle::updateMe(void)
159 {
160 
161   uint32_t val;
162   uint32_t rank=0;
163   if(!nbLink) return;
164   ADM_assert(myWidget);
165 
166   ADM_QCheckBox *box=(ADM_QCheckBox *)myWidget;
167 
168   if(Qt::Checked==box->checkState())
169   {
170     rank=1;
171   }
172   /* Now search through the linked list to see if something happens ...*/
173 
174    /* 1 disable everything */
175   for(int i=0;i<nbLink;i++)
176   {
177     dialElemLink *l=&(links[i]);
178     l->widget->enable(0);
179   }
180   /* Then enable */
181   for(int i=0;i<nbLink;i++)
182   {
183       dialElemLink *l=&(links[i]);
184       if(l->onoff==rank)  l->widget->enable(1);
185   }
186 }
187 
link(uint32_t onoff,diaElem * w)188 uint8_t   diaElemToggle::link(uint32_t onoff,diaElem *w)
189 {
190     ADM_assert(nbLink<MENU_MAX_lINK);
191     links[nbLink].onoff=onoff;
192     links[nbLink].widget=w;
193     nbLink++;
194     return 1;
195 }
196 
getRequiredLayout(void)197 int diaElemToggle::getRequiredLayout(void) { return FAC_QT_VBOXLAYOUT; }
198 
199 //******************************************************
200 // An UInt and a toggle linked...
201 //******************************************************
diaElemToggleUint(uint32_t * toggleValue,const char * toggleTitle,uint32_t * uintval,const char * name,uint32_t min,uint32_t max,const char * tip)202 diaElemToggleUint::diaElemToggleUint(uint32_t *toggleValue,const char *toggleTitle, uint32_t *uintval, const char *name,uint32_t min,uint32_t max,const char *tip)
203   : diaElem(ELEM_TOGGLE_UINT),QtFactoryUtils(toggleTitle)
204 {
205   param=(void *)toggleValue;
206   this->tip=tip;
207   embName=name;
208   emb=uintval;
209   widgetUint=NULL;
210   _min=min;
211   _max=max;
212 }
213 
~diaElemToggleUint()214 diaElemToggleUint::~diaElemToggleUint()
215 {
216 }
setMe(void * dialog,void * opaque,uint32_t line)217 void diaElemToggleUint::setMe(void *dialog, void *opaque,uint32_t line)
218 {
219  ADM_QCheckBox *box=new ADM_QCheckBox(myQtTitle,(QWidget *)dialog,this,TT_TOGGLE_UINT);
220  QGridLayout *layout=(QGridLayout*) opaque;
221  QHBoxLayout *hboxLayout = new QHBoxLayout();
222  myWidget=(void *)box;
223  if( *(uint32_t *)param)
224  {
225     box->setCheckState(Qt::Checked);
226  }
227 
228  // Now add spin
229  QSpinBox *spin=new QSpinBox((QWidget *)dialog);
230  widgetUint=(void *)spin;
231 
232  spin->setMinimum(_min);
233  spin->setMaximum(_max);
234  spin->setValue(*(uint32_t *)emb);
235 
236  QSpacerItem *spacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
237 
238  hboxLayout->addWidget(spin);
239  hboxLayout->addItem(spacer);
240 
241  layout->addWidget(box,line,0);
242  layout->addLayout(hboxLayout,line,1);
243  box->connectMe();
244 }
245 
getMe(void)246 void diaElemToggleUint::getMe(void)
247 {
248   ADM_QCheckBox *box=(ADM_QCheckBox *)myWidget;
249   uint32_t *val=(uint32_t *)param;
250   if(Qt::Checked==box->checkState())
251   {
252     *val=1;
253   }else
254     *val=0;
255   //
256     uint32_t u;
257   QSpinBox *spin=(QSpinBox *)widgetUint;
258   u=spin->value();
259  if(u<_min) u=_min;
260  if(u>_max) u=_max;
261  *emb=u;
262 
263 }
finalize(void)264 void   diaElemToggleUint::finalize(void)
265 {
266   updateMe();
267 }
updateMe(void)268 void   diaElemToggleUint::updateMe(void)
269 {
270   uint32_t val;
271   uint32_t rank=false;
272   ADM_assert(myWidget);
273 
274   ADM_QCheckBox *box=(ADM_QCheckBox *)myWidget;
275   QSpinBox *spin=(QSpinBox *)widgetUint;
276 
277   if(Qt::Checked==box->checkState())
278   {
279     rank=true;
280   }
281   spin->setEnabled(rank);
282 }
enable(uint32_t onoff)283 void   diaElemToggleUint::enable(uint32_t onoff)
284 {
285     ADM_QCheckBox *box=(ADM_QCheckBox *)myWidget;
286       QSpinBox *spin=(QSpinBox *)widgetUint;
287   ADM_assert(box);
288   if(onoff)
289   {
290     box->setEnabled(true);
291     spin->setEnabled(true);
292   }
293   else
294   {
295     box->setEnabled(false);
296     spin->setEnabled(false);
297   }
298 }
299 
getRequiredLayout(void)300 int diaElemToggleUint::getRequiredLayout(void) { return FAC_QT_GRIDLAYOUT; }
301 
302 //******************************************************
303 // An Int and a toggle linked...
304 //******************************************************
305 
diaElemToggleInt(uint32_t * toggleValue,const char * toggleTitle,int32_t * uintval,const char * name,int32_t min,int32_t max,const char * tip)306 diaElemToggleInt::diaElemToggleInt(uint32_t *toggleValue,const char *toggleTitle, int32_t *uintval, const char *name,int32_t min,int32_t max,const char *tip)
307   : diaElem(ELEM_TOGGLE_INT),QtFactoryUtils(toggleTitle)
308 {
309   param=(void *)toggleValue;
310   this->tip=tip;
311   embName=name;
312   emb=uintval;
313   widgetUint=NULL;
314   _min=min;
315   _max=max;
316 }
317 
~diaElemToggleInt()318 diaElemToggleInt::~diaElemToggleInt()
319 {
320 
321 }
setMe(void * dialog,void * opaque,uint32_t line)322 void diaElemToggleInt::setMe(void *dialog, void *opaque,uint32_t line)
323 {
324  ADM_QCheckBox *box=new ADM_QCheckBox(myQtTitle,(QWidget *)dialog,this,TT_TOGGLE_INT);
325  QGridLayout *layout=(QGridLayout*) opaque;
326  QHBoxLayout *hboxLayout = new QHBoxLayout();
327  myWidget=(void *)box;
328  if( *(uint32_t *)param)
329  {
330     box->setCheckState(Qt::Checked);
331  }
332 
333  // Now add spin
334  QSpinBox *spin=new QSpinBox((QWidget *)dialog);
335  widgetUint=(void *)spin;
336 
337  spin->setMinimum(_min);
338  spin->setMaximum(_max);
339  spin->setValue(*emb);
340 
341  QSpacerItem *spacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
342 
343  hboxLayout->addWidget(spin);
344  hboxLayout->addItem(spacer);
345 
346  layout->addWidget(box,line,0);
347  layout->addLayout(hboxLayout,line,1);
348  box->connectMe();
349 }
350 
getMe(void)351 void diaElemToggleInt::getMe(void)
352 {
353   ADM_QCheckBox *box=(ADM_QCheckBox *)myWidget;
354   uint32_t *val=(uint32_t *)param;
355   if(Qt::Checked==box->checkState())
356   {
357     *val=1;
358   }else
359     *val=0;
360   //
361     int32_t u;
362   QSpinBox *spin=(QSpinBox *)widgetUint;
363   u=spin->value();
364  if(u<_min) u=_min;
365  if(u>_max) u=_max;
366  *emb=u;
367 }
368 
getRequiredLayout(void)369 int diaElemToggleInt::getRequiredLayout(void) { return FAC_QT_GRIDLAYOUT; }
370 
finalize(void)371 void   diaElemToggleInt::finalize(void)
372 {
373   updateMe();
374 }
updateMe(void)375 void   diaElemToggleInt::updateMe(void)
376 {
377   uint32_t val;
378   uint32_t rank=false;
379   ADM_assert(myWidget);
380 
381   ADM_QCheckBox *box=(ADM_QCheckBox *)myWidget;
382   QSpinBox *spin=(QSpinBox *)widgetUint;
383 
384   if(Qt::Checked==box->checkState())
385   {
386     rank=true;
387   }
388   spin->setEnabled(rank);
389 }
enable(uint32_t onoff)390 void   diaElemToggleInt::enable(uint32_t onoff)
391 {
392     ADM_QCheckBox *box=(ADM_QCheckBox *)myWidget;
393       QSpinBox *spin=(QSpinBox *)widgetUint;
394   ADM_assert(box);
395   if(onoff)
396   {
397     box->setEnabled(true);
398     spin->setEnabled(true);
399   }
400   else
401   {
402     box->setEnabled(false);
403     spin->setEnabled(false);
404   }
405 }
406 
407 } // End of namespace
408 //****************************Hoook*****************
409 
qt4CreateToggleUint(uint32_t * toggleValue,const char * toggleTitle,uint32_t * uintval,const char * name,uint32_t min,uint32_t max,const char * tip)410 diaElem  *qt4CreateToggleUint(uint32_t *toggleValue,const char *toggleTitle, uint32_t *uintval,
411 		const char *name,uint32_t min,uint32_t max,const char *tip)
412 {
413 	return new  ADM_qt4Factory::diaElemToggleUint(toggleValue,toggleTitle, uintval,
414 			name,min,max,tip);
415 }
qt4DestroyToggleUint(diaElem * e)416 void qt4DestroyToggleUint(diaElem *e)
417 {
418 	ADM_qt4Factory::diaElemToggleUint *a=(ADM_qt4Factory::diaElemToggleUint *)e;
419 	delete a;
420 }
421 
qt4CreateToggleInt(uint32_t * toggleValue,const char * toggleTitle,int32_t * uintval,const char * name,int32_t min,int32_t max,const char * tip)422 diaElem  *qt4CreateToggleInt(uint32_t *toggleValue,const char *toggleTitle, int32_t *uintval,
423 		const char *name,int32_t min,int32_t max,const char *tip)
424 {
425 	return new  ADM_qt4Factory::diaElemToggleInt(toggleValue,toggleTitle, uintval,
426 			name,min,max,tip);
427 }
qt4DestroyToggleInt(diaElem * e)428 void qt4DestroyToggleInt(diaElem *e)
429 {
430 	ADM_qt4Factory::diaElemToggleInt *a=(ADM_qt4Factory::diaElemToggleInt *)e;
431 	delete a;
432 }
qt4CreateToggle(bool * toggleValue,const char * toggleTitle,const char * tip)433 diaElem  *qt4CreateToggle(bool *toggleValue,const char *toggleTitle, const char *tip)
434 {
435 	return new  ADM_qt4Factory::diaElemToggle(toggleValue,toggleTitle, tip);
436 }
qt4DestroyToggle(diaElem * e)437 void qt4DestroyToggle(diaElem *e)
438 {
439 	ADM_qt4Factory::diaElemToggle *a=(ADM_qt4Factory::diaElemToggle *)e;
440 	delete a;
441 }
442 
443 
444 
445 //EOF
446