]> cloud.milkyroute.net Git - dolphin.git/blob - src/views/dolphinitemlistview.cpp
Remove unused includes
[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 ViewModeSettings settings(itemLayout());
81 settings.readConfig();
82
83 beginTransaction();
84
85 setEnabledSelectionToggles(m_selectionTogglesEnabled);
86 setHighlightEntireRow(DetailsModeSettings::sidePadding());
87 setSupportsItemExpanding(itemLayoutSupportsItemExpanding(itemLayout()));
88
89 updateFont();
90 updateGridSize();
91
92 const KConfigGroup globalConfig(KSharedConfig::openConfig(), "PreviewSettings");
93 setEnabledPlugins(globalConfig.readEntry("Plugins", KIO::PreviewJob::defaultPlugins()));
94 setLocalFileSizePreviewLimit(globalConfig.readEntry("MaximumSize", 0));
95 endTransaction();
96 }
97
98 void DolphinItemListView::writeSettings()
99 {
100 IconsModeSettings::self()->save();
101 CompactModeSettings::self()->save();
102 DetailsModeSettings::self()->save();
103 }
104
105 KItemListWidgetCreatorBase* DolphinItemListView::defaultWidgetCreator() const
106 {
107 return new KItemListWidgetCreator<DolphinFileItemListWidget>();
108 }
109
110 bool DolphinItemListView::itemLayoutSupportsItemExpanding(ItemLayout layout) const
111 {
112 return layout == DetailsLayout && DetailsModeSettings::expandableFolders();
113 }
114
115 void DolphinItemListView::onItemLayoutChanged(ItemLayout current, ItemLayout previous)
116 {
117 setHeaderVisible(current == DetailsLayout);
118
119 updateFont();
120 updateGridSize();
121
122 KFileItemListView::onItemLayoutChanged(current, previous);
123 }
124
125 void DolphinItemListView::onPreviewsShownChanged(bool shown)
126 {
127 Q_UNUSED(shown)
128 updateGridSize();
129 }
130
131 void DolphinItemListView::onVisibleRolesChanged(const QList<QByteArray>& current,
132 const QList<QByteArray>& previous)
133 {
134 KFileItemListView::onVisibleRolesChanged(current, previous);
135 updateGridSize();
136 }
137
138 void DolphinItemListView::updateFont()
139 {
140 const ViewModeSettings settings(itemLayout());
141
142 if (settings.useSystemFont()) {
143 KItemListView::updateFont();
144 } else {
145 QFont font(settings.viewFont());
146
147 KItemListStyleOption option = styleOption();
148 option.font = font;
149 option.fontMetrics = QFontMetrics(font);
150
151 setStyleOption(option);
152 }
153 }
154
155 void DolphinItemListView::updateGridSize()
156 {
157 const ViewModeSettings settings(itemLayout());
158
159 // Calculate the size of the icon
160 const int iconSize = previewsShown() ? settings.previewSize() : settings.iconSize();
161 m_zoomLevel = ZoomLevelInfo::zoomLevelForIconSize(QSize(iconSize, iconSize));
162 KItemListStyleOption option = styleOption();
163
164 const int padding = 2;
165 int horizontalMargin = 0;
166 int verticalMargin = 0;
167
168 // Calculate the item-width and item-height
169 int itemWidth;
170 int itemHeight;
171 int maxTextLines = 0;
172 int maxTextWidth = 0;
173
174 switch (itemLayout()) {
175 case KFileItemListView::IconsLayout: {
176
177 // an exponential factor based on zoom, 0 -> 1, 4 -> 1.36 8 -> ~1.85, 16 -> 3.4
178 auto zoomFactor = qExp(m_zoomLevel / 13.0);
179 // 9 is the average char width for 10pt Noto Sans, making fontFactor =1
180 // by each pixel the font gets larger the factor increases by 1/9
181 auto fontFactor = option.fontMetrics.averageCharWidth() / 9.0;
182 itemWidth = 48 + IconsModeSettings::textWidthIndex() * 64 * fontFactor * zoomFactor;
183
184 if (itemWidth < iconSize + padding * 2 * zoomFactor) {
185 itemWidth = iconSize + padding * 2 * zoomFactor;
186 }
187
188 itemHeight = padding * 3 + iconSize + option.fontMetrics.lineSpacing();
189
190 horizontalMargin = 4;
191 verticalMargin = 8;
192 maxTextLines = IconsModeSettings::maximumTextLines();
193 break;
194 }
195 case KFileItemListView::CompactLayout: {
196 itemWidth = padding * 4 + iconSize + option.fontMetrics.height() * 5;
197 const int textLinesCount = visibleRoles().count();
198 itemHeight = padding * 2 + qMax(iconSize, textLinesCount * option.fontMetrics.lineSpacing());
199
200 if (CompactModeSettings::maximumTextWidthIndex() > 0) {
201 // A restriction is given for the maximum width of the text (0 means
202 // having no restriction)
203 maxTextWidth = option.fontMetrics.height() * 10 * CompactModeSettings::maximumTextWidthIndex();
204 }
205
206 horizontalMargin = 8;
207 break;
208 }
209 case KFileItemListView::DetailsLayout: {
210 itemWidth = -1;
211 itemHeight = padding * 2 + qMax(iconSize, option.fontMetrics.lineSpacing());
212 break;
213 }
214 default:
215 itemWidth = -1;
216 itemHeight = -1;
217 Q_ASSERT(false);
218 break;
219 }
220
221 // Apply the calculated values
222 option.padding = padding;
223 option.horizontalMargin = horizontalMargin;
224 option.verticalMargin = verticalMargin;
225 option.iconSize = iconSize;
226 option.maxTextLines = maxTextLines;
227 option.maxTextWidth = maxTextWidth;
228 beginTransaction();
229 setStyleOption(option);
230 setItemSize(QSizeF(itemWidth, itemHeight));
231 endTransaction();
232 }