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