]> cloud.milkyroute.net Git - dolphin.git/blob - src/settings/viewmodes/contentdisplaytab.cpp
Switch to C++20
[dolphin.git] / src / settings / viewmodes / contentdisplaytab.cpp
1 /*
2 * SPDX-FileCopyrightText: 2023 Méven Car <meven@kde.org>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "contentdisplaytab.h"
8 #include "dolphin_contentdisplaysettings.h"
9 #include "dolphin_generalsettings.h"
10
11 #include <KFormat>
12 #include <KLocalizedString>
13
14 #include <QButtonGroup>
15 #include <QFormLayout>
16 #include <QHBoxLayout>
17 #include <QRadioButton>
18 #include <QSpinBox>
19
20 ContentDisplayTab::ContentDisplayTab(QWidget *parent)
21 : SettingsPageBase(parent)
22 , m_naturalSorting(nullptr)
23 , m_caseSensitiveSorting(nullptr)
24 , m_caseInsensitiveSorting(nullptr)
25 , m_numberOfItems(nullptr)
26 , m_sizeOfContents(nullptr)
27 , m_noDirectorySize(nullptr)
28 , m_recursiveDirectorySizeLimit(nullptr)
29 , m_useRelatetiveDates(nullptr)
30 , m_useShortDates(nullptr)
31 , m_useSymbolicPermissions(nullptr)
32 , m_useNumericPermissions(nullptr)
33 , m_useCombinedPermissions(nullptr)
34 {
35 QFormLayout *topLayout = new QFormLayout(this);
36
37 // Sorting Order
38 m_naturalSorting = new QRadioButton(i18nc("option:radio", "Natural"));
39 m_caseInsensitiveSorting = new QRadioButton(i18nc("option:radio", "Alphabetical, case insensitive"));
40 m_caseSensitiveSorting = new QRadioButton(i18nc("option:radio", "Alphabetical, case sensitive"));
41
42 QButtonGroup *sortingOrderGroup = new QButtonGroup(this);
43 sortingOrderGroup->addButton(m_naturalSorting);
44 sortingOrderGroup->addButton(m_caseInsensitiveSorting);
45 sortingOrderGroup->addButton(m_caseSensitiveSorting);
46 topLayout->addRow(i18nc("@title:group", "Sorting mode: "), m_naturalSorting);
47 topLayout->addRow(QString(), m_caseInsensitiveSorting);
48 topLayout->addRow(QString(), m_caseSensitiveSorting);
49
50 #ifndef Q_OS_WIN
51 // Sorting properties
52 m_numberOfItems = new QRadioButton(i18nc("option:radio", "Show number of items"));
53 m_sizeOfContents = new QRadioButton(i18nc("option:radio", "Show size of contents, up to "));
54 m_noDirectorySize = new QRadioButton(i18nc("option:radio", "Show no size"));
55
56 QButtonGroup *sortingModeGroup = new QButtonGroup(this);
57 sortingModeGroup->addButton(m_numberOfItems);
58 sortingModeGroup->addButton(m_sizeOfContents);
59 sortingModeGroup->addButton(m_noDirectorySize);
60
61 m_recursiveDirectorySizeLimit = new QSpinBox();
62 connect(m_recursiveDirectorySizeLimit, &QSpinBox::valueChanged, this, [this](int value) {
63 m_recursiveDirectorySizeLimit->setSuffix(i18np(" level deep", " levels deep", value));
64 });
65 m_recursiveDirectorySizeLimit->setRange(1, 20);
66 m_recursiveDirectorySizeLimit->setSingleStep(1);
67
68 QHBoxLayout *contentsSizeLayout = new QHBoxLayout();
69 contentsSizeLayout->addWidget(m_sizeOfContents);
70 contentsSizeLayout->addWidget(m_recursiveDirectorySizeLimit);
71
72 topLayout->addRow(i18nc("@title:group", "Folder size:"), m_numberOfItems);
73 topLayout->addRow(QString(), contentsSizeLayout);
74 topLayout->addRow(QString(), m_noDirectorySize);
75 #endif
76
77 QDateTime thirtyMinutesAgo = QDateTime::currentDateTime().addSecs(-30 * 60);
78 QLocale local;
79 KFormat formatter(local);
80
81 m_useRelatetiveDates = new QRadioButton(
82 i18nc("option:radio as in relative date", "Relative (e.g. '%1')", formatter.formatRelativeDateTime(thirtyMinutesAgo, QLocale::ShortFormat)));
83 m_useShortDates =
84 new QRadioButton(i18nc("option:radio as in absolute date", "Absolute (e.g. '%1')", local.toString(thirtyMinutesAgo, QLocale::ShortFormat)));
85
86 QButtonGroup *dateFormatGroup = new QButtonGroup(this);
87 dateFormatGroup->addButton(m_useRelatetiveDates);
88 dateFormatGroup->addButton(m_useShortDates);
89
90 topLayout->addRow(i18nc("@title:group", "Date style:"), m_useRelatetiveDates);
91 topLayout->addRow(QString(), m_useShortDates);
92
93 m_useSymbolicPermissions = new QRadioButton(i18nc("option:radio as symbolic style ", "Symbolic (e.g. 'drwxr-xr-x')"));
94 m_useNumericPermissions = new QRadioButton(i18nc("option:radio as numeric style", "Numeric (Octal) (e.g. '755')"));
95 m_useCombinedPermissions = new QRadioButton(i18nc("option:radio as combined style", "Combined (e.g. 'drwxr-xr-x (755)')"));
96
97 topLayout->addRow(i18nc("@title:group", "Permissions style:"), m_useSymbolicPermissions);
98 topLayout->addRow(QString(), m_useNumericPermissions);
99 topLayout->addRow(QString(), m_useCombinedPermissions);
100
101 QButtonGroup *permissionsFormatGroup = new QButtonGroup(this);
102 permissionsFormatGroup->addButton(m_useSymbolicPermissions);
103 permissionsFormatGroup->addButton(m_useNumericPermissions);
104 permissionsFormatGroup->addButton(m_useCombinedPermissions);
105
106 #ifndef Q_OS_WIN
107 connect(m_recursiveDirectorySizeLimit, &QSpinBox::valueChanged, this, &SettingsPageBase::changed);
108 connect(m_numberOfItems, &QRadioButton::toggled, this, &SettingsPageBase::changed);
109 connect(m_sizeOfContents, &QRadioButton::toggled, this, [=, this]() {
110 m_recursiveDirectorySizeLimit->setEnabled(m_sizeOfContents->isChecked());
111 });
112 connect(m_noDirectorySize, &QRadioButton::toggled, this, &SettingsPageBase::changed);
113 #endif
114
115 connect(m_useRelatetiveDates, &QRadioButton::toggled, this, &SettingsPageBase::changed);
116 connect(m_useShortDates, &QRadioButton::toggled, this, &SettingsPageBase::changed);
117 connect(m_useSymbolicPermissions, &QRadioButton::toggled, this, &SettingsPageBase::changed);
118 connect(m_useNumericPermissions, &QRadioButton::toggled, this, &SettingsPageBase::changed);
119 connect(m_useCombinedPermissions, &QRadioButton::toggled, this, &SettingsPageBase::changed);
120 connect(m_naturalSorting, &QRadioButton::toggled, this, &SettingsPageBase::changed);
121 connect(m_caseInsensitiveSorting, &QRadioButton::toggled, this, &SettingsPageBase::changed);
122 connect(m_caseSensitiveSorting, &QRadioButton::toggled, this, &SettingsPageBase::changed);
123
124 loadSettings();
125 }
126
127 void ContentDisplayTab::applySettings()
128 {
129 auto settings = ContentDisplaySettings::self();
130 #ifndef Q_OS_WIN
131 if (m_numberOfItems->isChecked()) {
132 settings->setDirectorySizeMode(ContentDisplaySettings::EnumDirectorySizeMode::ContentCount);
133 } else if (m_sizeOfContents->isChecked()) {
134 settings->setDirectorySizeMode(ContentDisplaySettings::EnumDirectorySizeMode::ContentSize);
135 } else if (m_noDirectorySize->isChecked()) {
136 settings->setDirectorySizeMode(ContentDisplaySettings::EnumDirectorySizeMode::None);
137 }
138
139 settings->setRecursiveDirectorySizeLimit(m_recursiveDirectorySizeLimit->value());
140 #endif
141 setSortingChoiceValue();
142 settings->setUseShortRelativeDates(m_useRelatetiveDates->isChecked());
143
144 if (m_useSymbolicPermissions->isChecked()) {
145 settings->setUsePermissionsFormat(ContentDisplaySettings::EnumUsePermissionsFormat::SymbolicFormat);
146 } else if (m_useNumericPermissions->isChecked()) {
147 settings->setUsePermissionsFormat(ContentDisplaySettings::EnumUsePermissionsFormat::NumericFormat);
148 } else if (m_useCombinedPermissions->isChecked()) {
149 settings->setUsePermissionsFormat(ContentDisplaySettings::EnumUsePermissionsFormat::CombinedFormat);
150 }
151 settings->save();
152 }
153
154 void ContentDisplayTab::loadSettings()
155 {
156 auto settings = ContentDisplaySettings::self();
157 #ifndef Q_OS_WIN
158 m_numberOfItems->setChecked(settings->directorySizeMode() == ContentDisplaySettings::EnumDirectorySizeMode::ContentCount);
159 m_sizeOfContents->setChecked(settings->directorySizeMode() == ContentDisplaySettings::EnumDirectorySizeMode::ContentSize);
160 m_noDirectorySize->setChecked(settings->directorySizeMode() == ContentDisplaySettings::EnumDirectorySizeMode::None);
161 m_recursiveDirectorySizeLimit->setValue(settings->recursiveDirectorySizeLimit());
162 #endif
163 m_useRelatetiveDates->setChecked(settings->useShortRelativeDates());
164 m_useShortDates->setChecked(!settings->useShortRelativeDates());
165 m_useSymbolicPermissions->setChecked(settings->usePermissionsFormat() == ContentDisplaySettings::EnumUsePermissionsFormat::SymbolicFormat);
166 m_useNumericPermissions->setChecked(settings->usePermissionsFormat() == ContentDisplaySettings::EnumUsePermissionsFormat::NumericFormat);
167 m_useCombinedPermissions->setChecked(settings->usePermissionsFormat() == ContentDisplaySettings::EnumUsePermissionsFormat::CombinedFormat);
168 loadSortingChoiceSettings();
169 }
170
171 void ContentDisplayTab::setSortingChoiceValue()
172 {
173 auto settings = GeneralSettings::self();
174 using Choice = GeneralSettings::EnumSortingChoice;
175 if (m_naturalSorting->isChecked()) {
176 settings->setSortingChoice(Choice::NaturalSorting);
177 } else if (m_caseInsensitiveSorting->isChecked()) {
178 settings->setSortingChoice(Choice::CaseInsensitiveSorting);
179 } else if (m_caseSensitiveSorting->isChecked()) {
180 settings->setSortingChoice(Choice::CaseSensitiveSorting);
181 }
182 }
183
184 void ContentDisplayTab::loadSortingChoiceSettings()
185 {
186 using Choice = GeneralSettings::EnumSortingChoice;
187 switch (GeneralSettings::sortingChoice()) {
188 case Choice::NaturalSorting:
189 m_naturalSorting->setChecked(true);
190 break;
191 case Choice::CaseInsensitiveSorting:
192 m_caseInsensitiveSorting->setChecked(true);
193 break;
194 case Choice::CaseSensitiveSorting:
195 m_caseSensitiveSorting->setChecked(true);
196 break;
197 default:
198 Q_UNREACHABLE();
199 }
200 }
201
202 void ContentDisplayTab::restoreDefaults()
203 {
204 auto settings = ContentDisplaySettings::self();
205 settings->useDefaults(true);
206 loadSettings();
207 settings->useDefaults(false);
208 }
209
210 #include "moc_contentdisplaytab.cpp"