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 "T_menu.h"
17 #include "ADM_default.h"
18 #include "ADM_dialogFactoryQt4.h"
19 
20 #include <QGridLayout>
21 #include <QLabel>
22 #include <QAbstractItemView>
23 
24 extern const char *shortkey(const char *);
25 
26 namespace ADM_qt4Factory
27 {
28 class diaElemMenu : public diaElemMenuBase,QtFactoryUtils
29 {
30 protected:
31 	diaElemMenuDynamic  *dyna;
32 	diaMenuEntryDynamic  **menus;
33 
34 public:
35   diaElemMenu(uint32_t *intValue,const char *itle, uint32_t nb,
36                const diaMenuEntry *menu,const char *tip=NULL);
37 
38   virtual ~diaElemMenu() ;
39   void setMe(void *dialog, void *opaque,uint32_t line);
40   void getMe(void);
41   virtual uint8_t   link(diaMenuEntry *entry,uint32_t onoff,diaElem *w);
42   virtual void      updateMe(void);
43   void      enable(uint32_t onoff) ;
44   void      finalize(void);;
45   int getRequiredLayout(void);
46 };
47 
48 /**/
49 
ADM_QComboBox(diaElemMenuDynamic * menu)50 ADM_QComboBox::ADM_QComboBox(diaElemMenuDynamic *menu)
51 {
52 	_menu=menu;
53 }
54 
changed(int i)55 void ADM_QComboBox::changed(int i)
56 {
57 	_menu->updateMe();
58 }
59 
connectMe(void)60 void ADM_QComboBox::connectMe(void)
61 {
62 	QObject::connect(this, SIGNAL(currentIndexChanged(int)), this, SLOT(changed(int )));
63 }
64 
diaElemMenu(uint32_t * intValue,const char * itle,uint32_t nb,const diaMenuEntry * menu,const char * tip)65 diaElemMenu::diaElemMenu(uint32_t *intValue,const char *itle, uint32_t nb,
66                const diaMenuEntry *menu,const char *tip):QtFactoryUtils(itle)
67 {
68   param=(void *)intValue;
69   this->tip=tip;
70   this->menu=menu;
71   this->nbMenu=nb;
72   nbLink=0;
73 
74   menus=new diaMenuEntryDynamic * [nb];
75   for(int i=0;i<nb;i++)
76   {
77     menus[i]=new  diaMenuEntryDynamic(menu[i].val,menu[i].text,menu[i].desc);
78   }
79   dyna=new diaElemMenuDynamic(intValue,itle,nb,menus,tip);
80 }
81 
~diaElemMenu()82 diaElemMenu::~diaElemMenu()
83 {
84   for(int i=0;i<nbMenu;i++)
85       delete menus[i];
86   delete [] menus;
87   delete dyna;
88 
89 }
setMe(void * dialog,void * opaque,uint32_t line)90 void diaElemMenu::setMe(void *dialog, void *opaque,uint32_t line)
91 {
92   dyna->setMe(dialog,opaque,line);
93 }
94 
getMe(void)95 void diaElemMenu::getMe(void)
96 {
97  dyna->getMe();
98 }
updateMe(void)99 void   diaElemMenu::updateMe(void)
100 {
101   dyna->updateMe();
102 }
link(diaMenuEntry * entry,uint32_t onoff,diaElem * w)103 uint8_t   diaElemMenu::link(diaMenuEntry *entry,uint32_t onoff,diaElem *w)
104 {
105     for(int i=0;i<nbMenu;i++)
106     {
107         if(entry->val==menus[i]->val)
108             return dyna->link(menus[i],onoff,w);
109     }
110     ADM_assert(0);
111     return 1;
112 }
enable(uint32_t onoff)113 void   diaElemMenu::enable(uint32_t onoff)
114 {
115 
116     dyna->enable(onoff);
117 }
finalize(void)118 void   diaElemMenu::finalize(void)
119 {
120   dyna->finalize();
121 }
122 
getRequiredLayout(void)123 int diaElemMenu::getRequiredLayout(void) { return FAC_QT_GRIDLAYOUT; }
124 
125 //*********************************
126 //* DYNAMIC                       *
127 //*********************************
128 
diaElemMenuDynamic(uint32_t * intValue,const char * itle,uint32_t nb,diaMenuEntryDynamic ** menu,const char * tip)129 diaElemMenuDynamic::diaElemMenuDynamic(uint32_t *intValue,const char *itle, uint32_t nb,
130                 diaMenuEntryDynamic **menu,const char *tip)
131   :QtFactoryUtils(itle)
132 {
133   param=(void *)intValue;
134   this->tip=tip;
135   this->menu=menu;
136   this->nbMenu=nb;
137   nbLink=0;
138 }
139 
~diaElemMenuDynamic()140 diaElemMenuDynamic::~diaElemMenuDynamic()
141 {
142 }
setMe(void * dialog,void * opaque,uint32_t line)143 void diaElemMenuDynamic::setMe(void *dialog, void *opaque,uint32_t line)
144 {
145   ADM_QComboBox *combo=new ADM_QComboBox(this);
146 
147   QGridLayout *layout=(QGridLayout*) opaque;
148      myWidget=(void *)combo;
149 
150 	 QLabel *text=new QLabel( myQtTitle);
151 	 text->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
152 
153 	 QSpacerItem *spacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
154 
155   // Fill in combobox
156   int mem=0;
157   diaMenuEntryDynamic **entries=menu;
158   for(int i=0;i<nbMenu;i++)
159   {
160     combo->addItem(QString::fromUtf8(entries[i]->text));
161     if( *(uint32_t *)param==entries[i]->val) mem=i;
162   }
163   int wdth=combo->minimumSizeHint().width();
164   combo->view()->setMinimumWidth(wdth);
165 
166    combo->setCurrentIndex(mem);
167    text->setBuddy(combo);
168    layout->addWidget(text,line,0);
169    layout->addWidget(combo,line,1);
170    layout->addItem(spacer,line,2);
171 
172    combo->connectMe();
173    label=(void *)text;
174 }
175 
getMe(void)176 void diaElemMenuDynamic::getMe(void)
177 {
178   ADM_QComboBox *combo=(ADM_QComboBox *)myWidget;
179   int r;
180   r=combo->currentIndex();
181   if(!nbMenu) return;
182   ADM_assert(r<nbMenu);
183   *(uint32_t *)param=menu[r]->val;
184 
185 }
finalize(void)186 void diaElemMenuDynamic::finalize(void)
187 {
188    ADM_QComboBox *combo=(ADM_QComboBox *)myWidget;
189   uint32_t val;
190   uint32_t rank;
191   if(!nbMenu) return;
192   ADM_assert(combo);
193 
194 
195   rank=combo->currentIndex();
196   ADM_assert(rank<this->nbMenu);
197   val=this->menu[rank]->val;
198   /* Now search through the linked list to see if something happens ...*/
199 
200    /* 1 disable everything */
201   for(int i=0;i<nbLink;i++)
202   {
203     dialElemLink *l=&(links[i]);
204     if(l->value==val)
205     {
206       if(!l->onoff)  l->widget->enable(false);
207     }else
208     {
209        if(l->onoff)  l->widget->enable(false);
210     }
211 
212   }
213   /* Then enable */
214   for(int i=0;i<nbLink;i++)
215   {
216     dialElemLink *l=&(links[i]);
217     if(l->value==val)
218     {
219       if(l->onoff)  l->widget->enable(true);
220     }else
221     {
222        if(!l->onoff)  l->widget->enable(true);
223     }
224 
225   }
226 }
enable(uint32_t onoff)227 void diaElemMenuDynamic::enable(uint32_t onoff)
228 {
229     ADM_QComboBox *combo=(ADM_QComboBox *)myWidget;
230     ADM_assert(combo);
231     QLabel *txt=(QLabel *)label;
232     ADM_assert(txt);
233     txt->setEnabled(!!onoff);
234     combo->setEnabled(!!onoff);
235 }
236 
link(diaMenuEntryDynamic * entry,uint32_t onoff,diaElem * w)237 uint8_t   diaElemMenuDynamic::link(diaMenuEntryDynamic *entry,uint32_t onoff,diaElem *w)
238 {
239     ADM_assert(nbLink<MENU_MAX_lINK);
240     links[nbLink].value=entry->val;
241     links[nbLink].onoff=onoff;
242     links[nbLink].widget=w;
243     nbLink++;
244     return 1;
245 }
updateMe(void)246 void   diaElemMenuDynamic::updateMe(void)
247 {
248   finalize();
249 }
250 
getRequiredLayout(void)251 int diaElemMenuDynamic::getRequiredLayout(void) { return FAC_QT_GRIDLAYOUT; }
252 }; // End of namespace
253 
qt4CreateMenu(uint32_t * intValue,const char * itle,uint32_t nb,const diaMenuEntry * menu,const char * tip)254 diaElem  *qt4CreateMenu(uint32_t *intValue,const char *itle, uint32_t nb,         const diaMenuEntry *menu,const char *tip)
255 {
256 	return new  ADM_qt4Factory::diaElemMenu(intValue,itle,nb,menu,tip);
257 }
qt4DestroyMenu(diaElem * e)258 void qt4DestroyMenu(diaElem *e)
259 {
260 	ADM_qt4Factory::diaElemMenu *a=(ADM_qt4Factory::diaElemMenu *)e;
261 	delete a;
262 }
qt4CreateMenuDynamic(uint32_t * intValue,const char * itle,uint32_t nb,diaMenuEntryDynamic ** menu,const char * tipp)263 diaElem  *qt4CreateMenuDynamic(uint32_t *intValue,const char *itle, uint32_t nb,
264         diaMenuEntryDynamic **menu,const char *tipp)
265 {
266 	return new  ADM_qt4Factory::diaElemMenuDynamic(intValue,itle,nb,menu,tipp);
267 }
qt4DestroyMenuDynamic(diaElem * e)268 void qt4DestroyMenuDynamic(diaElem *e)
269 {
270 	ADM_qt4Factory::diaElemMenuDynamic *a=(ADM_qt4Factory::diaElemMenuDynamic *)e;
271 	delete a;
272 }
273 
274 //EOF
275