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