]> cloud.milkyroute.net Git - dolphin.git/blob - src/views/dolphinitemlistview.cpp
New selection effects
[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_contentdisplaysettings.h"
11 #include "dolphin_detailsmodesettings.h"
12 #include "dolphin_generalsettings.h"
13 #include "dolphin_iconsmodesettings.h"
14 #include "dolphinfileitemlistwidget.h"
15 #include "settings/viewmodes/viewmodesettings.h"
16 #include "zoomlevelinfo.h"
17
18 #include <KIO/PreviewJob>
19 #include <QtMath>
20
21 DolphinItemListView::DolphinItemListView(QGraphicsWidget *parent)
22 : KFileItemListView(parent)
23 , m_zoomLevel(0)
24 {
25 DolphinItemListView::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 ContentDisplaySettings::self()->load();
86
87 beginTransaction();
88
89 setEnabledSelectionToggles(m_selectionTogglesEnabled);
90 setHighlightEntireRow(itemLayoutHighlightEntireRow(itemLayout()));
91 setSupportsItemExpanding(itemLayoutSupportsItemExpanding(itemLayout()));
92
93 updateFont();
94 updateGridSize();
95
96 const KConfigGroup globalConfig(KSharedConfig::openConfig(), QStringLiteral("PreviewSettings"));
97 setEnabledPlugins(globalConfig.readEntry("Plugins", KIO::PreviewJob::defaultPlugins()));
98 setLocalFileSizePreviewLimit(globalConfig.readEntry("MaximumSize", 0));
99 endTransaction();
100 }
101
102 void DolphinItemListView::writeSettings()
103 {
104 IconsModeSettings::self()->save();
105 CompactModeSettings::self()->save();
106 DetailsModeSettings::self()->save();
107 }
108
109 KItemListWidgetCreatorBase *DolphinItemListView::defaultWidgetCreator() const
110 {
111 return new KItemListWidgetCreator<DolphinFileItemListWidget>();
112 }
113
114 bool DolphinItemListView::itemLayoutHighlightEntireRow(ItemLayout layout) const
115 {
116 return layout == DetailsLayout && DetailsModeSettings::highlightEntireRow();
117 }
118
119 bool DolphinItemListView::itemLayoutSupportsItemExpanding(ItemLayout layout) const
120 {
121 return layout == DetailsLayout && DetailsModeSettings::expandableFolders();
122 }
123
124 void DolphinItemListView::onItemLayoutChanged(ItemLayout current, ItemLayout previous)
125 {
126 setHeaderVisible(current == DetailsLayout);
127
128 updateFont();
129 updateGridSize();
130
131 KFileItemListView::onItemLayoutChanged(current, previous);
132 }
133
134 void DolphinItemListView::onPreviewsShownChanged(bool shown)
135 {
136 Q_UNUSED(shown)
137 updateGridSize();
138 }
139
140 void DolphinItemListView::onVisibleRolesChanged(const QList<QByteArray> &current, const QList<QByteArray> &previous)
141 {
142 KFileItemListView::onVisibleRolesChanged(current, previous);
143 updateGridSize();
144 }
145
146 void DolphinItemListView::updateFont()
147 {
148 const ViewModeSettings settings(itemLayout());
149
150 if (settings.useSystemFont()) {
151 KItemListView::updateFont();
152 } else {
153 QFont font(settings.viewFont());
154
155 KItemListStyleOption option = styleOption();
156 option.font = font;
157 option.fontMetrics = QFontMetrics(font);
158
159 setStyleOption(option);
160 }
161 }
162
163 void DolphinItemListView::updateGridSize()
164 {
165 const ViewModeSettings settings(itemLayout());
166
167 // Calculate the size of the icon
168 const int iconSize = previewsShown() ? settings.previewSize() : settings.iconSize();
169 m_zoomLevel = ZoomLevelInfo::zoomLevelForIconSize(QSize(iconSize, iconSize));
170 KItemListStyleOption option = styleOption();
171
172 const int padding = 2;
173 int horizontalMargin = 0;
174 int verticalMargin = 0;
175
176 // Calculate the item-width and item-height
177 int itemWidth;
178 int itemHeight;
179 int maxTextLines = 0;
180 int maxTextWidth = 0;
181
182 switch (itemLayout()) {
183 case KFileItemListView::IconsLayout: {
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 const auto margin = style()->pixelMetric(QStyle::PM_SizeGripSize);
198 horizontalMargin = margin;
199 verticalMargin = margin;
200 maxTextLines = IconsModeSettings::maximumTextLines();
201 break;
202 }
203 case KFileItemListView::CompactLayout: {
204 itemWidth = padding * 4 + iconSize + option.fontMetrics.height() * 5;
205 const int textLinesCount = visibleRoles().count();
206 itemHeight = padding * 2 + qMax(iconSize, textLinesCount * option.fontMetrics.lineSpacing());
207
208 if (CompactModeSettings::maximumTextWidthIndex() > 0) {
209 // A restriction is given for the maximum width of the text (0 means
210 // having no restriction)
211 maxTextWidth = option.fontMetrics.height() * 10 * CompactModeSettings::maximumTextWidthIndex();
212 }
213
214 horizontalMargin = 8;
215 break;
216 }
217 case KFileItemListView::DetailsLayout: {
218 itemWidth = -1;
219 itemHeight = padding * 2 + qMax(iconSize, option.fontMetrics.lineSpacing());
220 break;
221 }
222 default:
223 itemWidth = -1;
224 itemHeight = -1;
225 Q_ASSERT(false);
226 break;
227 }
228
229 // Apply the calculated values
230 option.padding = padding;
231 option.horizontalMargin = horizontalMargin;
232 option.verticalMargin = verticalMargin;
233 option.iconSize = iconSize;
234 option.maxTextLines = maxTextLines;
235 option.maxTextWidth = maxTextWidth;
236 beginTransaction();
237 setStyleOption(option);
238 setItemSize(QSizeF(itemWidth, itemHeight));
239 endTransaction();
240 }
241
242 #include "moc_dolphinitemlistview.cpp"