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