2 * SPDX-FileCopyrightText: 2011 Peter Penz <peter.penz19@gmail.com>
4 * SPDX-License-Identifier: GPL-2.0-or-later
7 #include "dolphinitemlistview.h"
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"
18 #include <KIO/PreviewJob>
21 DolphinItemListView::DolphinItemListView(QGraphicsWidget
*parent
)
22 : KFileItemListView(parent
)
25 DolphinItemListView::updateFont();
29 DolphinItemListView::~DolphinItemListView()
34 void DolphinItemListView::setZoomLevel(int level
)
36 if (level
< ZoomLevelInfo::minimumLevel()) {
37 level
= ZoomLevelInfo::minimumLevel();
38 } else if (level
> ZoomLevelInfo::maximumLevel()) {
39 level
= ZoomLevelInfo::maximumLevel();
42 if (level
== m_zoomLevel
) {
48 ViewModeSettings
settings(itemLayout());
49 if (previewsShown()) {
50 const int previewSize
= ZoomLevelInfo::iconSizeForZoomLevel(level
);
51 settings
.setPreviewSize(previewSize
);
53 const int iconSize
= ZoomLevelInfo::iconSizeForZoomLevel(level
);
54 settings
.setIconSize(iconSize
);
60 int DolphinItemListView::zoomLevel() const
65 void DolphinItemListView::setEnabledSelectionToggles(DolphinItemListView::SelectionTogglesEnabled selectionTogglesEnabled
)
67 m_selectionTogglesEnabled
= selectionTogglesEnabled
;
68 switch (m_selectionTogglesEnabled
) {
70 return setEnabledSelectionToggles(true);
72 return setEnabledSelectionToggles(false);
74 return setEnabledSelectionToggles(GeneralSettings::showSelectionToggle());
78 void DolphinItemListView::readSettings()
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();
85 ContentDisplaySettings::self()->load();
89 setEnabledSelectionToggles(m_selectionTogglesEnabled
);
90 setHighlightEntireRow(itemLayoutHighlightEntireRow(itemLayout()));
91 setSupportsItemExpanding(itemLayoutSupportsItemExpanding(itemLayout()));
96 const KConfigGroup
globalConfig(KSharedConfig::openConfig(), QStringLiteral("PreviewSettings"));
97 setEnabledPlugins(globalConfig
.readEntry("Plugins", KIO::PreviewJob::defaultPlugins()));
98 setLocalFileSizePreviewLimit(globalConfig
.readEntry("MaximumSize", 0));
102 void DolphinItemListView::writeSettings()
104 IconsModeSettings::self()->save();
105 CompactModeSettings::self()->save();
106 DetailsModeSettings::self()->save();
109 KItemListWidgetCreatorBase
*DolphinItemListView::defaultWidgetCreator() const
111 return new KItemListWidgetCreator
<DolphinFileItemListWidget
>();
114 bool DolphinItemListView::itemLayoutHighlightEntireRow(ItemLayout layout
) const
116 return layout
== DetailsLayout
&& DetailsModeSettings::highlightEntireRow();
119 bool DolphinItemListView::itemLayoutSupportsItemExpanding(ItemLayout layout
) const
121 return layout
== DetailsLayout
&& DetailsModeSettings::expandableFolders();
124 void DolphinItemListView::onItemLayoutChanged(ItemLayout current
, ItemLayout previous
)
126 setHeaderVisible(current
== DetailsLayout
);
131 KFileItemListView::onItemLayoutChanged(current
, previous
);
134 void DolphinItemListView::onPreviewsShownChanged(bool shown
)
140 void DolphinItemListView::onVisibleRolesChanged(const QList
<QByteArray
> ¤t
, const QList
<QByteArray
> &previous
)
142 KFileItemListView::onVisibleRolesChanged(current
, previous
);
146 void DolphinItemListView::updateFont()
148 const ViewModeSettings
settings(itemLayout());
150 if (settings
.useSystemFont()) {
151 KItemListView::updateFont();
153 QFont
font(settings
.viewFont());
155 KItemListStyleOption option
= styleOption();
157 option
.fontMetrics
= QFontMetrics(font
);
159 setStyleOption(option
);
163 void DolphinItemListView::updateGridSize()
165 const ViewModeSettings
settings(itemLayout());
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();
172 const int padding
= 2;
173 int horizontalMargin
= 0;
174 int verticalMargin
= 0;
176 // Calculate the item-width and item-height
179 int maxTextLines
= 0;
180 int maxTextWidth
= 0;
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
;
191 if (itemWidth
< iconSize
+ padding
* 2 * zoomFactor
) {
192 itemWidth
= iconSize
+ padding
* 2 * zoomFactor
;
195 itemHeight
= padding
* 3 + iconSize
+ option
.fontMetrics
.lineSpacing();
197 const auto margin
= style()->pixelMetric(QStyle::PM_SizeGripSize
);
198 horizontalMargin
= margin
;
199 verticalMargin
= margin
;
200 maxTextLines
= IconsModeSettings::maximumTextLines();
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());
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();
214 horizontalMargin
= 8;
217 case KFileItemListView::DetailsLayout
: {
219 itemHeight
= padding
* 2 + qMax(iconSize
, option
.fontMetrics
.lineSpacing());
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
;
237 setStyleOption(option
);
238 setItemSize(QSizeF(itemWidth
, itemHeight
));
242 #include "moc_dolphinitemlistview.cpp"