X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsettingsdlg.cpp;h=7e1c2c8f91448f99a8ae1fbc10ae5b95f647092c;hp=420648223536f1ec1b65bc8f9097d0091ee419e2;hb=c1cf157116de7fc3da96203aa6f03c38c7ebb650;hpb=9fd4619e9aca7d53d7c5df156a0b25956a1bf682 diff --git a/src/qtui/settingsdlg.cpp b/src/qtui/settingsdlg.cpp index 42064822..7e1c2c8f 100644 --- a/src/qtui/settingsdlg.cpp +++ b/src/qtui/settingsdlg.cpp @@ -1,11 +1,11 @@ /*************************************************************************** - * Copyright (C) 2005-07 by The Quassel Team * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * + * (at your option) version 3. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * @@ -15,75 +15,227 @@ * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include "settingsdlg.h" -SettingsDlg::SettingsDlg(QWidget *parent) : QDialog(parent) { - ui.setupUi(this); +#include +#include - ui.settingsFrame->setWidgetResizable(true); - ui.settingsFrame->setWidget(ui.settingsStack); - ui.settingsTree->setRootIsDecorated(false); +#include "client.h" +#include "icon.h" - connect(ui.settingsTree, SIGNAL(itemSelectionChanged()), this, SLOT(itemSelected())); - connect(ui.buttonBox, SIGNAL(clicked(QAbstractButton *)), this, SLOT(buttonClicked(QAbstractButton *))); +SettingsDlg::SettingsDlg(QWidget* parent) + : QDialog(parent) +{ + ui.setupUi(this); + setModal(true); + setAttribute(Qt::WA_DeleteOnClose, true); + setWindowIcon(icon::get("configure")); + + updateGeometry(); + + ui.settingsTree->setRootIsDecorated(false); + + connect(ui.settingsTree, &QTreeWidget::itemSelectionChanged, this, &SettingsDlg::itemSelected); + connect(ui.buttonBox, &QDialogButtonBox::clicked, this, &SettingsDlg::buttonClicked); + + connect(Client::instance(), &Client::coreConnectionStateChanged, this, &SettingsDlg::coreConnectionStateChanged); + + setButtonStates(); +} + +void SettingsDlg::coreConnectionStateChanged() +{ + for (int i = 0; i < ui.settingsTree->topLevelItemCount(); i++) { + QTreeWidgetItem* catItem = ui.settingsTree->topLevelItem(i); + for (int j = 0; j < catItem->childCount(); j++) { + QTreeWidgetItem* item = catItem->child(j); + setItemState(item); + } + setItemState(catItem); + } +} + +void SettingsDlg::setItemState(QTreeWidgetItem* item) +{ + auto* sp = qobject_cast(item->data(0, SettingsPageRole).value()); + Q_ASSERT(sp); + bool disabledDueToConnection = !Client::isConnected() && sp->needsCoreConnection(); + bool disabledDueToOwnChoice = !sp->isSelectable(); + item->setDisabled(disabledDueToConnection || disabledDueToOwnChoice); +} + +void SettingsDlg::registerSettingsPage(SettingsPage* sp) +{ + sp->setParent(ui.settingsStack); + ui.settingsStack->addWidget(sp); + + connect(sp, &SettingsPage::changed, this, &SettingsDlg::setButtonStates); + + QTreeWidgetItem* cat; + QList cats = ui.settingsTree->findItems(sp->category(), Qt::MatchExactly); + if (!cats.count()) { + cat = new QTreeWidgetItem(ui.settingsTree, QStringList(sp->category())); + cat->setExpanded(true); + cat->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + } + else { + cat = cats[0]; + } + + QTreeWidgetItem* item; + if (sp->title().isEmpty()) + item = cat; + else + item = new QTreeWidgetItem(cat, QStringList(sp->title())); + + item->setData(0, SettingsPageRole, QVariant::fromValue(sp)); + pageIsLoaded[sp] = false; + if (!ui.settingsTree->selectedItems().count()) + ui.settingsTree->setCurrentItem(item); + + setItemState(item); } -void SettingsDlg::registerSettingsPage(SettingsPage *sp) { - QWidget *w = sp->widget(); - w->setParent(this); - ui.settingsStack->addWidget(w); - - QTreeWidgetItem *cat; - QList cats = ui.settingsTree->findItems(sp->category(), Qt::MatchExactly); - if(!cats.count()) { - cat = new QTreeWidgetItem(ui.settingsTree, QStringList(sp->category())); - cat->setExpanded(true); - cat->setFlags(Qt::ItemIsEnabled); - } else cat = cats[0]; - QTreeWidgetItem *p = new QTreeWidgetItem(cat, QStringList(sp->title())); - pages[QString("%1$%2").arg(sp->category()).arg(sp->title())] = sp; +void SettingsDlg::selectPage(SettingsPage* sp) +{ + if (!sp) { + _currentPage = nullptr; + ui.settingsStack->setCurrentIndex(0); + ui.pageTitle->setText(tr("Settings")); + return; + } + + if (!pageIsLoaded[sp]) { + sp->load(); + pageIsLoaded[sp] = true; + } + + if (sp != currentPage() && currentPage() != nullptr && currentPage()->hasChanged()) { + int ret = QMessageBox:: + warning(this, + tr("Save changes"), + tr("There are unsaved changes on the current configuration page. Would you like to apply your changes now?"), + QMessageBox::Discard | QMessageBox::Save | QMessageBox::Cancel, + QMessageBox::Cancel); + if (ret == QMessageBox::Save) { + if (!applyChanges()) + sp = currentPage(); + } + else if (ret == QMessageBox::Discard) { + undoChanges(); + } + else + sp = currentPage(); + } + + if (sp != currentPage()) { + if (sp->title().isEmpty()) { + ui.pageTitle->setText(sp->category()); + setWindowTitle(tr("Configure %1").arg(sp->category())); + } + else { + ui.pageTitle->setText(sp->title()); + setWindowTitle(tr("Configure %1").arg(sp->title())); + } + + ui.settingsStack->setCurrentWidget(sp); + _currentPage = sp; + } + setButtonStates(); } -void SettingsDlg::selectPage(const QString &cat, const QString &title) { - QWidget *w = pages[QString("%1$%2").arg(cat).arg(title)]->widget(); - Q_ASSERT(w); - ui.settingsStack->setCurrentWidget(w); +void SettingsDlg::itemSelected() +{ + QList items = ui.settingsTree->selectedItems(); + SettingsPage* sp = nullptr; + if (!items.isEmpty()) { + sp = qobject_cast(items[0]->data(0, SettingsPageRole).value()); + } + selectPage(sp); } -void SettingsDlg::itemSelected() { - QList items = ui.settingsTree->selectedItems(); - if(!items.count()) { - return; - } else { - QTreeWidgetItem *parent = items[0]->parent(); - if(!parent) return; - QString cat = parent->text(0); - QString title = items[0]->text(0); - selectPage(cat, title); - } +void SettingsDlg::setButtonStates() +{ + SettingsPage* sp = currentPage(); + ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(sp && sp->hasChanged()); + ui.buttonBox->button(QDialogButtonBox::Reset)->setEnabled(sp && sp->hasChanged()); + ui.buttonBox->button(QDialogButtonBox::RestoreDefaults)->setEnabled(sp && sp->hasDefaults()); } -void SettingsDlg::buttonClicked(QAbstractButton *button) { - switch(ui.buttonBox->buttonRole(button)) { - case QDialogButtonBox::AcceptRole: - applyChanges(); - accept(); - break; - case QDialogButtonBox::ApplyRole: - applyChanges(); - break; - case QDialogButtonBox::RejectRole: - reject(); - break; +void SettingsDlg::buttonClicked(QAbstractButton* button) +{ + switch (ui.buttonBox->standardButton(button)) { + case QDialogButtonBox::Ok: + if (currentPage() && currentPage()->hasChanged()) { + if (applyChanges()) + accept(); + } + else + accept(); + break; + case QDialogButtonBox::Apply: + applyChanges(); + break; + case QDialogButtonBox::Cancel: + undoChanges(); + reject(); + break; + case QDialogButtonBox::Reset: + reload(); + break; + case QDialogButtonBox::RestoreDefaults: + loadDefaults(); + break; default: - break; - } + break; + } +} + +bool SettingsDlg::applyChanges() +{ + if (!currentPage()) + return false; + if (currentPage()->aboutToSave()) { + currentPage()->save(); + return true; + } + return false; +} + +void SettingsDlg::undoChanges() +{ + if (currentPage()) { + currentPage()->load(); + } +} + +void SettingsDlg::reload() +{ + if (!currentPage()) + return; + int ret = QMessageBox::question(this, + tr("Reload Settings"), + tr("Do you like to reload the settings, undoing your changes on this page?"), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::No); + if (ret == QMessageBox::Yes) { + currentPage()->load(); + } } -void SettingsDlg::applyChanges() { - //SettingsInterface *sp = qobject_cast(ui.settingsStack->currentWidget()); - //if(sp) sp->applyChanges(); +void SettingsDlg::loadDefaults() +{ + if (!currentPage()) + return; + int ret = QMessageBox::question(this, + tr("Restore Defaults"), + tr("Do you like to restore the default values for this page?"), + QMessageBox::RestoreDefaults | QMessageBox::Cancel, + QMessageBox::Cancel); + if (ret == QMessageBox::RestoreDefaults) { + currentPage()->defaults(); + } }