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