File indexing completed on 2024-05-12 17:18:54

0001 /*
0002  * SPDX-FileCopyrightText: 2023 Méven Car <meven@kde.org>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "contentdisplaytab.h"
0008 #include "dolphin_contentdisplaysettings.h"
0009 #include "dolphin_generalsettings.h"
0010 
0011 #include <KFormat>
0012 #include <KLocalizedString>
0013 
0014 #include <QButtonGroup>
0015 #include <QFormLayout>
0016 #include <QHBoxLayout>
0017 #include <QRadioButton>
0018 #include <QSpinBox>
0019 
0020 ContentDisplayTab::ContentDisplayTab(QWidget *parent)
0021     : SettingsPageBase(parent)
0022     , m_naturalSorting(nullptr)
0023     , m_caseSensitiveSorting(nullptr)
0024     , m_caseInsensitiveSorting(nullptr)
0025     , m_numberOfItems(nullptr)
0026     , m_sizeOfContents(nullptr)
0027     , m_recursiveDirectorySizeLimit(nullptr)
0028     , m_useRelatetiveDates(nullptr)
0029     , m_useShortDates(nullptr)
0030     , m_useSymbolicPermissions(nullptr)
0031     , m_useNumericPermissions(nullptr)
0032     , m_useCombinedPermissions(nullptr)
0033 {
0034     QFormLayout *topLayout = new QFormLayout(this);
0035 
0036     // Sorting Order
0037     m_naturalSorting = new QRadioButton(i18nc("option:radio", "Natural"));
0038     m_caseInsensitiveSorting = new QRadioButton(i18nc("option:radio", "Alphabetical, case insensitive"));
0039     m_caseSensitiveSorting = new QRadioButton(i18nc("option:radio", "Alphabetical, case sensitive"));
0040 
0041     QButtonGroup *sortingOrderGroup = new QButtonGroup(this);
0042     sortingOrderGroup->addButton(m_naturalSorting);
0043     sortingOrderGroup->addButton(m_caseInsensitiveSorting);
0044     sortingOrderGroup->addButton(m_caseSensitiveSorting);
0045     topLayout->addRow(i18nc("@title:group", "Sorting mode: "), m_naturalSorting);
0046     topLayout->addRow(QString(), m_caseInsensitiveSorting);
0047     topLayout->addRow(QString(), m_caseSensitiveSorting);
0048 
0049 #ifndef Q_OS_WIN
0050     // Sorting properties
0051     m_numberOfItems = new QRadioButton(i18nc("option:radio", "Number of items"));
0052     m_sizeOfContents = new QRadioButton(i18nc("option:radio", "Size of contents, up to "));
0053 
0054     QButtonGroup *sortingModeGroup = new QButtonGroup(this);
0055     sortingModeGroup->addButton(m_numberOfItems);
0056     sortingModeGroup->addButton(m_sizeOfContents);
0057 
0058     m_recursiveDirectorySizeLimit = new QSpinBox();
0059     connect(m_recursiveDirectorySizeLimit, &QSpinBox::valueChanged, this, [this](int value) {
0060         m_recursiveDirectorySizeLimit->setSuffix(i18np(" level deep", " levels deep", value));
0061     });
0062     m_recursiveDirectorySizeLimit->setRange(1, 20);
0063     m_recursiveDirectorySizeLimit->setSingleStep(1);
0064 
0065     QHBoxLayout *contentsSizeLayout = new QHBoxLayout();
0066     contentsSizeLayout->addWidget(m_sizeOfContents);
0067     contentsSizeLayout->addWidget(m_recursiveDirectorySizeLimit);
0068 
0069     topLayout->addRow(i18nc("@title:group", "Folder size displays:"), m_numberOfItems);
0070     topLayout->addRow(QString(), contentsSizeLayout);
0071 #endif
0072 
0073     QDateTime thirtyMinutesAgo = QDateTime::currentDateTime().addSecs(-30 * 60);
0074     QLocale local;
0075     KFormat formatter(local);
0076 
0077     m_useRelatetiveDates = new QRadioButton(
0078         i18nc("option:radio as in relative date", "Relative (e.g. '%1')", formatter.formatRelativeDateTime(thirtyMinutesAgo, QLocale::ShortFormat)));
0079     m_useShortDates =
0080         new QRadioButton(i18nc("option:radio as in absolute date", "Absolute (e.g. '%1')", local.toString(thirtyMinutesAgo, QLocale::ShortFormat)));
0081 
0082     QButtonGroup *dateFormatGroup = new QButtonGroup(this);
0083     dateFormatGroup->addButton(m_useRelatetiveDates);
0084     dateFormatGroup->addButton(m_useShortDates);
0085 
0086     topLayout->addRow(i18nc("@title:group", "Date style:"), m_useRelatetiveDates);
0087     topLayout->addRow(QString(), m_useShortDates);
0088 
0089     m_useSymbolicPermissions = new QRadioButton(i18nc("option:radio as symbolic style ", "Symbolic (e.g. 'drwxr-xr-x')"));
0090     m_useNumericPermissions = new QRadioButton(i18nc("option:radio as numeric style", "Numeric (Octal) (e.g. '755')"));
0091     m_useCombinedPermissions = new QRadioButton(i18nc("option:radio as combined style", "Combined (e.g. 'drwxr-xr-x (755)')"));
0092 
0093     topLayout->addRow(i18nc("@title:group", "Permissions style:"), m_useSymbolicPermissions);
0094     topLayout->addRow(QString(), m_useNumericPermissions);
0095     topLayout->addRow(QString(), m_useCombinedPermissions);
0096 
0097     QButtonGroup *permissionsFormatGroup = new QButtonGroup(this);
0098     permissionsFormatGroup->addButton(m_useSymbolicPermissions);
0099     permissionsFormatGroup->addButton(m_useNumericPermissions);
0100     permissionsFormatGroup->addButton(m_useCombinedPermissions);
0101 
0102 #ifndef Q_OS_WIN
0103     connect(m_recursiveDirectorySizeLimit, &QSpinBox::valueChanged, this, &SettingsPageBase::changed);
0104     connect(m_numberOfItems, &QRadioButton::toggled, this, &SettingsPageBase::changed);
0105     connect(m_sizeOfContents, &QRadioButton::toggled, this, [=]() {
0106         m_recursiveDirectorySizeLimit->setEnabled(m_sizeOfContents->isChecked());
0107     });
0108 #endif
0109 
0110     connect(m_useRelatetiveDates, &QRadioButton::toggled, this, &SettingsPageBase::changed);
0111     connect(m_useShortDates, &QRadioButton::toggled, this, &SettingsPageBase::changed);
0112     connect(m_useSymbolicPermissions, &QRadioButton::toggled, this, &SettingsPageBase::changed);
0113     connect(m_useNumericPermissions, &QRadioButton::toggled, this, &SettingsPageBase::changed);
0114     connect(m_useCombinedPermissions, &QRadioButton::toggled, this, &SettingsPageBase::changed);
0115     connect(m_naturalSorting, &QRadioButton::toggled, this, &SettingsPageBase::changed);
0116     connect(m_caseInsensitiveSorting, &QRadioButton::toggled, this, &SettingsPageBase::changed);
0117     connect(m_caseSensitiveSorting, &QRadioButton::toggled, this, &SettingsPageBase::changed);
0118 
0119     loadSettings();
0120 }
0121 
0122 void ContentDisplayTab::applySettings()
0123 {
0124     auto settings = ContentDisplaySettings::self();
0125 #ifndef Q_OS_WIN
0126     settings->setDirectorySizeCount(m_numberOfItems->isChecked());
0127     settings->setRecursiveDirectorySizeLimit(m_recursiveDirectorySizeLimit->value());
0128 #endif
0129     setSortingChoiceValue();
0130     settings->setUseShortRelativeDates(m_useRelatetiveDates->isChecked());
0131 
0132     if (m_useSymbolicPermissions->isChecked()) {
0133         settings->setUsePermissionsFormat(ContentDisplaySettings::EnumUsePermissionsFormat::SymbolicFormat);
0134     } else if (m_useNumericPermissions->isChecked()) {
0135         settings->setUsePermissionsFormat(ContentDisplaySettings::EnumUsePermissionsFormat::NumericFormat);
0136     } else if (m_useCombinedPermissions->isChecked()) {
0137         settings->setUsePermissionsFormat(ContentDisplaySettings::EnumUsePermissionsFormat::CombinedFormat);
0138     }
0139     settings->save();
0140 }
0141 
0142 void ContentDisplayTab::loadSettings()
0143 {
0144     auto settings = ContentDisplaySettings::self();
0145 #ifndef Q_OS_WIN
0146     if (settings->directorySizeCount()) {
0147         m_numberOfItems->setChecked(true);
0148         m_recursiveDirectorySizeLimit->setEnabled(false);
0149     } else {
0150         m_sizeOfContents->setChecked(true);
0151         m_recursiveDirectorySizeLimit->setEnabled(true);
0152     }
0153     m_recursiveDirectorySizeLimit->setValue(settings->recursiveDirectorySizeLimit());
0154 #endif
0155     m_useRelatetiveDates->setChecked(settings->useShortRelativeDates());
0156     m_useShortDates->setChecked(!settings->useShortRelativeDates());
0157     m_useSymbolicPermissions->setChecked(settings->usePermissionsFormat() == ContentDisplaySettings::EnumUsePermissionsFormat::SymbolicFormat);
0158     m_useNumericPermissions->setChecked(settings->usePermissionsFormat() == ContentDisplaySettings::EnumUsePermissionsFormat::NumericFormat);
0159     m_useCombinedPermissions->setChecked(settings->usePermissionsFormat() == ContentDisplaySettings::EnumUsePermissionsFormat::CombinedFormat);
0160     loadSortingChoiceSettings();
0161 }
0162 
0163 void ContentDisplayTab::setSortingChoiceValue()
0164 {
0165     auto settings = GeneralSettings::self();
0166     using Choice = GeneralSettings::EnumSortingChoice;
0167     if (m_naturalSorting->isChecked()) {
0168         settings->setSortingChoice(Choice::NaturalSorting);
0169     } else if (m_caseInsensitiveSorting->isChecked()) {
0170         settings->setSortingChoice(Choice::CaseInsensitiveSorting);
0171     } else if (m_caseSensitiveSorting->isChecked()) {
0172         settings->setSortingChoice(Choice::CaseSensitiveSorting);
0173     }
0174 }
0175 
0176 void ContentDisplayTab::loadSortingChoiceSettings()
0177 {
0178     using Choice = GeneralSettings::EnumSortingChoice;
0179     switch (GeneralSettings::sortingChoice()) {
0180     case Choice::NaturalSorting:
0181         m_naturalSorting->setChecked(true);
0182         break;
0183     case Choice::CaseInsensitiveSorting:
0184         m_caseInsensitiveSorting->setChecked(true);
0185         break;
0186     case Choice::CaseSensitiveSorting:
0187         m_caseSensitiveSorting->setChecked(true);
0188         break;
0189     default:
0190         Q_UNREACHABLE();
0191     }
0192 }
0193 
0194 void ContentDisplayTab::restoreDefaults()
0195 {
0196     auto settings = ContentDisplaySettings::self();
0197     settings->useDefaults(true);
0198     loadSettings();
0199     settings->useDefaults(false);
0200 }
0201 
0202 #include "moc_contentdisplaytab.cpp"