Cleaned up CrazyhouseMove.
[tagua/yd.git] / src / option.cpp
blob251970ad952793e2a873d618691f60b569fdc73e
1 /*
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.
9 */
11 #include <iostream>
12 #include <QGridLayout>
13 #include <QGroupBox>
14 #include <QHBoxLayout>
15 #include <QLabel>
16 #include <QVBoxLayout>
17 #include "settings.h"
18 #include "common.h"
19 #include "option.h"
20 #include "option_p.h"
22 OptCheckBox::OptCheckBox(boost::shared_ptr<BoolOpt> opt, OptionWidget *owner, QWidget *parent)
23 : QCheckBox(opt->label(), parent)
24 , m_owner(owner)
25 , m_opt(opt) {
26 setChecked(m_opt->value());
27 connect(this, SIGNAL(toggled(bool)), this, SLOT(setOpt(bool)));
30 void OptCheckBox::setOpt(bool b) {
31 m_opt->setValue(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)
37 , m_owner(owner)
38 , m_opt(opt)
39 , m_index(i) {
40 setChecked(m_opt->m_options[i]->value());
41 connect(this, SIGNAL(toggled(bool)), this, SLOT(setOpt(bool)));
44 void OptRadioButton::setOpt(bool b) {
45 if(b) {
46 m_opt->setSelected(m_index);
47 m_owner->notifyChange();
51 OptSpinBox::OptSpinBox(boost::shared_ptr<IntOpt> opt, OptionWidget *owner, QWidget *parent)
52 : QSpinBox(parent)
53 , m_owner(owner)
54 , m_opt(opt) {
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) {
62 m_opt->setValue(i);
63 m_owner->notifyChange();
66 OptLineEdit::OptLineEdit(boost::shared_ptr<StringOpt> opt, OptionWidget *owner, QWidget *parent)
67 : QLineEdit(parent)
68 , m_owner(owner)
69 , m_opt(opt) {
70 setText(m_opt->value());
71 connect(this, SIGNAL(textChanged(const QString&)), this, SLOT(setOpt(const QString&)));
74 void OptLineEdit::setOpt(const QString& s) {
75 m_opt->setValue(s);
76 m_owner->notifyChange();
79 OptUrlRequester::OptUrlRequester(boost::shared_ptr<UrlOpt> opt, OptionWidget *owner, QWidget *parent)
80 : KUrlRequester(parent)
81 , m_owner(owner)
82 , m_opt(opt) {
83 setUrl(m_opt->value());
84 connect(this, SIGNAL(urlSelected(const QString&)), this, SLOT(setOpt(const QString&)));
87 void OptUrlRequester::setOpt(const QString& s) {
88 m_opt->setValue(s);
89 m_owner->notifyChange();
92 OptComboBox::OptComboBox(boost::shared_ptr<ComboOpt> opt, OptionWidget *owner, QWidget *parent)
93 : QComboBox(parent)
94 , m_owner(owner)
95 , m_opt(opt) {
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)
108 , m_owner(owner)
109 , m_opt(opt) {
110 setColor(m_opt->value());
111 connect(this, SIGNAL(changed(const QColor&)), this, SLOT(setOpt(const QColor&)));
114 void OptColorButton::setOpt(const QColor& c) {
115 m_opt->setValue(c);
116 m_owner->notifyChange();
119 OptFontRequester::OptFontRequester(boost::shared_ptr<FontOpt> opt, OptionWidget *owner, QWidget *parent)
120 : KFontRequester(parent)
121 , m_owner(owner)
122 , m_opt(opt) {
123 setFont(m_opt->value());
124 connect(this, SIGNAL(fontSelected(const QFont&)), this, SLOT(setOpt(const QFont&)));
127 void OptFontRequester::setOpt(const QFont& f) {
128 m_opt->setValue(f);
129 m_owner->notifyChange();
132 OptionWidget::OptionWidget(const OptList& options, QWidget* parent)
133 : 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);
146 if(indent)
147 layout->setMargin(0);
149 int left = indent ? 1 : 0;
150 int right = indent ? 2 : 1;
151 int lpos = 0;
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);
174 vbox->addWidget(rb);
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)));
180 vbox->addWidget(w);
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);
221 else {
222 std::cout << "OptionWidget::setupOptionWidget: Error, unknown option of type "
223 << prettyTypeName(typeid(*_o).name()) << std::endl;
227 if(indent)
228 layout->addItem(new QSpacerItem(25, 1, QSizePolicy::Minimum, QSizePolicy::Minimum),
229 0, 0, lpos, 1);
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 << " ";
273 if(k==o->selected())
274 std::cout << " *<" << o->m_values[k] << ">*" << std::endl;
275 else
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);
291 else {
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) {
300 bool retv = false;
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)) {
349 OptList l;
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 );
358 else {
359 std::cout << "options_list_load_from_settings: Error, unknown option of type "
360 << prettyTypeName(typeid(*_o).name()) << std::endl;
363 return retv;
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)) {
401 OptList l;
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();
408 else {
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"