+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<SettingsPage *>(item->data(0, SettingsPageRole).value<QObject *>());
+ 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<QTreeWidgetItem *> 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<QObject *>(sp));
+ pageIsLoaded[sp] = false;
+ if (!ui.settingsTree->selectedItems().count())
+ ui.settingsTree->setCurrentItem(item);
+
+ setItemState(item);