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