23 #include "configurationdialog.h" 24 #include "ui_configurationdialog.h" 26 #include "configpage.h" 27 #include "qtmetapointer.h" 32 #include <QStandardItemModel> 33 #include <QStandardItem> 35 #include <QAbstractButton> 37 DClass<ConfigurationDialog> :
public Ui::ConfigurationDialog
49 QList<ConfigPage*> configPages;
52 QModelIndex findPageModelIndex(
const QModelIndex &rootIndex,
ConfigPage *page)
54 QStandardItemModel *model =
static_cast<QStandardItemModel*
>(tvOptionsList->model());
55 for (
int row = 0; row < model->rowCount(rootIndex); ++row)
57 QModelIndex index = model->index(row, COL_META, rootIndex);
58 ConfigPage *pageAtIndex = pageFromIndex(index);
59 if (pageAtIndex == page)
63 QModelIndex childIndex = findPageModelIndex(index, page);
64 if (childIndex.isValid())
72 ConfigPage *pageFromIndex(
const QModelIndex &index)
74 QModelIndex pageIndex = index.sibling(index.row(), COL_META);
76 void* pointer = metaPointer;
85 return QIcon(
":icons/exclamation_16.png");
99 QStandardItemModel *model =
new QStandardItemModel(
this);
101 column < PrivData<ConfigurationDialog>::COLSIZE; ++column)
103 model->setHorizontalHeaderItem(column,
new QStandardItem());
105 d->tvOptionsList->setModel(model);
107 #if QT_VERSION >= 0x050000 108 d->tvOptionsList->header()->setSectionResizeMode(
110 d->tvOptionsList->header()->setSectionResizeMode(
113 d->tvOptionsList->header()->setResizeMode(
115 d->tvOptionsList->header()->setResizeMode(
119 d->currentlyDisplayedPage = NULL;
120 connect(d->buttonBox, SIGNAL( clicked(QAbstractButton *) ),
this, SLOT ( btnClicked(QAbstractButton *) ));
121 this->connect(d->tvOptionsList->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)),
122 SLOT(switchToItem(QModelIndex, QModelIndex)));
125 ConfigurationDialog::~ConfigurationDialog()
127 for(
int i = 0; i < d->configPages.count(); ++i)
129 delete d->configPages[i];
134 QStandardItem* rootItem,
ConfigPage* configPage,
int position)
136 if (!canConfigPageBeAdded(configPage))
141 QStandardItemModel* pModel = (QStandardItemModel*)d->tvOptionsList->model();
142 if (rootItem == NULL)
144 rootItem = pModel->invisibleRootItem();
147 if (!this->hasItemOnList(rootItem))
152 QList<QStandardItem*> row;
154 QStandardItem* nameItem =
new QStandardItem(configPage->
name());
155 nameItem->setIcon(configPage->
icon());
160 nameItem->setData(qVariantFromValue(metaPointer), Qt::UserRole);
166 rootItem->appendRow(row);
170 rootItem->insertRow(position, row);
173 d->configPages << configPage;
174 this->connect(configPage, SIGNAL(validationRequested()),
175 SLOT(onPageValidationRequested()));
181 validatePage(configPage);
188 QStandardItemModel* pModel = (QStandardItemModel*)d->tvOptionsList->model();
189 if (rootItem == NULL)
191 rootItem = pModel->invisibleRootItem();
194 if (!this->hasItemOnList(rootItem))
200 QVariant variantMetaPointer = qVariantFromValue(metaPointer);
202 QList<QStandardItem*> row;
204 QStandardItem* nameItem =
new QStandardItem(label);
205 nameItem->setData(variantMetaPointer, Qt::UserRole);
211 rootItem->appendRow(row);
215 rootItem->insertRow(position, row);
221 void ConfigurationDialog::btnClicked(QAbstractButton *button)
224 switch(d->buttonBox->standardButton(button))
229 case QDialogButtonBox::Ok:
230 if (this->validate())
233 this->saveSettings();
237 case QDialogButtonBox::Apply:
238 if (this->validate())
240 this->saveSettings();
244 case QDialogButtonBox::Cancel:
250 bool ConfigurationDialog::canConfigPageBeAdded(
ConfigPage* configPage)
252 return isConfigPageValid(configPage) && !hasConfigPage(configPage);
255 QModelIndex ConfigurationDialog::findPageModelIndex(
ConfigPage *page)
257 QStandardItemModel *model =
static_cast<QStandardItemModel*
>(d->tvOptionsList->model());
258 return d->findPageModelIndex(model->indexFromItem(model->invisibleRootItem()), page);
261 bool ConfigurationDialog::isConfigPageValid(
ConfigPage* configPage)
263 return configPage != NULL && !configPage->
name().isEmpty();
266 bool ConfigurationDialog::hasConfigPage(
ConfigPage* configPage)
268 foreach (
ConfigPage* addedPage, d->configPages)
270 if (configPage == addedPage)
279 void ConfigurationDialog::keyPressEvent(QKeyEvent* e)
291 QDialog::keyPressEvent(e);
295 bool ConfigurationDialog::hasItemOnList(QStandardItem* pItem)
const 302 QStandardItemModel* pModel = (QStandardItemModel*)d->tvOptionsList->model();
307 return pModel->invisibleRootItem() == pItem
308 || pModel->indexFromItem(pItem).isValid();
311 void ConfigurationDialog::onPageValidationRequested()
314 assert(page != NULL);
318 void ConfigurationDialog::switchToItem(
const QModelIndex& current,
const QModelIndex &previous)
320 if (current.isValid() && current != previous)
322 ConfigPage* configPage = d->pageFromIndex(current);
326 if (isConfigPageValid(configPage))
335 return d->tvOptionsList;
338 void ConfigurationDialog::saveSettings()
341 for (
int i = 0; i < d->configPages.count(); ++i)
343 d->configPages[i]->save();
351 for (
int i = 0; i < d->configPages.count(); ++i)
353 d->configPages[i]->read();
354 validatePage(d->configPages[i]);
361 if (d->currentlyDisplayedPage != NULL)
363 validatePage(d->currentlyDisplayedPage);
364 d->currentlyDisplayedPage->hide();
365 d->mainPanel->setTitle(QString());
367 d->currentlyDisplayedPage = page;
373 d->mainPanel->layout()->addWidget(page);
374 d->mainPanel->setTitle(page->
title());
379 void ConfigurationDialog::validatePage(
ConfigPage *page)
381 assert(page != NULL);
382 QModelIndex pageIndex = findPageModelIndex(page);
383 assert(pageIndex.isValid());
386 assert(validationIndex.isValid());
388 QStandardItemModel *model =
static_cast<QStandardItemModel*
>(d->tvOptionsList->model());
389 QStandardItem *validationItem = model->itemFromIndex(validationIndex);
390 validationItem->setIcon(d->validationIcon(page->
validate()));
Validation
Result of validate()
QTreeView * optionsTree()
Returns pointer to the tree widget that contains configuration sections list.
virtual QString title() const
Page title, by default returns the same string as name().
virtual QIcon icon() const =0
Reimplement this to return a displayable icon for the ConfigPage.
virtual QStandardItem * addConfigPage(QStandardItem *rootItem, ConfigPage *configPage, int position=-1)
Adds a new configuration page to the options tree view.
void read()
Read configuration from persistence to page contents.
bool areSettingsAlreadyRead()
true if settings for this page have already been loaded at least once.
QStandardItem * addLabel(QStandardItem *rootItem, const QString &label, int position=-1)
Adds a label node to the options tree view.
void setAllowSave(bool b)
Change whether settings on this page can be stored in persisting configuration.
virtual QString name() const =0
Reimplement this to return a list-displayable name for this ConfigPage.
virtual Validation validate()
Validate settings on this page.
Validation detected at least one problem.
Base class for configuration pages.
void showConfigPage(ConfigPage *widget)