]> cloud.milkyroute.net Git - dolphin.git/blob - src/settings/viewmodes/contentdisplaytab.cpp
Add setting to select filename eliding behavior
[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 , m_elideMiddle(nullptr)
35 , m_elideEnding(nullptr)
36 {
37 QFormLayout *topLayout = new QFormLayout(this);
38
39 // Sorting Order
40 m_naturalSorting = new QRadioButton(i18nc("option:radio", "Natural"));
41 m_caseInsensitiveSorting = new QRadioButton(i18nc("option:radio", "Alphabetical, case insensitive"));
42 m_caseSensitiveSorting = new QRadioButton(i18nc("option:radio", "Alphabetical, case sensitive"));
43
44 QButtonGroup *sortingOrderGroup = new QButtonGroup(this);
45 sortingOrderGroup->addButton(m_naturalSorting);
46 sortingOrderGroup->addButton(m_caseInsensitiveSorting);
47 sortingOrderGroup->addButton(m_caseSensitiveSorting);
48 topLayout->addRow(i18nc("@title:group", "Sorting mode: "), m_naturalSorting);
49 topLayout->addRow(QString(), m_caseInsensitiveSorting);
50 topLayout->addRow(QString(), m_caseSensitiveSorting);
51
52 #ifndef Q_OS_WIN
53 // Sorting properties
54 m_numberOfItems = new QRadioButton(i18nc("option:radio", "Show number of items"));
55 m_sizeOfContents = new QRadioButton(i18nc("option:radio", "Show size of contents, up to "));
56 m_noDirectorySize = new QRadioButton(i18nc("option:radio", "Show no size"));
57
58 QButtonGroup *sortingModeGroup = new QButtonGroup(this);
59 sortingModeGroup->addButton(m_numberOfItems);
60 sortingModeGroup->addButton(m_sizeOfContents);
61 sortingModeGroup->addButton(m_noDirectorySize);
62
63 m_recursiveDirectorySizeLimit = new QSpinBox();
64 connect(m_recursiveDirectorySizeLimit, &QSpinBox::valueChanged, this, [this](int value) {
65 m_recursiveDirectorySizeLimit->setSuffix(i18np(" level deep", " levels deep", value));
66 });
67 m_recursiveDirectorySizeLimit->setRange(1, 20);
68 m_recursiveDirectorySizeLimit->setSingleStep(1);
69
70 QHBoxLayout *contentsSizeLayout = new QHBoxLayout();
71 contentsSizeLayout->addWidget(m_sizeOfContents);
72 contentsSizeLayout->addWidget(m_recursiveDirectorySizeLimit);
73
74 topLayout->addRow(i18nc("@title:group", "Folder size:"), m_numberOfItems);
75 topLayout->addRow(QString(), contentsSizeLayout);
76 topLayout->addRow(QString(), m_noDirectorySize);
77 #endif
78
79 QDateTime thirtyMinutesAgo = QDateTime::currentDateTime().addSecs(-30 * 60);
80 QLocale local;
81 KFormat formatter(local);
82
83 m_useRelatetiveDates = new QRadioButton(
84 i18nc("option:radio as in relative date", "Relative (e.g. '%1')", formatter.formatRelativeDateTime(thirtyMinutesAgo, QLocale::ShortFormat)));
85 m_useShortDates =
86 new QRadioButton(i18nc("option:radio as in absolute date", "Absolute (e.g. '%1')", local.toString(thirtyMinutesAgo, QLocale::ShortFormat)));
87
88 QButtonGroup *dateFormatGroup = new QButtonGroup(this);
89 dateFormatGroup->addButton(m_useRelatetiveDates);
90 dateFormatGroup->addButton(m_useShortDates);
91
92 topLayout->addRow(i18nc("@title:group", "Date style:"), m_useRelatetiveDates);
93 topLayout->addRow(QString(), m_useShortDates);
94
95 m_useSymbolicPermissions = new QRadioButton(i18nc("option:radio as symbolic style ", "Symbolic (e.g. 'drwxr-xr-x')"));
96 m_useNumericPermissions = new QRadioButton(i18nc("option:radio as numeric style", "Numeric (Octal) (e.g. '755')"));
97 m_useCombinedPermissions = new QRadioButton(i18nc("option:radio as combined style", "Combined (e.g. 'drwxr-xr-x (755)')"));
98
99 topLayout->addRow(i18nc("@title:group", "Permissions style:"), m_useSymbolicPermissions);
100 topLayout->addRow(QString(), m_useNumericPermissions);
101 topLayout->addRow(QString(), m_useCombinedPermissions);
102
103 QButtonGroup *permissionsFormatGroup = new QButtonGroup(this);
104 permissionsFormatGroup->addButton(m_useSymbolicPermissions);
105 permissionsFormatGroup->addButton(m_useNumericPermissions);
106 permissionsFormatGroup->addButton(m_useCombinedPermissions);
107
108 m_elideMiddle = new QRadioButton(i18nc("@option:radio Long file names", "Elide in the middle (e.g. ’Some very… name.txt')"));
109 m_elideEnding = new QRadioButton(i18nc("@option:radio Long file names", "Elide at the end (e.g. ’Some very long….txt')"));
110
111 topLayout->addRow(i18nc("@title:group", "Long file names:"), m_elideMiddle);
112 topLayout->addRow(QString(), m_elideEnding);
113
114 QButtonGroup *elidingModeGroup = new QButtonGroup(this);
115 elidingModeGroup->addButton(m_elideMiddle);
116 elidingModeGroup->addButton(m_elideEnding);
117
118 #ifndef Q_OS_WIN
119 connect(m_recursiveDirectorySizeLimit, &QSpinBox::valueChanged, this, &SettingsPageBase::changed);
120 connect(m_numberOfItems, &QRadioButton::toggled, this, &SettingsPageBase::changed);
121 connect(m_sizeOfContents, &QRadioButton::toggled, this, [=, this]() {
122 m_recursiveDirectorySizeLimit->setEnabled(m_sizeOfContents->isChecked());
123 });
124 connect(m_noDirectorySize, &QRadioButton::toggled, this, &SettingsPageBase::changed);
125 #endif
126
127 connect(m_useRelatetiveDates, &QRadioButton::toggled, this, &SettingsPageBase::changed);
128 connect(m_useShortDates, &QRadioButton::toggled, this, &SettingsPageBase::changed);
129 connect(m_useSymbolicPermissions, &QRadioButton::toggled, this, &SettingsPageBase::changed);
130 connect(m_useNumericPermissions, &QRadioButton::toggled, this, &SettingsPageBase::changed);
131 connect(m_useCombinedPermissions, &QRadioButton::toggled, this, &SettingsPageBase::changed);
132 connect(m_naturalSorting, &QRadioButton::toggled, this, &SettingsPageBase::changed);
133 connect(m_caseInsensitiveSorting, &QRadioButton::toggled, this, &SettingsPageBase::changed);
134 connect(m_caseSensitiveSorting, &QRadioButton::toggled, this, &SettingsPageBase::changed);
135 connect(m_elideMiddle, &QRadioButton::toggled, this, &SettingsPageBase::changed);
136 connect(m_elideEnding, &QRadioButton::toggled, this, &SettingsPageBase::changed);
137
138 loadSettings();
139 }
140
141 void ContentDisplayTab::applySettings()
142 {
143 auto settings = ContentDisplaySettings::self();
144 #ifndef Q_OS_WIN
145 if (m_numberOfItems->isChecked()) {
146 settings->setDirectorySizeMode(ContentDisplaySettings::EnumDirectorySizeMode::ContentCount);
147 } else if (m_sizeOfContents->isChecked()) {
148 settings->setDirectorySizeMode(ContentDisplaySettings::EnumDirectorySizeMode::ContentSize);
149 } else if (m_noDirectorySize->isChecked()) {
150 settings->setDirectorySizeMode(ContentDisplaySettings::EnumDirectorySizeMode::None);
151 }
152
153 settings->setRecursiveDirectorySizeLimit(m_recursiveDirectorySizeLimit->value());
154 #endif
155 setSortingChoiceValue();
156 settings->setUseShortRelativeDates(m_useRelatetiveDates->isChecked());
157
158 if (m_useSymbolicPermissions->isChecked()) {
159 settings->setUsePermissionsFormat(ContentDisplaySettings::EnumUsePermissionsFormat::SymbolicFormat);
160 } else if (m_useNumericPermissions->isChecked()) {
161 settings->setUsePermissionsFormat(ContentDisplaySettings::EnumUsePermissionsFormat::NumericFormat);
162 } else if (m_useCombinedPermissions->isChecked()) {
163 settings->setUsePermissionsFormat(ContentDisplaySettings::EnumUsePermissionsFormat::CombinedFormat);
164 }
165 if (m_elideMiddle->isChecked()) {
166 settings->setElidingMode(ContentDisplaySettings::ElidingMode::Middle);
167 } else if (m_elideEnding->isChecked()) {
168 settings->setElidingMode(ContentDisplaySettings::ElidingMode::Right);
169 }
170 settings->save();
171 }
172
173 void ContentDisplayTab::loadSettings()
174 {
175 auto settings = ContentDisplaySettings::self();
176 #ifndef Q_OS_WIN
177 m_numberOfItems->setChecked(settings->directorySizeMode() == ContentDisplaySettings::EnumDirectorySizeMode::ContentCount);
178 m_sizeOfContents->setChecked(settings->directorySizeMode() == ContentDisplaySettings::EnumDirectorySizeMode::ContentSize);
179 m_noDirectorySize->setChecked(settings->directorySizeMode() == ContentDisplaySettings::EnumDirectorySizeMode::None);
180 m_recursiveDirectorySizeLimit->setValue(settings->recursiveDirectorySizeLimit());
181 #endif
182 m_useRelatetiveDates->setChecked(settings->useShortRelativeDates());
183 m_useShortDates->setChecked(!settings->useShortRelativeDates());
184 m_useSymbolicPermissions->setChecked(settings->usePermissionsFormat() == ContentDisplaySettings::EnumUsePermissionsFormat::SymbolicFormat);
185 m_useNumericPermissions->setChecked(settings->usePermissionsFormat() == ContentDisplaySettings::EnumUsePermissionsFormat::NumericFormat);
186 m_useCombinedPermissions->setChecked(settings->usePermissionsFormat() == ContentDisplaySettings::EnumUsePermissionsFormat::CombinedFormat);
187 loadSortingChoiceSettings();
188 m_elideMiddle->setChecked(settings->elidingMode() == ContentDisplaySettings::ElidingMode::Middle);
189 m_elideEnding->setChecked(settings->elidingMode() == ContentDisplaySettings::ElidingMode::Right);
190 }
191
192 void ContentDisplayTab::setSortingChoiceValue()
193 {
194 auto settings = GeneralSettings::self();
195 using Choice = GeneralSettings::EnumSortingChoice;
196 if (m_naturalSorting->isChecked()) {
197 settings->setSortingChoice(Choice::NaturalSorting);
198 } else if (m_caseInsensitiveSorting->isChecked()) {
199 settings->setSortingChoice(Choice::CaseInsensitiveSorting);
200 } else if (m_caseSensitiveSorting->isChecked()) {
201 settings->setSortingChoice(Choice::CaseSensitiveSorting);
202 }
203 }
204
205 void ContentDisplayTab::loadSortingChoiceSettings()
206 {
207 using Choice = GeneralSettings::EnumSortingChoice;
208 switch (GeneralSettings::sortingChoice()) {
209 case Choice::NaturalSorting:
210 m_naturalSorting->setChecked(true);
211 break;
212 case Choice::CaseInsensitiveSorting:
213 m_caseInsensitiveSorting->setChecked(true);
214 break;
215 case Choice::CaseSensitiveSorting:
216 m_caseSensitiveSorting->setChecked(true);
217 break;
218 default:
219 Q_UNREACHABLE();
220 }
221 }
222
223 void ContentDisplayTab::restoreDefaults()
224 {
225 auto settings = ContentDisplaySettings::self();
226 settings->useDefaults(true);
227 loadSettings();
228 settings->useDefaults(false);
229 }
230
231 #include "moc_contentdisplaytab.cpp"