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