2 Copyright (c) 2006 Paolo Capriotti <p.capriotti@sns.it>
3 (c) 2006 Maurizio Monge <maurizio.monge@kdemail.net>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
12 #include <QGridLayout>
14 #include <QHBoxLayout>
16 #include <QVBoxLayout>
23 OptionWidget::OptionWidget(const OptList
& options
, QWidget
* parent
)
26 , m_options(options
) {
27 setupOptionWidget(this, m_options
);
30 void OptionWidget::notifyChange() {
34 dump_options_list(m_options
);
35 emit
changed(m_options
);
39 void OptionWidget::setValues(OptList
& newopts
) {
42 setOptionWidgetValues(this, newopts
);
48 void OptionWidget::setupOptionWidget(QWidget
* widget
, OptList
& options
, bool indent
) {
49 QGridLayout
*layout
= new QGridLayout(widget
);
54 int left
= indent
? 1 : 0;
55 int right
= indent
? 2 : 1;
57 for(int i
=0;i
<options
.size();i
++) {
58 OptPtr _o
= options
[i
];
60 boost::dynamic_pointer_cast
<BoolOpt
,BaseOpt
>(_o
)) {
61 OptCheckBox
*cb
= new OptCheckBox(o
, this, widget
);
62 cb
->setObjectName(qPrintf("%02d_check",i
));
63 layout
->addWidget(cb
, lpos
++, left
, 1, 2);
64 if(o
->m_sub_options
.size()) {
65 QWidget
*w
= new QWidget(widget
);
66 w
->setObjectName(qPrintf("%02d_check_sub",i
));
67 setupOptionWidget(w
, o
->m_sub_options
, true);
68 w
->setEnabled(o
->value());
69 QObject::connect(cb
, SIGNAL(toggled(bool)), w
, SLOT(setEnabled(bool)));
70 layout
->addWidget(w
, lpos
++, left
, 1, 2);
73 else if(SelectOptPtr o
=
74 boost::dynamic_pointer_cast
<SelectOpt
,BaseOpt
>(_o
)) {
75 QGroupBox
*gb
= new QGroupBox(o
->label(), widget
);
76 gb
->setObjectName(qPrintf("%02d_group",i
));
77 QVBoxLayout
*vbox
= new QVBoxLayout(gb
);
79 for(int j
=0;j
<o
->m_options
.size();j
++) {
80 BoolOptPtr so
= o
->m_options
[j
];
81 OptRadioButton
*rb
= new OptRadioButton(o
, j
, this, gb
);
82 rb
->setObjectName(qPrintf("%02d_radio_%02d",i
,j
));
84 if(so
->m_sub_options
.size()) {
85 QWidget
*w
= new QWidget(widget
);
86 w
->setObjectName(qPrintf("%02d_radio_%02d_sub",i
,j
));
87 setupOptionWidget(w
, so
->m_sub_options
, true);
88 w
->setEnabled(so
->value());
89 QObject::connect(rb
, SIGNAL(toggled(bool)), w
, SLOT(setEnabled(bool)));
93 layout
->addWidget(gb
, lpos
++, left
, 1, 2);
96 boost::dynamic_pointer_cast
<IntOpt
,BaseOpt
>(_o
)) {
97 layout
->addWidget(new QLabel(o
->label()), lpos
, left
);
99 OptSlider
*sl
= new OptSlider(o
, this, widget
);
100 sl
->setObjectName(qPrintf("%02d_slid",i
));
101 layout
->addWidget(sl
, lpos
++, right
);
104 OptSpinBox
*sb
= new OptSpinBox(o
, this, widget
);
105 sb
->setObjectName(qPrintf("%02d_spin",i
));
106 layout
->addWidget(sb
, lpos
++, right
);
109 else if(StringOptPtr o
=
110 boost::dynamic_pointer_cast
<StringOpt
,BaseOpt
>(_o
)) {
111 layout
->addWidget(new QLabel(o
->label()), lpos
, left
);
112 OptLineEdit
*ow
= new OptLineEdit(o
, this, widget
);
113 ow
->setObjectName(qPrintf("%02d_line",i
));
114 layout
->addWidget(ow
, lpos
++, right
);
116 else if(UrlOptPtr o
=
117 boost::dynamic_pointer_cast
<UrlOpt
,BaseOpt
>(_o
)) {
118 layout
->addWidget(new QLabel(o
->label()), lpos
, left
);
119 OptUrlRequester
*ow
= new OptUrlRequester(o
, this, widget
);
120 ow
->setObjectName(qPrintf("%02d_url",i
));
121 layout
->addWidget(ow
, lpos
++, right
);
123 else if(ComboOptPtr o
=
124 boost::dynamic_pointer_cast
<ComboOpt
,BaseOpt
>(_o
)) {
125 layout
->addWidget(new QLabel(o
->label()), lpos
, left
);
126 OptComboBox
*ow
= new OptComboBox(o
, this, widget
);
127 ow
->setObjectName(qPrintf("%02d_combo",i
));
128 layout
->addWidget(ow
, lpos
++, right
);
130 else if(ColorOptPtr o
=
131 boost::dynamic_pointer_cast
<ColorOpt
,BaseOpt
>(_o
)) {
132 layout
->addWidget(new QLabel(o
->label()), lpos
, left
);
133 OptColorButton
*ow
= new OptColorButton(o
, this, widget
);
134 ow
->setObjectName(qPrintf("%02d_color",i
));
135 layout
->addWidget(ow
, lpos
++, right
);
137 else if(FontOptPtr o
=
138 boost::dynamic_pointer_cast
<FontOpt
,BaseOpt
>(_o
)) {
139 layout
->addWidget(new QLabel(o
->label()), lpos
, left
);
140 OptFontRequester
*ow
= new OptFontRequester(o
,this, widget
);
141 ow
->setObjectName(qPrintf("%02d_font",i
));
142 layout
->addWidget(ow
, lpos
++, right
);
145 ERROR("Unknown option of type " << prettyTypeName(typeid(*_o
).name()));
149 layout
->addItem(new QSpacerItem(25, 1, QSizePolicy::Minimum
, QSizePolicy::Minimum
),
153 void OptionWidget::setOptionWidgetValues(QWidget
* widget
, OptList
& newopts
) {
154 for(int i
=0;i
<newopts
.size();i
++) {
155 OptPtr _o
= newopts
[i
];
157 boost::dynamic_pointer_cast
<BoolOpt
,BaseOpt
>(_o
)) {
158 OptCheckBox
*cb
= widget
->findChild
<OptCheckBox
*>(qPrintf("%02d_check",i
));
160 cb
->setChecked(o
->value());
162 if(o
->m_sub_options
.size()) {
163 QWidget
*w
= widget
->findChild
<QWidget
*>(qPrintf("%02d_check_sub",i
));
165 setOptionWidgetValues(w
, o
->m_sub_options
);
168 else if(SelectOptPtr o
=
169 boost::dynamic_pointer_cast
<SelectOpt
,BaseOpt
>(_o
)) {
170 QGroupBox
*gb
= widget
->findChild
<QGroupBox
*>(qPrintf("%02d_group",i
));
173 for(int j
=0;j
<o
->m_options
.size();j
++) {
174 BoolOptPtr so
= o
->m_options
[j
];
175 OptRadioButton
*rb
= gb
->findChild
<OptRadioButton
*>(qPrintf("%02d_radio_%02d",i
,j
));
177 rb
->setChecked(so
->value());
179 if(so
->m_sub_options
.size()) {
180 QWidget
*w
= widget
->findChild
<QWidget
*>(qPrintf("%02d_radio_%02d_sub",i
,j
));
182 setOptionWidgetValues(w
, so
->m_sub_options
);
186 else if(IntOptPtr o
=
187 boost::dynamic_pointer_cast
<IntOpt
,BaseOpt
>(_o
)) {
189 OptSlider
*sl
= widget
->findChild
<OptSlider
*>(qPrintf("%02d_slid",i
));
191 sl
->setValue(o
->value());
194 OptSpinBox
*sb
= widget
->findChild
<OptSpinBox
*>(qPrintf("%02d_spin",i
));
196 sb
->setValue(o
->value());
199 else if(StringOptPtr o
=
200 boost::dynamic_pointer_cast
<StringOpt
,BaseOpt
>(_o
)) {
201 OptLineEdit
*ow
= widget
->findChild
<OptLineEdit
*>(qPrintf("%02d_line",i
));
203 ow
->setText(o
->value());
205 else if(UrlOptPtr o
=
206 boost::dynamic_pointer_cast
<UrlOpt
,BaseOpt
>(_o
)) {
207 OptUrlRequester
*ow
= widget
->findChild
<OptUrlRequester
*>(qPrintf("%02d_url",i
));
209 ow
->setUrl(o
->value());
211 else if(ComboOptPtr o
=
212 boost::dynamic_pointer_cast
<ComboOpt
,BaseOpt
>(_o
)) {
213 OptComboBox
*ow
= widget
->findChild
<OptComboBox
*>(qPrintf("%02d_combo",i
));
215 ow
->setCurrentIndex(o
->selected());
217 else if(ColorOptPtr o
=
218 boost::dynamic_pointer_cast
<ColorOpt
,BaseOpt
>(_o
)) {
219 OptColorButton
*ow
= widget
->findChild
<OptColorButton
*>(qPrintf("%02d_color",i
));
221 ow
->setColor(o
->value());
223 else if(FontOptPtr o
=
224 boost::dynamic_pointer_cast
<FontOpt
,BaseOpt
>(_o
)) {
225 OptFontRequester
*ow
= widget
->findChild
<OptFontRequester
*>(qPrintf("%02d_font",i
));
227 ow
->setFont(o
->value());
230 ERROR("Unknown option of type " << prettyTypeName(typeid(*_o
).name()));
234 ERROR("Options/Widget mismatch!");
237 void dump_options_list(const OptList
& options
, int indent
) {
238 if(!indent
)std::cout
<< "---- begin dump ----" << std::endl
;
239 for(int i
=0;i
<options
.size();i
++) {
240 OptPtr _o
= options
[i
];
242 boost::dynamic_pointer_cast
<BoolOpt
,BaseOpt
>(_o
)) {
243 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
244 std::cout
<< (o
->value()?"[X]":"[ ]") << " " << o
->label() << std::endl
;
245 dump_options_list(o
->subOptions(), indent
+1);
247 else if(IntOptPtr o
=
248 boost::dynamic_pointer_cast
<IntOpt
,BaseOpt
>(_o
)) {
249 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
250 std::cout
<< o
->label() << " |" << o
->value() << "|" << std::endl
;
252 else if(StringOptPtr o
=
253 boost::dynamic_pointer_cast
<StringOpt
,BaseOpt
>(_o
)) {
254 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
255 std::cout
<< o
->label() << " [" << o
->value() << "]" << std::endl
;
257 else if(UrlOptPtr o
=
258 boost::dynamic_pointer_cast
<UrlOpt
,BaseOpt
>(_o
)) {
259 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
260 std::cout
<< o
->label() << " {" << o
->value() << "}" << std::endl
;
262 else if(ColorOptPtr o
=
263 boost::dynamic_pointer_cast
<ColorOpt
,BaseOpt
>(_o
)) {
264 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
265 std::cout
<< o
->label() << " {" << o
->value().name() << "}" << std::endl
;
267 else if(FontOptPtr o
=
268 boost::dynamic_pointer_cast
<FontOpt
,BaseOpt
>(_o
)) {
269 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
270 std::cout
<< o
->label() << " {" << o
->value().toString() << "}" << std::endl
;
272 else if(ComboOptPtr o
=
273 boost::dynamic_pointer_cast
<ComboOpt
,BaseOpt
>(_o
)) {
274 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
275 std::cout
<< "[combo] " << o
->label() << std::endl
;
276 for(int k
=0;k
<o
->values().size();k
++) {
277 for(int j
=0;j
<indent
+1;j
++)std::cout
<< " ";
279 std::cout
<< " *<" << o
->values()[k
] << ">*" << std::endl
;
281 std::cout
<< " <" << o
->values()[k
] << ">" << std::endl
;
284 else if(SelectOptPtr o
=
285 boost::dynamic_pointer_cast
<SelectOpt
,BaseOpt
>(_o
)) {
286 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
287 std::cout
<< "[group] " << o
->label() << std::endl
;
288 for(int j
=0;j
<o
->options().size();j
++) {
289 BoolOptPtr so
= o
->options()[j
];
290 for(int j
=0;j
<indent
+1;j
++)std::cout
<< " ";
291 std::cout
<< (so
->value()?"(*)":"( )") << " " << so
->label() << std::endl
;
292 if(so
->subOptions().size())
293 dump_options_list(so
->subOptions(), indent
+2);
297 std::cout
<< "dump_options_list: Error, unknown option of type "
298 << prettyTypeName(typeid(*_o
).name()) << std::endl
;
301 if(!indent
)std::cout
<< "---- end dump ----" << std::endl
;
304 bool options_list_load_from_settings(OptList
& options
, const Settings
& s
) {
306 for(int i
=0;i
<options
.size();i
++) {
307 OptPtr _o
= options
[i
];
309 boost::dynamic_pointer_cast
<BoolOpt
,BaseOpt
>(_o
)) {
310 Settings bool_group
= s
.group(o
->name());
311 retv
|= options_list_load_from_settings(o
->m_sub_options
, bool_group
);
312 bool newval
= bool_group
.flag("value", o
->value());
313 retv
|= (newval
!= o
->value());
314 o
->setValue( newval
);
316 else if(IntOptPtr o
=
317 boost::dynamic_pointer_cast
<IntOpt
,BaseOpt
>(_o
)) {
318 int newval
= s
[o
->name()] | o
->value();
319 retv
|= (newval
!= o
->value());
320 o
->setValue( newval
);
322 else if(StringOptPtr o
=
323 boost::dynamic_pointer_cast
<StringOpt
,BaseOpt
>(_o
)) {
324 QString newval
= s
[o
->name()] | o
->value();
325 retv
|= (newval
!= o
->value());
326 o
->setValue( newval
);
328 else if(UrlOptPtr o
=
329 boost::dynamic_pointer_cast
<UrlOpt
,BaseOpt
>(_o
)) {
330 QString newval
= s
[o
->name()] | o
->value();
331 retv
|= (newval
!= o
->value());
332 o
->setValue( newval
);
334 else if(ColorOptPtr o
=
335 boost::dynamic_pointer_cast
<ColorOpt
,BaseOpt
>(_o
)) {
336 QColor newval
= s
[o
->name()] | o
->value();
337 retv
|= (newval
!= o
->value());
338 o
->setValue( newval
);
340 else if(FontOptPtr o
=
341 boost::dynamic_pointer_cast
<FontOpt
,BaseOpt
>(_o
)) {
342 QFont newval
= s
[o
->name()] | o
->value();
343 retv
|= (newval
!= o
->value());
344 o
->setValue( newval
);
346 else if(ComboOptPtr o
=
347 boost::dynamic_pointer_cast
<ComboOpt
,BaseOpt
>(_o
)) {
348 int newval
= s
[o
->name()] | o
->selected();
349 retv
|= (newval
!= o
->selected());
350 o
->setSelected( newval
);
352 else if(SelectOptPtr o
=
353 boost::dynamic_pointer_cast
<SelectOpt
,BaseOpt
>(_o
)) {
355 for(int i
=0;i
<o
->m_options
.size();i
++)
356 l
<< o
->m_options
[i
];
357 Settings sel_group
= s
.group(o
->name());
358 retv
|= options_list_load_from_settings(l
, sel_group
.group("sel-options"));
359 int newval
= sel_group
["value"] | o
->selected();
360 retv
|= (newval
!= o
->selected());
361 o
->setSelected( newval
);
364 ERROR("option of type " << prettyTypeName(typeid(*_o
).name()) );
369 void options_list_save_to_settings(const OptList
& options
, Settings s
) {
370 for(int i
=0;i
<options
.size();i
++) {
371 OptPtr _o
= options
[i
];
373 boost::dynamic_pointer_cast
<BoolOpt
,BaseOpt
>(_o
)) {
374 Settings bool_group
= s
.group(o
->name());
375 options_list_save_to_settings(o
->subOptions(), bool_group
);
376 bool_group
.setFlag("value", o
->value());
378 else if(IntOptPtr o
=
379 boost::dynamic_pointer_cast
<IntOpt
,BaseOpt
>(_o
)) {
380 s
[o
->name()] = o
->value();
382 else if(StringOptPtr o
=
383 boost::dynamic_pointer_cast
<StringOpt
,BaseOpt
>(_o
)) {
384 s
[o
->name()] = o
->value();
386 else if(UrlOptPtr o
=
387 boost::dynamic_pointer_cast
<UrlOpt
,BaseOpt
>(_o
)) {
388 s
[o
->name()] = o
->value();
390 else if(ColorOptPtr o
=
391 boost::dynamic_pointer_cast
<ColorOpt
,BaseOpt
>(_o
)) {
392 s
[o
->name()] = o
->value();
394 else if(FontOptPtr o
=
395 boost::dynamic_pointer_cast
<FontOpt
,BaseOpt
>(_o
)) {
396 s
[o
->name()] = o
->value();
398 else if(ComboOptPtr o
=
399 boost::dynamic_pointer_cast
<ComboOpt
,BaseOpt
>(_o
)) {
400 s
[o
->name()] = o
->value();
402 else if(SelectOptPtr o
=
403 boost::dynamic_pointer_cast
<SelectOpt
,BaseOpt
>(_o
)) {
405 for(int i
=0;i
<o
->options().size();i
++)
406 l
<< o
->options()[i
];
407 Settings sel_group
= s
.group(o
->name());
408 options_list_save_to_settings(l
, sel_group
.group("sel-options"));
409 sel_group
["value"] = o
->value();
412 ERROR("option of type " << prettyTypeName(typeid(*_o
).name()) );