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