]> cloud.milkyroute.net Git - dolphin.git/blob - src/views/dolphinitemlistview.cpp
Fix view mode-specific settings not always applying
[dolphin.git] / src / views / dolphinitemlistview.cpp
1 /*
2 * SPDX-FileCopyrightText: 2011 Peter Penz <peter.penz19@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "dolphinitemlistview.h"
8
9 #include "dolphin_compactmodesettings.h"
10 #include "dolphin_detailsmodesettings.h"
11 #include "dolphin_generalsettings.h"
12 #include "dolphin_iconsmodesettings.h"
13 #include "dolphinfileitemlistwidget.h"
14 #include "settings/viewmodes/viewmodesettings.h"
15 #include "zoomlevelinfo.h"
16
17 #include <KIO/PreviewJob>
18 #include <QtMath>
19
20
21 DolphinItemListView::DolphinItemListView(QGraphicsWidget* parent) :
22 KFileItemListView(parent),
23 m_zoomLevel(0)
24 {
25 updateFont();
26 updateGridSize();
27 }
28
29 DolphinItemListView::~DolphinItemListView()
30 {
31 writeSettings();
32 }
33
34 void DolphinItemListView::setZoomLevel(int level)
35 {
36 if (level < ZoomLevelInfo::minimumLevel()) {
37 level = ZoomLevelInfo::minimumLevel();
38 } else if (level > ZoomLevelInfo::maximumLevel()) {
39 level = ZoomLevelInfo::maximumLevel();
40 }
41
42 if (level == m_zoomLevel) {
43 return;
44 }
45
46 m_zoomLevel = level;
47
48 ViewModeSettings settings(itemLayout());
49 if (previewsShown()) {
50 const int previewSize = ZoomLevelInfo::iconSizeForZoomLevel(level);
51 settings.setPreviewSize(previewSize);
52 } else {
53 const int iconSize = ZoomLevelInfo::iconSizeForZoomLevel(level);
54 settings.setIconSize(iconSize);
55 }
56
57 updateGridSize();
58 }
59
60 int DolphinItemListView::zoomLevel() const
61 {
62 return m_zoomLevel;
63 }
64
65 void DolphinItemListView::setEnabledSelectionToggles(DolphinItemListView::SelectionTogglesEnabled selectionTogglesEnabled)
66 {
67 m_selectionTogglesEnabled = selectionTogglesEnabled;
68 switch (m_selectionTogglesEnabled) {
69 case True:
70 return setEnabledSelectionToggles(true);
71 case False:
72 return setEnabledSelectionToggles(false);
73 case FollowSetting:
74 return setEnabledSelectionToggles(GeneralSettings::showSelectionToggle());
75 }
76 }
77
78 void DolphinItemListView::readSettings()
79 {
80 // We load the settings for all view modes now because we don't load them when the view mode changes.
81 IconsModeSettings::self()->load();
82 CompactModeSettings::self()->load();
83 DetailsModeSettings::self()->load();
84
85 beginTransaction();
86
87 setEnabledSelectionToggles(m_selectionTogglesEnabled);
88 setHighlightEntireRow(itemLayoutHighlightEntireRow(itemLayout()));
89 setSupportsItemExpanding(itemLayoutSupportsItemExpanding(itemLayout()));
90
91 updateFont();
92 updateGridSize();
93
94 const KConfigGroup globalConfig(KSharedConfig::openConfig(), "PreviewSettings");
95 setEnabledPlugins(globalConfig.readEntry("Plugins", KIO::PreviewJob::defaultPlugins()));
96 setLocalFileSizePreviewLimit(globalConfig.readEntry("MaximumSize", 0));
97 endTransaction();
98 }
99
100 void DolphinItemListView::writeSettings()
101 {
102 IconsModeSettings::self()->save();
103 CompactModeSettings::self()->save();
104 DetailsModeSettings::self()->save();
105 }
106
107 KItemListWidgetCreatorBase* DolphinItemListView::defaultWidgetCreator() const
108 {
109 return new KItemListWidgetCreator<DolphinFileItemListWidget>();
110 }
111
112 bool DolphinItemListView::itemLayoutHighlightEntireRow(ItemLayout layout) const
113 {
114 return layout == DetailsLayout && DetailsModeSettings::highlightEntireRow();
115 }
116
117 bool DolphinItemListView::itemLayoutSupportsItemExpanding(ItemLayout layout) const
118 {
119 return layout == DetailsLayout && DetailsModeSettings::expandableFolders();
120 }
121
122 void DolphinItemListView::onItemLayoutChanged(ItemLayout current, ItemLayout previous)
123 {
124 setHeaderVisible(current == DetailsLayout);
125
126 updateFont();
127 updateGridSize();
128
129 KFileItemListView::onItemLayoutChanged(current, previous);
130 }
131
132 void DolphinItemListView::onPreviewsShownChanged(bool shown)
133 {
134 Q_UNUSED(shown)
135 updateGridSize();
136 }
137
138 void DolphinItemListView::onVisibleRolesChanged(const QList<QByteArray>& current,
139 const QList<QByteArray>& previous)
140 {
141 KFileItemListView::onVisibleRolesChanged(current, previous);
142 updateGridSize();
143 }
144
145 void DolphinItemListView::updateFont()
146 {
147 const ViewModeSettings settings(itemLayout());
148
149 if (settings.useSystemFont()) {
150 KItemListView::updateFont();
151 } else {
152 QFont font(settings.viewFont());
153
154 KItemListStyleOption option = styleOption();
155 option.font = font;
156 option.fontMetrics = QFontMetrics(font);
157
158 setStyleOption(option);
159 }
160 }
161
162 void DolphinItemListView::updateGridSize()
163 {
164 const ViewModeSettings settings(itemLayout());
165
166 // Calculate the size of the icon
167 const int iconSize = previewsShown() ? settings.previewSize() : settings.iconSize();
168 m_zoomLevel = ZoomLevelInfo::zoomLevelForIconSize(QSize(iconSize, iconSize));
169 KItemListStyleOption option = styleOption();
170
171 const int padding = 2;
172 int horizontalMargin = 0;
173 int verticalMargin = 0;
174
175 // Calculate the item-width and item-height
176 int itemWidth;
177 int itemHeight;
178 int maxTextLines = 0;
179 int maxTextWidth = 0;
180
181 switch (itemLayout()) {
182 case KFileItemListView::IconsLayout: {
183
184 // an exponential factor based on zoom, 0 -> 1, 4 -> 1.36 8 -> ~1.85, 16 -> 3.4
185 auto zoomFactor = qExp(m_zoomLevel / 13.0);
186 // 9 is the average char width for 10pt Noto Sans, making fontFactor =1
187 // by each pixel the font gets larger the factor increases by 1/9
188 auto fontFactor = option.fontMetrics.averageCharWidth() / 9.0;
189 itemWidth = 48 + IconsModeSettings::textWidthIndex() * 64 * fontFactor * zoomFactor;
190
191 if (itemWidth < iconSize + padding * 2 * zoomFactor) {
192 itemWidth = iconSize + padding * 2 * zoomFactor;
193 }
194
195 itemHeight = padding * 3 + iconSize + option.fontMetrics.lineSpacing();
196
197 horizontalMargin = 4;
198 verticalMargin = 8;
199 maxTextLines = IconsModeSettings::maximumTextLines();
200 break;
201 }
202 case KFileItemListView::CompactLayout: {
203 itemWidth = padding * 4 + iconSize + option.fontMetrics.height() * 5;
204 const int textLinesCount = visibleRoles().count();
205 itemHeight = padding * 2 + qMax(iconSize, textLinesCount * option.fontMetrics.lineSpacing());
206
207 if (CompactModeSettings::maximumTextWidthIndex() > 0) {
208 // A restriction is given for the maximum width of the text (0 means
209 // having no restriction)
210 maxTextWidth = option.fontMetrics.height() * 10 * CompactModeSettings::maximumTextWidthIndex();
211 }
212
213 horizontalMargin = 8;
214 break;
215 }
216 case KFileItemListView::DetailsLayout: {
217 itemWidth = -1;
218 itemHeight = padding * 2 + qMax(iconSize, option.fontMetrics.lineSpacing());
219 break;
220 }
221 default:
222 itemWidth = -1;
223 itemHeight = -1;
224 Q_ASSERT(false);
225 break;
226 }
227
228 // Apply the calculated values
229 option.padding = padding;
230 option.horizontalMargin = horizontalMargin;
231 option.verticalMargin = verticalMargin;
232 option.iconSize = iconSize;
233 option.maxTextLines = maxTextLines;
234 option.maxTextWidth = maxTextWidth;
235 beginTransaction();
236 setStyleOption(option);
237 setItemSize(QSizeF(itemWidth, itemHeight));
238 endTransaction();
239 }