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>
22 OptCheckBox::OptCheckBox(boost::shared_ptr
<BoolOpt
> opt
, OptionWidget
*owner
, QWidget
*parent
)
23 : QCheckBox(opt
->label(), parent
)
26 setChecked(m_opt
->value());
27 connect(this, SIGNAL(toggled(bool)), this, SLOT(setOpt(bool)));
30 void OptCheckBox::setOpt(bool b
) {
32 m_owner
->notifyChange();
35 OptRadioButton::OptRadioButton(boost::shared_ptr
<SelectOpt
> opt
, int i
, OptionWidget
*owner
, QWidget
*parent
)
36 : QRadioButton(opt
->m_options
[i
]->label(), parent
)
40 setChecked(m_opt
->m_options
[i
]->value());
41 connect(this, SIGNAL(toggled(bool)), this, SLOT(setOpt(bool)));
44 void OptRadioButton::setOpt(bool b
) {
46 m_opt
->setSelected(m_index
);
47 m_owner
->notifyChange();
51 OptSpinBox::OptSpinBox(boost::shared_ptr
<IntOpt
> opt
, OptionWidget
*owner
, QWidget
*parent
)
55 setValue(m_opt
->value());
56 setMinimum(m_opt
->min());
57 setMaximum(m_opt
->max());
58 connect(this, SIGNAL(valueChanged(int)), this, SLOT(setOpt(int)));
61 void OptSpinBox::setOpt(int i
) {
63 m_owner
->notifyChange();
66 OptLineEdit::OptLineEdit(boost::shared_ptr
<StringOpt
> opt
, OptionWidget
*owner
, QWidget
*parent
)
70 setText(m_opt
->value());
71 connect(this, SIGNAL(textChanged(const QString
&)), this, SLOT(setOpt(const QString
&)));
74 void OptLineEdit::setOpt(const QString
& s
) {
76 m_owner
->notifyChange();
79 OptUrlRequester::OptUrlRequester(boost::shared_ptr
<UrlOpt
> opt
, OptionWidget
*owner
, QWidget
*parent
)
80 : KUrlRequester(parent
)
83 setUrl(m_opt
->value());
84 connect(this, SIGNAL(urlSelected(const QString
&)), this, SLOT(setOpt(const QString
&)));
87 void OptUrlRequester::setOpt(const QString
& s
) {
89 m_owner
->notifyChange();
92 OptComboBox::OptComboBox(boost::shared_ptr
<ComboOpt
> opt
, OptionWidget
*owner
, QWidget
*parent
)
96 addItems(m_opt
->m_values
);
97 setCurrentIndex(m_opt
->selected());
98 connect(this, SIGNAL(currentIndexChanged(int)), this, SLOT(setOpt(int)));
101 void OptComboBox::setOpt(int c
) {
102 m_opt
->setSelected(c
);
103 m_owner
->notifyChange();
106 OptColorButton::OptColorButton(boost::shared_ptr
<ColorOpt
> opt
, OptionWidget
*owner
, QWidget
*parent
)
107 : KColorButton(parent
)
110 setColor(m_opt
->value());
111 connect(this, SIGNAL(changed(const QColor
&)), this, SLOT(setOpt(const QColor
&)));
114 void OptColorButton::setOpt(const QColor
& c
) {
116 m_owner
->notifyChange();
119 OptFontRequester::OptFontRequester(boost::shared_ptr
<FontOpt
> opt
, OptionWidget
*owner
, QWidget
*parent
)
120 : KFontRequester(parent
)
123 setFont(m_opt
->value());
124 connect(this, SIGNAL(fontSelected(const QFont
&)), this, SLOT(setOpt(const QFont
&)));
127 void OptFontRequester::setOpt(const QFont
& f
) {
129 m_owner
->notifyChange();
132 OptionWidget::OptionWidget(const OptList
& options
, QWidget
* parent
)
134 , m_options(options
) {
135 setupOptionWidget(this, m_options
);
138 void OptionWidget::notifyChange() {
139 dump_options_list(m_options
);
140 emit
changed(m_options
);
143 void OptionWidget::setupOptionWidget(QWidget
* widget
, OptList
& options
, bool indent
) {
144 QGridLayout
*layout
= new QGridLayout(widget
);
147 layout
->setMargin(0);
149 int left
= indent
? 1 : 0;
150 int right
= indent
? 2 : 1;
152 for(int i
=0;i
<options
.size();i
++) {
153 OptPtr _o
= options
[i
];
154 if(boost::shared_ptr
<BoolOpt
> o
=
155 boost::dynamic_pointer_cast
<BoolOpt
,BaseOpt
>(_o
)) {
156 OptCheckBox
*cb
= new OptCheckBox(o
, this, widget
);
157 layout
->addWidget(cb
, lpos
++, left
, 1, 2);
158 if(o
->m_sub_options
.size()) {
159 QWidget
*w
= new QWidget(widget
);
160 setupOptionWidget(w
, o
->m_sub_options
, true);
161 w
->setEnabled(o
->value());
162 QObject::connect(cb
, SIGNAL(toggled(bool)), w
, SLOT(setEnabled(bool)));
163 layout
->addWidget(w
, lpos
++, left
, 1, 2);
166 else if(boost::shared_ptr
<SelectOpt
> o
=
167 boost::dynamic_pointer_cast
<SelectOpt
,BaseOpt
>(_o
)) {
168 QGroupBox
*gb
= new QGroupBox(o
->label(), widget
);
169 QVBoxLayout
*vbox
= new QVBoxLayout(gb
);
170 //vbox->setMargin(0);
171 for(int j
=0;j
<o
->m_options
.size();j
++) {
172 BoolOptPtr so
= o
->m_options
[j
];
173 OptRadioButton
*rb
= new OptRadioButton(o
, j
, this, gb
);
175 if(so
->m_sub_options
.size()) {
176 QWidget
*w
= new QWidget(widget
);
177 setupOptionWidget(w
, so
->m_sub_options
, true);
178 w
->setEnabled(so
->value());
179 QObject::connect(rb
, SIGNAL(toggled(bool)), w
, SLOT(setEnabled(bool)));
183 layout
->addWidget(gb
, lpos
++, left
, 1, 2);
185 else if(boost::shared_ptr
<IntOpt
> o
=
186 boost::dynamic_pointer_cast
<IntOpt
,BaseOpt
>(_o
)) {
187 layout
->addWidget(new QLabel(o
->label()), lpos
, left
);
188 OptSpinBox
*sb
= new OptSpinBox(o
, this, widget
);
189 layout
->addWidget(sb
, lpos
++, right
);
191 else if(boost::shared_ptr
<StringOpt
> o
=
192 boost::dynamic_pointer_cast
<StringOpt
,BaseOpt
>(_o
)) {
193 layout
->addWidget(new QLabel(o
->label()), lpos
, left
);
194 OptLineEdit
*ow
= new OptLineEdit(o
, this, widget
);
195 layout
->addWidget(ow
, lpos
++, right
);
197 else if(boost::shared_ptr
<UrlOpt
> o
=
198 boost::dynamic_pointer_cast
<UrlOpt
,BaseOpt
>(_o
)) {
199 layout
->addWidget(new QLabel(o
->label()), lpos
, left
);
200 OptUrlRequester
*ow
= new OptUrlRequester(o
, this, widget
);
201 layout
->addWidget(ow
, lpos
++, right
);
203 else if(boost::shared_ptr
<ComboOpt
> o
=
204 boost::dynamic_pointer_cast
<ComboOpt
,BaseOpt
>(_o
)) {
205 layout
->addWidget(new QLabel(o
->label()), lpos
, left
);
206 OptComboBox
*ow
= new OptComboBox(o
, this, widget
);
207 layout
->addWidget(ow
, lpos
++, right
);
209 else if(boost::shared_ptr
<ColorOpt
> o
=
210 boost::dynamic_pointer_cast
<ColorOpt
,BaseOpt
>(_o
)) {
211 layout
->addWidget(new QLabel(o
->label()), lpos
, left
);
212 OptColorButton
*ow
= new OptColorButton(o
, this, widget
);
213 layout
->addWidget(ow
, lpos
++, right
);
215 else if(boost::shared_ptr
<FontOpt
> o
=
216 boost::dynamic_pointer_cast
<FontOpt
,BaseOpt
>(_o
)) {
217 layout
->addWidget(new QLabel(o
->label()), lpos
, left
);
218 OptFontRequester
*ow
= new OptFontRequester(o
,this, widget
);
219 layout
->addWidget(ow
, lpos
++, right
);
222 std::cout
<< "OptionWidget::setupOptionWidget: Error, unknown option of type "
223 << prettyTypeName(typeid(*_o
).name()) << std::endl
;
228 layout
->addItem(new QSpacerItem(25, 1, QSizePolicy::Minimum
, QSizePolicy::Minimum
),
232 void dump_options_list(OptList
& options
, int indent
) {
233 if(!indent
)std::cout
<< "---- begin dump ----" << std::endl
;
234 for(int i
=0;i
<options
.size();i
++) {
235 OptPtr _o
= options
[i
];
236 if(boost::shared_ptr
<BoolOpt
> o
=
237 boost::dynamic_pointer_cast
<BoolOpt
,BaseOpt
>(_o
)) {
238 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
239 std::cout
<< (o
->value()?"[X]":"[ ]") << " " << o
->label() << std::endl
;
240 dump_options_list(o
->m_sub_options
, indent
+1);
242 else if(boost::shared_ptr
<IntOpt
> o
=
243 boost::dynamic_pointer_cast
<IntOpt
,BaseOpt
>(_o
)) {
244 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
245 std::cout
<< o
->label() << " |" << o
->value() << "|" << std::endl
;
247 else if(boost::shared_ptr
<StringOpt
> o
=
248 boost::dynamic_pointer_cast
<StringOpt
,BaseOpt
>(_o
)) {
249 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
250 std::cout
<< o
->label() << " [" << o
->value() << "]" << std::endl
;
252 else if(boost::shared_ptr
<UrlOpt
> o
=
253 boost::dynamic_pointer_cast
<UrlOpt
,BaseOpt
>(_o
)) {
254 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
255 std::cout
<< o
->label() << " {" << o
->value() << "}" << std::endl
;
257 else if(boost::shared_ptr
<ColorOpt
> o
=
258 boost::dynamic_pointer_cast
<ColorOpt
,BaseOpt
>(_o
)) {
259 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
260 std::cout
<< o
->label() << " {" << o
->value().name() << "}" << std::endl
;
262 else if(boost::shared_ptr
<FontOpt
> o
=
263 boost::dynamic_pointer_cast
<FontOpt
,BaseOpt
>(_o
)) {
264 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
265 std::cout
<< o
->label() << " {" << o
->value().toString() << "}" << std::endl
;
267 else if(boost::shared_ptr
<ComboOpt
> o
=
268 boost::dynamic_pointer_cast
<ComboOpt
,BaseOpt
>(_o
)) {
269 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
270 std::cout
<< "[combo] " << o
->label() << std::endl
;
271 for(int k
=0;k
<o
->m_values
.size();k
++) {
272 for(int j
=0;j
<indent
+1;j
++)std::cout
<< " ";
274 std::cout
<< " *<" << o
->m_values
[k
] << ">*" << std::endl
;
276 std::cout
<< " <" << o
->m_values
[k
] << ">" << std::endl
;
279 else if(boost::shared_ptr
<SelectOpt
> o
=
280 boost::dynamic_pointer_cast
<SelectOpt
,BaseOpt
>(_o
)) {
281 for(int j
=0;j
<indent
;j
++)std::cout
<< " ";
282 std::cout
<< "[group] " << o
->label() << std::endl
;
283 for(int j
=0;j
<o
->m_options
.size();j
++) {
284 BoolOptPtr so
= o
->m_options
[j
];
285 for(int j
=0;j
<indent
+1;j
++)std::cout
<< " ";
286 std::cout
<< (so
->value()?"(*)":"( )") << " " << so
->label() << std::endl
;
287 if(so
->m_sub_options
.size())
288 dump_options_list(so
->m_sub_options
, indent
+2);
292 std::cout
<< "dump_options_list: Error, unknown option of type "
293 << prettyTypeName(typeid(*_o
).name()) << std::endl
;
296 if(!indent
)std::cout
<< "---- end dump ----" << std::endl
;
299 bool options_list_load_from_settings(OptList
& options
, const Settings
& s
) {
301 for(int i
=0;i
<options
.size();i
++) {
302 OptPtr _o
= options
[i
];
303 if(boost::shared_ptr
<BoolOpt
> o
=
304 boost::dynamic_pointer_cast
<BoolOpt
,BaseOpt
>(_o
)) {
305 Settings bool_group
= s
.group(o
->name());
306 retv
|= options_list_load_from_settings(o
->m_sub_options
, bool_group
);
307 bool newval
= bool_group
.flag("value", o
->value());
308 retv
|= (newval
!= o
->value());
309 o
->setValue( newval
);
311 else if(boost::shared_ptr
<IntOpt
> o
=
312 boost::dynamic_pointer_cast
<IntOpt
,BaseOpt
>(_o
)) {
313 int newval
= s
[o
->name()] | o
->value();
314 retv
|= (newval
!= o
->value());
315 o
->setValue( newval
);
317 else if(boost::shared_ptr
<StringOpt
> o
=
318 boost::dynamic_pointer_cast
<StringOpt
,BaseOpt
>(_o
)) {
319 QString newval
= s
[o
->name()] | o
->value();
320 retv
|= (newval
!= o
->value());
321 o
->setValue( newval
);
323 else if(boost::shared_ptr
<UrlOpt
> o
=
324 boost::dynamic_pointer_cast
<UrlOpt
,BaseOpt
>(_o
)) {
325 QString newval
= s
[o
->name()] | o
->value();
326 retv
|= (newval
!= o
->value());
327 o
->setValue( newval
);
329 else if(boost::shared_ptr
<ColorOpt
> o
=
330 boost::dynamic_pointer_cast
<ColorOpt
,BaseOpt
>(_o
)) {
331 QColor newval
= s
[o
->name()] | o
->value();
332 retv
|= (newval
!= o
->value());
333 o
->setValue( newval
);
335 else if(boost::shared_ptr
<FontOpt
> o
=
336 boost::dynamic_pointer_cast
<FontOpt
,BaseOpt
>(_o
)) {
337 QFont newval
= s
[o
->name()] | o
->value();
338 retv
|= (newval
!= o
->value());
339 o
->setValue( newval
);
341 else if(boost::shared_ptr
<ComboOpt
> o
=
342 boost::dynamic_pointer_cast
<ComboOpt
,BaseOpt
>(_o
)) {
343 int newval
= s
[o
->name()] | o
->selected();
344 retv
|= (newval
!= o
->selected());
345 o
->setSelected( newval
);
347 else if(boost::shared_ptr
<SelectOpt
> o
=
348 boost::dynamic_pointer_cast
<SelectOpt
,BaseOpt
>(_o
)) {
350 for(int i
=0;i
<o
->m_options
.size();i
++)
351 l
<< o
->m_options
[i
];
352 Settings sel_group
= s
.group(o
->name());
353 retv
|= options_list_load_from_settings(l
, sel_group
.group("sel-options"));
354 int newval
= sel_group
["value"] | o
->selected();
355 retv
|= (newval
!= o
->selected());
356 o
->setSelected( newval
);
359 std::cout
<< "options_list_load_from_settings: Error, unknown option of type "
360 << prettyTypeName(typeid(*_o
).name()) << std::endl
;
366 void options_list_save_to_settings(const OptList
& options
, Settings s
) {
367 for(int i
=0;i
<options
.size();i
++) {
368 OptPtr _o
= options
[i
];
369 if(boost::shared_ptr
<BoolOpt
> o
=
370 boost::dynamic_pointer_cast
<BoolOpt
,BaseOpt
>(_o
)) {
371 Settings bool_group
= s
.group(o
->name());
372 options_list_save_to_settings(o
->m_sub_options
, bool_group
);
373 bool_group
.setFlag("value", o
->value());
375 else if(boost::shared_ptr
<IntOpt
> o
=
376 boost::dynamic_pointer_cast
<IntOpt
,BaseOpt
>(_o
)) {
377 s
[o
->name()] = o
->value();
379 else if(boost::shared_ptr
<StringOpt
> o
=
380 boost::dynamic_pointer_cast
<StringOpt
,BaseOpt
>(_o
)) {
381 s
[o
->name()] = o
->value();
383 else if(boost::shared_ptr
<UrlOpt
> o
=
384 boost::dynamic_pointer_cast
<UrlOpt
,BaseOpt
>(_o
)) {
385 s
[o
->name()] = o
->value();
387 else if(boost::shared_ptr
<ColorOpt
> o
=
388 boost::dynamic_pointer_cast
<ColorOpt
,BaseOpt
>(_o
)) {
389 s
[o
->name()] = o
->value();
391 else if(boost::shared_ptr
<FontOpt
> o
=
392 boost::dynamic_pointer_cast
<FontOpt
,BaseOpt
>(_o
)) {
393 s
[o
->name()] = o
->value();
395 else if(boost::shared_ptr
<ComboOpt
> o
=
396 boost::dynamic_pointer_cast
<ComboOpt
,BaseOpt
>(_o
)) {
397 s
[o
->name()] = o
->value();
399 else if(boost::shared_ptr
<SelectOpt
> o
=
400 boost::dynamic_pointer_cast
<SelectOpt
,BaseOpt
>(_o
)) {
402 for(int i
=0;i
<o
->m_options
.size();i
++)
403 l
<< o
->m_options
[i
];
404 Settings sel_group
= s
.group(o
->name());
405 options_list_save_to_settings(l
, sel_group
.group("sel-options"));
406 sel_group
["value"] = o
->value();
409 std::cout
<< "options_list_load_from_settings: Error, unknown option of type "
410 << prettyTypeName(typeid(*_o
).name()) << std::endl
;
415 #include "option.moc"
416 #include "option_p.moc"