File indexing completed on 2024-05-05 05:49:28

0001 /*
0002     SPDX-FileCopyrightText: 2010 Volker Lanz <vl@fidra.de>
0003     SPDX-FileCopyrightText: 2014-2020 Andrius Štikonas <andrius@stikonas.eu>
0004 
0005     SPDX-License-Identifier: GPL-3.0-or-later
0006 */
0007 
0008 #include "config/configureoptionsdialog.h"
0009 #include "config/generalpagewidget.h"
0010 #include "config/filesystemcolorspagewidget.h"
0011 #include "config/advancedpagewidget.h"
0012 
0013 #include <backend/corebackendmanager.h>
0014 
0015 #include <core/operationstack.h>
0016 
0017 #include <fs/filesystem.h>
0018 #include <fs/filesystemfactory.h>
0019 
0020 #include <util/helpers.h>
0021 #include "util/guihelpers.h"
0022 
0023 #include "ui_configurepagefilesystemcolors.h"
0024 
0025 #include <KLocalizedString>
0026 #include <KMessageBox>
0027 
0028 #include <QtGlobal>
0029 #include <QIcon>
0030 
0031 #include <config.h>
0032 
0033 ConfigureOptionsDialog::ConfigureOptionsDialog(QWidget* parent, const OperationStack& ostack, const QString& name) :
0034     KConfigDialog(parent, name, Config::self()),
0035     m_GeneralPageWidget(new GeneralPageWidget(this)),
0036     m_FileSystemColorsPageWidget(new FileSystemColorsPageWidget(this)),
0037     m_AdvancedPageWidget(new AdvancedPageWidget(this)),
0038     m_OperationStack(ostack)
0039 {
0040     setFaceType(List);
0041 
0042     addPage(&generalPageWidget(), xi18nc("@title:tab general application settings", "General"), QStringLiteral("partitionmanager"), i18n("General Settings"));
0043 
0044     connect(&generalPageWidget().comboDefaultFileSystem(), &QComboBox::activated, this, &ConfigureOptionsDialog::onComboDefaultFileSystemActivated);
0045     connect(generalPageWidget().radioButton, &QRadioButton::toggled, this, &ConfigureOptionsDialog::onShredSourceActivated);
0046 
0047     addPage(&fileSystemColorsPageWidget(), xi18nc("@title:tab", "File System Colors"), QStringLiteral("preferences-desktop-color"), i18n("File System Color Settings"));
0048 
0049     addPage(&advancedPageWidget(), xi18nc("@title:tab advanced application settings", "Advanced"), QStringLiteral("preferences-other"), i18n("Advanced Settings"));
0050 
0051     connect(&advancedPageWidget().comboBackend(), &QComboBox::activated, this, &ConfigureOptionsDialog::onComboDefaultFileSystemActivated);
0052 
0053     KConfigGroup kcg(KSharedConfig::openConfig(), QStringLiteral("configureOptionsDialogs"));
0054     restoreGeometry(kcg.readEntry<QByteArray>("Geometry", QByteArray()));
0055 }
0056 
0057 /** Destroys a ConfigureOptionsDialog instance */
0058 ConfigureOptionsDialog::~ConfigureOptionsDialog()
0059 {
0060     KConfigGroup kcg(KSharedConfig::openConfig(), QStringLiteral("configureOptionsDialog"));
0061     kcg.writeEntry("Geometry", saveGeometry());
0062 }
0063 
0064 void ConfigureOptionsDialog::updateSettings()
0065 {
0066     KConfigDialog::updateSettings();
0067 
0068     bool changed = false;
0069 
0070     if (generalPageWidget().defaultFileSystem() != static_cast<FileSystem::Type>(Config::defaultFileSystem())) {
0071         Config::setDefaultFileSystem(static_cast<int>(generalPageWidget().defaultFileSystem()));
0072         changed = true;
0073     }
0074 
0075     if (generalPageWidget().radioButton->isChecked() != (Config::shredSource() == Config::EnumShredSource::random)) {
0076         qDebug() << "updateSettings: " << generalPageWidget().kcfg_shredSource->checkedId();
0077         Config::setShredSource(generalPageWidget().kcfg_shredSource->checkedId());
0078         changed = true;
0079     }
0080 
0081     if (advancedPageWidget().backend() != Config::backend()) {
0082         Config::setBackend(advancedPageWidget().backend());
0083         changed = true;
0084     }
0085 
0086     if (changed)
0087         Q_EMIT KConfigDialog::settingsChanged(i18n("General Settings"));
0088 }
0089 
0090 bool ConfigureOptionsDialog::hasChanged()
0091 {
0092     bool result = KConfigDialog::hasChanged();
0093 
0094     KConfigSkeletonItem* kcItem = Config::self()->findItem(QStringLiteral("defaultFileSystem"));
0095     result = result || !kcItem->isEqual(static_cast<int>(generalPageWidget().defaultFileSystem()));
0096     result = result || (generalPageWidget().kcfg_shredSource->checkedId() != Config::shredSource());
0097 
0098     if (advancedPageWidget().isVisible()) {
0099         kcItem = Config::self()->findItem(QStringLiteral("backend"));
0100         result = result || !kcItem->isEqual(advancedPageWidget().backend());
0101     }
0102 
0103     return result;
0104 }
0105 
0106 bool ConfigureOptionsDialog::isDefault()
0107 {
0108     bool result = KConfigDialog::isDefault();
0109 
0110     if (result) {
0111         const bool useDefaults = Config::self()->useDefaults(true);
0112         result = !hasChanged();
0113         Config::self()->useDefaults(useDefaults);
0114     }
0115 
0116     return result;
0117 }
0118 
0119 void ConfigureOptionsDialog::updateWidgetsDefault()
0120 {
0121     bool useDefaults = Config::self()->useDefaults(true);
0122     generalPageWidget().setDefaultFileSystem(GuiHelpers::defaultFileSystem());
0123     generalPageWidget().radioButton->setChecked(true);
0124 
0125     if (advancedPageWidget().isVisible())
0126         advancedPageWidget().setBackend(CoreBackendManager::defaultBackendName());
0127 
0128     Config::self()->useDefaults(useDefaults);
0129 }
0130 
0131 void ConfigureOptionsDialog::onComboBackendActivated(int)
0132 {
0133     Q_ASSERT(advancedPageWidget().isVisible());
0134 
0135     if (operationStack().size() == 0 || KMessageBox::warningContinueCancel(this,
0136             xi18nc("@info",
0137                    "<para>Do you really want to change the backend?</para>"
0138                    "<para><warning>This will also rescan devices and thus clear the list of pending operations.</warning></para>"),
0139             xi18nc("@title:window", "Really Change Backend?"),
0140             KGuiItem(xi18nc("@action:button", "Change the Backend"), QStringLiteral("arrow-right")),
0141             KGuiItem(xi18nc("@action:button", "Do Not Change the Backend"), QStringLiteral("dialog-cancel")), QStringLiteral("reallyChangeBackend")) == KMessageBox::Continue) {
0142         settingsChangedSlot();
0143     } else
0144         advancedPageWidget().setBackend(CoreBackendManager::defaultBackendName());
0145 }