00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "ConfigDialog.h"
00022
00023 #include <QSettings>
00024
00025 #include <ConfigDialog.moc>
00026
00027
00028 #define BOOL_TO_CHECKED(value) (value == true ? Qt::Checked : Qt::Unchecked)
00029 #define CHECKED_TO_BOOL(value) (value == Qt::Checked ? true : false)
00030
00031 #define CONFIG_PROPERTY_CHECKBOX_HANDLER(name, page, keyword) \
00032 const bool ConfigDialog::get##name() { \
00033 if (me) \
00034 return me->page->checkboxCache[#keyword].value; \
00035 else \
00036 return false; \
00037 } \
00038 \
00039 void ConfigDialog::set##name(bool value) { \
00040 if (me && !me->isVisible()) \
00041 me->page->checkboxCache[#keyword].value = value; \
00042 }
00043
00044
00045 #define TITLE_SPACING 10
00046 #define HORIZONTAL_STRUT 700
00047
00048 namespace Aseba
00049 {
00050 CONFIG_PROPERTY_CHECKBOX_HANDLER(ShowLineNumbers, generalpage, showlinenumbers )
00051 CONFIG_PROPERTY_CHECKBOX_HANDLER(ShowHidden, generalpage, showhidden )
00052 CONFIG_PROPERTY_CHECKBOX_HANDLER(ShowKeywordToolbar, generalpage, keywordToolbar )
00053 CONFIG_PROPERTY_CHECKBOX_HANDLER(ShowMemoryUsage, generalpage, memoryusage )
00054 CONFIG_PROPERTY_CHECKBOX_HANDLER(AutoCompletion, editorpage, autoKeyword )
00055
00056
00057 ConfigPage::ConfigPage(QString title, QWidget *parent):
00058 QWidget(parent)
00059 {
00060 QLabel* myTitle = new QLabel(title);
00061
00062 myTitle->setAlignment(Qt::AlignCenter);
00063 QFont current = myTitle->font();
00064 current.setBold(true);
00065 myTitle->setFont(current);
00066
00067 mainLayout = new QVBoxLayout();
00068 mainLayout->addWidget(myTitle);
00069 mainLayout->addSpacing(TITLE_SPACING);
00070 mainLayout->addStrut(HORIZONTAL_STRUT);
00071 setLayout(mainLayout);
00072 }
00073
00074 QCheckBox* ConfigPage::newCheckbox(QString label, QString ID, bool checked)
00075 {
00076 QCheckBox* widget = new QCheckBox(label);
00077 widget->setCheckState(BOOL_TO_CHECKED(checked));
00078 WidgetCache<bool> cache(widget, checked);
00079 checkboxCache.insert(std::pair<QString, WidgetCache<bool> >(ID, cache));
00080 connect(widget, SIGNAL(released()), ConfigDialog::getInstance(), SLOT(flushCache()));
00081 connect(widget, SIGNAL(released()), ConfigDialog::getInstance(), SIGNAL(settingsChanged()));
00082 return widget;
00083 }
00084
00085 void ConfigPage::readSettings()
00086 {
00087
00088 QSettings settings;
00089
00090 for (std::map<QString, WidgetCache<bool> >::iterator it = checkboxCache.begin(); it != checkboxCache.end(); it++)
00091 {
00092 QString name = it->first;
00093 QCheckBox* checkbox = dynamic_cast<QCheckBox*>((it->second).widget);
00094 Q_ASSERT(checkbox);
00095 if (settings.contains(name))
00096 {
00097 bool value = settings.value(name, false).toBool();
00098 checkbox->setCheckState(BOOL_TO_CHECKED(value));
00099 (it->second).value = value;
00100 }
00101 }
00102 }
00103
00104 void ConfigPage::writeSettings()
00105 {
00106
00107 QSettings settings;
00108
00109 for (std::map<QString, WidgetCache<bool> >::iterator it = checkboxCache.begin(); it != checkboxCache.end(); it++)
00110 {
00111 QString name = it->first;
00112 QCheckBox* checkbox = dynamic_cast<QCheckBox*>((it->second).widget);
00113 Q_ASSERT(checkbox);
00114 Q_UNUSED(checkbox);
00115 settings.setValue(name, (it->second).value);
00116 }
00117 }
00118
00119 void ConfigPage::saveState()
00120 {
00121
00122 checkboxCacheSave = checkboxCache;
00123 }
00124
00125 void ConfigPage::flushCache()
00126 {
00127
00128
00129 for (std::map<QString, WidgetCache<bool> >::iterator it = checkboxCache.begin(); it != checkboxCache.end(); it++)
00130 {
00131 QCheckBox* checkbox = dynamic_cast<QCheckBox*>((it->second).widget);
00132 Q_ASSERT(checkbox);
00133 (it->second).value = CHECKED_TO_BOOL(checkbox->checkState());
00134 }
00135 }
00136
00137 void ConfigPage::discardChanges()
00138 {
00139
00140 checkboxCache = checkboxCacheSave;
00141
00142 reloadFromCache();
00143 }
00144
00145 void ConfigPage::reloadFromCache()
00146 {
00147
00148 for (std::map<QString, WidgetCache<bool> >::iterator it = checkboxCache.begin(); it != checkboxCache.end(); it++)
00149 {
00150 QCheckBox* checkbox = dynamic_cast<QCheckBox*>((it->second).widget);
00151 Q_ASSERT(checkbox);
00152 checkbox->setCheckState(BOOL_TO_CHECKED((it->second).value));
00153 }
00154 }
00155
00156
00157
00158 GeneralPage::GeneralPage(QWidget *parent):
00159 ConfigPage(tr("General Setup"), parent)
00160 {
00161 QGroupBox* gb1 = new QGroupBox(tr("Layout"));
00162 QVBoxLayout* gb1layout = new QVBoxLayout();
00163 gb1->setLayout(gb1layout);
00164 mainLayout->addWidget(gb1);
00165
00166 gb1layout->addWidget(newCheckbox(tr("Show keyword toolbar"), "keywordToolbar", true));
00167
00168 gb1layout->addWidget(newCheckbox(tr("Show memory usage"), "memoryusage", false));
00169
00170 gb1layout->addWidget(newCheckbox(tr("Show hidden variables"), "showhidden", false));
00171
00172 gb1layout->addWidget(newCheckbox(tr("Show line numbers"), "showlinenumbers", true));
00173
00174 mainLayout->addStretch();
00175 }
00176
00177 void GeneralPage::readSettings()
00178 {
00179 QSettings settings;
00180 settings.beginGroup("general-config");
00181 ConfigPage::readSettings();
00182 settings.endGroup();
00183 }
00184
00185 void GeneralPage::writeSettings()
00186 {
00187 QSettings settings;
00188 settings.beginGroup("general-config");
00189 ConfigPage::writeSettings();
00190 settings.endGroup();
00191 }
00192
00193
00194
00195 EditorPage::EditorPage(QWidget *parent):
00196 ConfigPage(tr("Editor Setup"), parent)
00197 {
00198
00199 QGroupBox* gb1 = new QGroupBox(tr("Autocompletion"));
00200 QVBoxLayout* gb1layout = new QVBoxLayout();
00201 gb1->setLayout(gb1layout);
00202 mainLayout->addWidget(gb1);
00203
00204 gb1layout->addWidget(newCheckbox(tr("Keywords"), "autoKeyword", true));
00205
00206 mainLayout->addStretch();
00207 }
00208
00209 void EditorPage::readSettings()
00210 {
00211 QSettings settings;
00212 settings.beginGroup("editor-config");
00213 ConfigPage::readSettings();
00214 settings.endGroup();
00215 }
00216
00217 void EditorPage::writeSettings()
00218 {
00219 QSettings settings;
00220 settings.beginGroup("editor-config");
00221 ConfigPage::writeSettings();
00222 settings.endGroup();
00223 }
00224
00225
00226
00227 void ConfigDialog::init(QWidget* parent)
00228 {
00229 if (!me)
00230 {
00231 me = new ConfigDialog(parent);
00232 me->setupWidgets();
00233 }
00234 }
00235
00236 void ConfigDialog::bye()
00237 {
00238 if (me)
00239 {
00240 delete me;
00241 me = NULL;
00242 }
00243 }
00244
00245 void ConfigDialog::showConfig()
00246 {
00247 me->setModal(true);
00248 me->reloadFromCache();
00249 me->saveState();
00250 me->show();
00251
00252 }
00253
00254 ConfigDialog* ConfigDialog::me = NULL;
00255
00256 ConfigDialog::ConfigDialog(QWidget* parent):
00257 QDialog(parent)
00258 {
00259 }
00260
00261 ConfigDialog::~ConfigDialog()
00262 {
00263 writeSettings();
00264 }
00265
00266 void ConfigDialog::setupWidgets()
00267 {
00268
00269 topicList = new QListWidget();
00270 topicList->setViewMode(QListView::IconMode);
00271 topicList->setIconSize(QSize(64, 64));
00272 topicList->setMovement(QListView::Static);
00273 topicList->setMaximumWidth(128);
00274 topicList->setGridSize(QSize(100, 100));
00275 topicList->setMinimumHeight(300);
00276
00277 QListWidgetItem* general = new QListWidgetItem(QIcon(":/images/exec.png"), tr("General"));
00278 general->setTextAlignment(Qt::AlignHCenter);
00279 topicList->addItem(general);
00280 QListWidgetItem* editor = new QListWidgetItem(QIcon(":/images/kedit.png"), tr("Editor"));
00281 editor->setTextAlignment(Qt::AlignHCenter);
00282 topicList->addItem(editor);
00283
00284
00285 configStack = new QStackedWidget();
00286 generalpage = new GeneralPage();
00287 configStack->addWidget(generalpage);
00288 editorpage = new EditorPage();
00289 configStack->addWidget(editorpage);
00290
00291 connect(topicList, SIGNAL(currentRowChanged(int)), configStack, SLOT(setCurrentIndex(int)));
00292 topicList->setCurrentRow(0);
00293
00294
00295 okButton = new QPushButton(tr("Ok"));
00296 cancelButton = new QPushButton(tr("Cancel"));
00297 connect(okButton, SIGNAL(clicked()), SLOT(accept()));
00298 connect(cancelButton, SIGNAL(clicked()), SLOT(reject()));
00299
00300
00301 QHBoxLayout* contentLayout = new QHBoxLayout();
00302 contentLayout->addWidget(topicList);
00303 contentLayout->addWidget(configStack);
00304
00305 QHBoxLayout* buttonLayout = new QHBoxLayout();
00306 buttonLayout->addStretch();
00307 buttonLayout->addWidget(okButton);
00308 buttonLayout->addWidget(cancelButton);
00309
00310 QVBoxLayout* mainLayout = new QVBoxLayout();
00311 mainLayout->addLayout(contentLayout);
00312 mainLayout->addLayout(buttonLayout);
00313
00314 setLayout(mainLayout);
00315 setWindowTitle(tr("Aseba Studio - Settings"));
00316
00317 readSettings();
00318 }
00319
00320 void ConfigDialog::saveState()
00321 {
00322
00323 for (int i = 0; i < configStack->count(); i++)
00324 {
00325 ConfigPage* config = dynamic_cast<ConfigPage*>(configStack->widget(i));
00326 if (config)
00327 config->saveState();
00328 }
00329 }
00330
00331 void ConfigDialog::reloadFromCache()
00332 {
00333
00334 for (int i = 0; i < configStack->count(); i++)
00335 {
00336 ConfigPage* config = dynamic_cast<ConfigPage*>(configStack->widget(i));
00337 if (config)
00338 config->reloadFromCache();
00339 }
00340 }
00341
00342 void ConfigDialog::accept()
00343 {
00344
00345 flushCache();
00346 QDialog::accept();
00347 }
00348
00349 void ConfigDialog::reject()
00350 {
00351
00352 for (int i = 0; i < configStack->count(); i++)
00353 {
00354 ConfigPage* config = dynamic_cast<ConfigPage*>(configStack->widget(i));
00355 if (config)
00356 config->discardChanges();
00357 }
00358
00359 emit settingsChanged();
00360 QDialog::reject();
00361 }
00362
00363 void ConfigDialog::flushCache()
00364 {
00365
00366 for (int i = 0; i < configStack->count(); i++)
00367 {
00368 ConfigPage* config = dynamic_cast<ConfigPage*>(configStack->widget(i));
00369 if (config)
00370 config->flushCache();
00371 }
00372 }
00373
00374 void ConfigDialog::readSettings()
00375 {
00376 for (int i = 0; i < configStack->count(); i++)
00377 {
00378 ConfigPage* config = dynamic_cast<ConfigPage*>(configStack->widget(i));
00379 if (config)
00380 config->readSettings();
00381 }
00382 }
00383
00384 void ConfigDialog::writeSettings()
00385 {
00386 for (int i = 0; i < configStack->count(); i++)
00387 {
00388 ConfigPage* config = dynamic_cast<ConfigPage*>(configStack->widget(i));
00389 if (config)
00390 config->writeSettings();
00391 }
00392 }
00393
00394 }
00395