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