File indexing completed on 2024-05-12 04:45:35

0001 /*
0002     SnoreNotify is a Notification Framework based on Qt
0003     Copyright (C) 2015  Hannah von Reth <vonreth@kde.org>
0004 
0005     SnoreNotify is free software: you can redistribute it and/or modify
0006     it under the terms of the GNU Lesser General Public License as published by
0007     the Free Software Foundation, either version 3 of the License, or
0008     (at your option) any later version.
0009 
0010     SnoreNotify is distributed in the hope that it will be useful,
0011     but WITHOUT ANY WARRANTY; without even the implied warranty of
0012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0013     GNU Lesser General Public License for more details.
0014 
0015     You should have received a copy of the GNU Lesser General Public License
0016     along with SnoreNotify.  If not, see <http://www.gnu.org/licenses/>.
0017 */
0018 
0019 #include "settingsdialog.h"
0020 #include "ui_settingsdialog.h"
0021 #include "snore.h"
0022 #include "snore_p.h"
0023 #include "snoreconstants.h"
0024 #include "settings.h"
0025 
0026 #include <QTabWidget>
0027 #include <QCheckBox>
0028 
0029 using namespace Snore;
0030 
0031 SettingsDialog::SettingsDialog(QWidget *parent) :
0032     QWidget(parent),
0033     ui(new Ui::SettingsDialog)
0034 {
0035     ui->setupUi(this);
0036     initTabs();
0037 }
0038 
0039 SettingsDialog::~SettingsDialog()
0040 {
0041     delete ui;
0042 }
0043 
0044 void SettingsDialog::initTabs()
0045 {
0046     SnorePlugin::PluginTypes types = SnoreCore::instance().settingsValue(Snore::Constants::SettingsKeys::PluginTypes).value<SnorePlugin::PluginTypes>();
0047     if (types == SnorePlugin::None) {
0048         types = SnorePlugin::All;
0049     }
0050     auto addWidgets = [&](QTabWidget * target, QWidget * container, SnorePlugin::PluginTypes type) {
0051         bool enabled = false;
0052         target->clear();
0053         if (types & type) {
0054             foreach(PluginSettingsWidget * widget, Settings::settingWidgets(type)) {
0055                 target->addTab(widget, widget->name());
0056                 m_tabs.append(widget);
0057                 enabled = true;
0058             }
0059         }
0060         if (enabled) {
0061             if (ui->tabWidget->indexOf(container) == -1) {
0062                 ui->tabWidget->addTab(container, container->property("TAB_NAME").toString());
0063             }
0064         } else {
0065             int index = ui->tabWidget->indexOf(container);
0066             container->setProperty("TAB_NAME", ui->tabWidget->tabText(index));
0067             ui->tabWidget->removeTab(index);
0068         }
0069     };
0070     addWidgets(ui->tabWidget_backends, ui->tab_backends, SnorePlugin::Backend);
0071     addWidgets(ui->tabWidget_secondary_backends, ui->tab_secondaryBackends, SnorePlugin::SecondaryBackend);
0072     addWidgets(ui->tabWidget_frontends, ui->tab_frontends,  SnorePlugin::Frontend);
0073     addWidgets(ui->tabWidget_plugins, ui->tab_plugins, SnorePlugin::Plugin);
0074 
0075     ui->errorLabel->setVisible(false);
0076     ui->errorLineEdit->setVisible(false);
0077 
0078     connect(&SnoreCore::instance(), &SnoreCore::primaryNotificationBackendChanged, this, &SettingsDialog::loadPrimaryBackendBox);
0079     connect(&SnoreCore::instance(), &SnoreCore::primaryNotificationBackendError, [this](const QString & error) {
0080         ui->errorLabel->setVisible(true);
0081         ui->errorLineEdit->setVisible(true);
0082         ui->errorLineEdit->setText(error);
0083     });
0084 }
0085 
0086 void SettingsDialog::on_pushButton_clicked()
0087 {
0088     SnoreCore::instance().displayExampleNotification();
0089 }
0090 
0091 void SettingsDialog::load()
0092 {
0093     qCDebug(SNORE) << "loading";
0094     loadPrimaryBackendBox(SnoreCore::instance().settingsValue(Snore::Constants::SettingsKeys::PrimaryBackend).toString());
0095     ui->timeoutSpinBox->setValue(SnoreCore::instance().settingsValue(Snore::Constants::SettingsKeys::Timeout).toInt());
0096     ui->disableNotificationSoundCheckBox->setChecked(SnoreCore::instance().settingsValue(Snore::Constants::SettingsKeys::Silent).toBool());
0097     foreach(auto widget, m_tabs) {
0098         widget->loadSettings();
0099     }
0100 }
0101 
0102 void SettingsDialog::loadPrimaryBackendBox(const QString &backend)
0103 {
0104     if (SnoreCore::instance().settingsValue(Snore::Constants::SettingsKeys::PluginTypes).value<SnorePlugin::PluginTypes>() & SnorePlugin::Backend) {
0105         ui->primaryBackendComboBox->clear();
0106         QStringList list = SnoreCore::instance().pluginNames(SnorePlugin::Backend);
0107         ui->primaryBackendComboBox->addItems(list);
0108         ui->primaryBackendComboBox->setCurrentIndex(list.indexOf(backend));
0109         ui->primaryBackendComboBox->setVisible(true);
0110         ui->primaryBackendLabel->setVisible(true);
0111     } else {
0112         ui->primaryBackendComboBox->setVisible(false);
0113         ui->primaryBackendLabel->setVisible(false);
0114     }
0115 }
0116 
0117 void SettingsDialog::save()
0118 {
0119     qCDebug(SNORE) << "saving";
0120     bool dirty = false;
0121     foreach(auto w, m_tabs) {
0122         w->saveSettings();
0123         dirty |= w->isDirty();
0124     }
0125     dirty |= SnoreCore::instance().settingsValue(Snore::Constants::SettingsKeys::PrimaryBackend).toString() != ui->primaryBackendComboBox->currentText();
0126     dirty |= SnoreCore::instance().settingsValue(Snore::Constants::SettingsKeys::Timeout).toInt() != ui->timeoutSpinBox->value();
0127     dirty |= SnoreCore::instance().settingsValue(Snore::Constants::SettingsKeys::Silent).toBool() != ui->disableNotificationSoundCheckBox->isChecked();
0128 
0129     SnoreCore::instance().setSettingsValue(Snore::Constants::SettingsKeys::PrimaryBackend, ui->primaryBackendComboBox->currentText());
0130     SnoreCore::instance().setSettingsValue(Snore::Constants::SettingsKeys::Timeout, ui->timeoutSpinBox->value());
0131     SnoreCore::instance().setSettingsValue(Snore::Constants::SettingsKeys::Silent, ui->disableNotificationSoundCheckBox->isChecked());
0132 
0133     if (dirty) {
0134         SnoreCorePrivate::instance()->syncSettings();
0135     }
0136 }
0137 
0138 void SettingsDialog::setVisible(bool b)
0139 {
0140     if (b) {
0141         load();
0142     }
0143     QWidget::setVisible(b);
0144 }
0145 
0146 void SettingsDialog::accept()
0147 {
0148     save();
0149 }
0150 
0151 void SettingsDialog::reset()
0152 {
0153     load();
0154 }
0155