2 * SPDX-FileCopyrightText: 2012 Peter Penz <peter.penz19@gmail.com>
4 * SPDX-License-Identifier: GPL-2.0-or-later
7 #include <QApplication>
9 #include "kstandarditemlistview.h"
11 #include "kstandarditemlistwidget.h"
13 #include <KIconLoader>
15 KStandardItemListView::KStandardItemListView(QGraphicsWidget
*parent
)
16 : KItemListView(parent
)
17 , m_itemLayout(DetailsLayout
)
20 setScrollOrientation(Qt::Vertical
);
21 setVisibleRoles({"text"});
22 setAlternateBackgrounds(true);
25 KStandardItemListView::~KStandardItemListView()
29 void KStandardItemListView::setItemLayout(ItemLayout layout
)
31 if (m_itemLayout
== layout
) {
37 const ItemLayout previous
= m_itemLayout
;
38 m_itemLayout
= layout
;
40 // keep the leading padding option unchanged here
41 setHighlightEntireRow(itemLayoutHighlightEntireRow(layout
));
42 setSupportsItemExpanding(itemLayoutSupportsItemExpanding(layout
));
43 setScrollOrientation(layout
== CompactLayout
? Qt::Horizontal
: Qt::Vertical
);
45 onItemLayoutChanged(layout
, previous
);
50 KStandardItemListView::ItemLayout
KStandardItemListView::itemLayout() const
55 KItemListWidgetCreatorBase
*KStandardItemListView::defaultWidgetCreator() const
57 return new KItemListWidgetCreator
<KStandardItemListWidget
>();
60 KItemListGroupHeaderCreatorBase
*KStandardItemListView::defaultGroupHeaderCreator() const
62 return new KItemListGroupHeaderCreator
<KStandardItemListGroupHeader
>();
65 void KStandardItemListView::initializeItemListWidget(KItemListWidget
*item
)
67 KStandardItemListWidget
*standardItemListWidget
= qobject_cast
<KStandardItemListWidget
*>(item
);
68 Q_ASSERT(standardItemListWidget
);
70 switch (itemLayout()) {
72 standardItemListWidget
->setLayout(KStandardItemListWidget::IconsLayout
);
75 standardItemListWidget
->setLayout(KStandardItemListWidget::CompactLayout
);
78 standardItemListWidget
->setLayout(KStandardItemListWidget::DetailsLayout
);
85 standardItemListWidget
->setHighlightEntireRow(highlightEntireRow());
86 standardItemListWidget
->setSupportsItemExpanding(supportsItemExpanding());
89 bool KStandardItemListView::itemSizeHintUpdateRequired(const QSet
<QByteArray
> &changedRoles
) const
91 // The only thing that can modify the item's size hint is the amount of space
92 // needed to display the text for the visible roles.
93 // Even if the icons have a different size they are always aligned within
94 // the area defined by KItemStyleOption.iconSize and hence result in no
95 // change of the item-size.
96 const auto roles
= visibleRoles();
97 for (const QByteArray
&role
: roles
) {
98 if (changedRoles
.contains(role
)) {
105 bool KStandardItemListView::itemLayoutHighlightEntireRow(ItemLayout layout
) const
107 return layout
== DetailsLayout
;
110 bool KStandardItemListView::itemLayoutSupportsItemExpanding(ItemLayout layout
) const
112 return layout
== DetailsLayout
;
115 qreal
KStandardItemListView::scrollSingleStep() const
117 if (itemLayout() == DetailsLayout
) {
118 // We want each scroll in details view mode to move by some number of complete rows.
119 const int rowsPerFullScroll
= qCeil((KItemListView::scrollSingleStep() * QApplication::wheelScrollLines()) / itemSize().height());
120 return (rowsPerFullScroll
* itemSize().height()) / QApplication::wheelScrollLines();
123 return KItemListView::scrollSingleStep();
126 void KStandardItemListView::onItemLayoutChanged(ItemLayout current
, ItemLayout previous
)
130 updateLayoutOfVisibleItems();
133 void KStandardItemListView::onScrollOrientationChanged(Qt::Orientation current
, Qt::Orientation previous
)
137 updateLayoutOfVisibleItems();
140 void KStandardItemListView::onSupportsItemExpandingChanged(bool supportsExpanding
)
142 Q_UNUSED(supportsExpanding
)
143 updateLayoutOfVisibleItems();
146 void KStandardItemListView::polishEvent()
148 switch (m_itemLayout
) {
150 applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_LargeIconSize
), 2, 4, 8);
153 applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_SmallIconSize
), 2, 8, 0);
156 applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_SmallIconSize
), 2, 0, 0);
163 QGraphicsWidget::polishEvent();
166 void KStandardItemListView::applyDefaultStyleOption(int iconSize
, int padding
, int horizontalMargin
, int verticalMargin
)
168 KItemListStyleOption option
= styleOption();
170 if (option
.iconSize
< 0) {
171 option
.iconSize
= iconSize
;
173 if (option
.padding
< 0) {
174 option
.padding
= padding
;
176 if (option
.horizontalMargin
< 0) {
177 option
.horizontalMargin
= horizontalMargin
;
179 if (option
.verticalMargin
< 0) {
180 option
.verticalMargin
= verticalMargin
;
183 setStyleOption(option
);
186 void KStandardItemListView::updateLayoutOfVisibleItems()
189 const auto widgets
= visibleItemListWidgets();
190 for (KItemListWidget
*widget
: widgets
) {
191 initializeItemListWidget(widget
);
196 #include "moc_kstandarditemlistview.cpp"