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_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"
20 #include <KIO/PreviewJob>
24 DolphinItemListView::DolphinItemListView(QGraphicsWidget
* parent
) :
25 KFileItemListView(parent
),
32 DolphinItemListView::~DolphinItemListView()
37 void DolphinItemListView::setZoomLevel(int level
)
39 if (level
< ZoomLevelInfo::minimumLevel()) {
40 level
= ZoomLevelInfo::minimumLevel();
41 } else if (level
> ZoomLevelInfo::maximumLevel()) {
42 level
= ZoomLevelInfo::maximumLevel();
45 if (level
== m_zoomLevel
) {
51 ViewModeSettings
settings(itemLayout());
52 if (previewsShown()) {
53 const int previewSize
= ZoomLevelInfo::iconSizeForZoomLevel(level
);
54 settings
.setPreviewSize(previewSize
);
56 const int iconSize
= ZoomLevelInfo::iconSizeForZoomLevel(level
);
57 settings
.setIconSize(iconSize
);
63 int DolphinItemListView::zoomLevel() const
68 void DolphinItemListView::readSettings()
70 ViewModeSettings
settings(itemLayout());
71 settings
.readConfig();
75 setEnabledSelectionToggles(GeneralSettings::showSelectionToggle());
76 setHighlightEntireRow(DetailsModeSettings::leadingPadding());
77 setSupportsItemExpanding(itemLayoutSupportsItemExpanding(itemLayout()));
82 const KConfigGroup
globalConfig(KSharedConfig::openConfig(), "PreviewSettings");
83 setEnabledPlugins(globalConfig
.readEntry("Plugins", KIO::PreviewJob::defaultPlugins()));
84 setLocalFileSizePreviewLimit(globalConfig
.readEntry("MaximumSize", 0));
88 void DolphinItemListView::writeSettings()
90 IconsModeSettings::self()->save();
91 CompactModeSettings::self()->save();
92 DetailsModeSettings::self()->save();
95 KItemListWidgetCreatorBase
* DolphinItemListView::defaultWidgetCreator() const
97 return new KItemListWidgetCreator
<DolphinFileItemListWidget
>();
100 bool DolphinItemListView::itemLayoutSupportsItemExpanding(ItemLayout layout
) const
102 return layout
== DetailsLayout
&& DetailsModeSettings::expandableFolders();
105 void DolphinItemListView::onItemLayoutChanged(ItemLayout current
, ItemLayout previous
)
107 setHeaderVisible(current
== DetailsLayout
);
112 KFileItemListView::onItemLayoutChanged(current
, previous
);
115 void DolphinItemListView::onPreviewsShownChanged(bool shown
)
121 void DolphinItemListView::onVisibleRolesChanged(const QList
<QByteArray
>& current
,
122 const QList
<QByteArray
>& previous
)
124 KFileItemListView::onVisibleRolesChanged(current
, previous
);
128 void DolphinItemListView::updateFont()
130 const ViewModeSettings
settings(itemLayout());
132 if (settings
.useSystemFont()) {
133 KItemListView::updateFont();
135 QFont
font(settings
.fontFamily(), qRound(settings
.fontSize()));
136 font
.setItalic(settings
.italicFont());
137 font
.setWeight(settings
.fontWeight());
138 font
.setPointSizeF(settings
.fontSize());
140 KItemListStyleOption option
= styleOption();
142 option
.fontMetrics
= QFontMetrics(font
);
144 setStyleOption(option
);
148 void DolphinItemListView::updateGridSize()
150 const ViewModeSettings
settings(itemLayout());
152 // Calculate the size of the icon
153 const int iconSize
= previewsShown() ? settings
.previewSize() : settings
.iconSize();
154 m_zoomLevel
= ZoomLevelInfo::zoomLevelForIconSize(QSize(iconSize
, iconSize
));
155 KItemListStyleOption option
= styleOption();
157 const int padding
= 2;
158 int horizontalMargin
= 0;
159 int verticalMargin
= 0;
161 // Calculate the item-width and item-height
164 int maxTextLines
= 0;
165 int maxTextWidth
= 0;
167 switch (itemLayout()) {
168 case KFileItemListView::IconsLayout
: {
170 // an exponential factor based on zoom, 0 -> 1, 4 -> 1.36 8 -> ~1.85, 16 -> 3.4
171 auto zoomFactor
= qExp(m_zoomLevel
/ 13.0);
172 // 9 is the average char width for 10pt Noto Sans, making fontFactor =1
173 // by each pixel the font gets larger the factor increases by 1/9
174 auto fontFactor
= option
.fontMetrics
.averageCharWidth() / 9.0;
175 itemWidth
= 48 + IconsModeSettings::textWidthIndex() * 64 * fontFactor
* zoomFactor
;
177 if (itemWidth
< iconSize
+ padding
* 2 * zoomFactor
) {
178 itemWidth
= iconSize
+ padding
* 2 * zoomFactor
;
181 itemHeight
= padding
* 3 + iconSize
+ option
.fontMetrics
.lineSpacing();
183 horizontalMargin
= 4;
185 maxTextLines
= IconsModeSettings::maximumTextLines();
188 case KFileItemListView::CompactLayout
: {
189 itemWidth
= padding
* 4 + iconSize
+ option
.fontMetrics
.height() * 5;
190 const int textLinesCount
= visibleRoles().count();
191 itemHeight
= padding
* 2 + qMax(iconSize
, textLinesCount
* option
.fontMetrics
.lineSpacing());
193 if (CompactModeSettings::maximumTextWidthIndex() > 0) {
194 // A restriction is given for the maximum width of the text (0 means
195 // having no restriction)
196 maxTextWidth
= option
.fontMetrics
.height() * 10 * CompactModeSettings::maximumTextWidthIndex();
199 horizontalMargin
= 8;
202 case KFileItemListView::DetailsLayout
: {
204 itemHeight
= padding
* 2 + qMax(iconSize
, option
.fontMetrics
.lineSpacing());
214 // Apply the calculated values
215 option
.padding
= padding
;
216 option
.horizontalMargin
= horizontalMargin
;
217 option
.verticalMargin
= verticalMargin
;
218 option
.iconSize
= iconSize
;
219 option
.maxTextLines
= maxTextLines
;
220 option
.maxTextWidth
= maxTextWidth
;
222 setStyleOption(option
);
223 setItemSize(QSizeF(itemWidth
, itemHeight
));