2 * SPDX-FileCopyrightText: 2012 Peter Penz <peter.penz19@gmail.com>
4 * SPDX-License-Identifier: GPL-2.0-or-later
7 #include "kstandarditemlistview.h"
9 #include "kstandarditemlistwidget.h"
11 #include <KIconLoader>
13 KStandardItemListView::KStandardItemListView(QGraphicsWidget
* parent
) :
14 KItemListView(parent
),
15 m_itemLayout(DetailsLayout
)
18 setScrollOrientation(Qt::Vertical
);
19 setVisibleRoles({"text"});
20 setAlternateBackgrounds(true);
23 KStandardItemListView::~KStandardItemListView()
27 void KStandardItemListView::setItemLayout(ItemLayout layout
)
29 if (m_itemLayout
== layout
) {
35 const ItemLayout previous
= m_itemLayout
;
36 m_itemLayout
= layout
;
38 // keep the leading padding option unchanged here
39 setHighlightEntireRow(layout
== DetailsLayout
);
40 setSupportsItemExpanding(itemLayoutSupportsItemExpanding(layout
));
41 setScrollOrientation(layout
== CompactLayout
? Qt::Horizontal
: Qt::Vertical
);
43 onItemLayoutChanged(layout
, previous
);
48 KStandardItemListView::ItemLayout
KStandardItemListView::itemLayout() const
53 KItemListWidgetCreatorBase
* KStandardItemListView::defaultWidgetCreator() const
55 return new KItemListWidgetCreator
<KStandardItemListWidget
>();
58 KItemListGroupHeaderCreatorBase
* KStandardItemListView::defaultGroupHeaderCreator() const
60 return new KItemListGroupHeaderCreator
<KStandardItemListGroupHeader
>();
63 void KStandardItemListView::initializeItemListWidget(KItemListWidget
* item
)
65 KStandardItemListWidget
* standardItemListWidget
= qobject_cast
<KStandardItemListWidget
*>(item
);
66 Q_ASSERT(standardItemListWidget
);
68 switch (itemLayout()) {
69 case IconsLayout
: standardItemListWidget
->setLayout(KStandardItemListWidget::IconsLayout
); break;
70 case CompactLayout
: standardItemListWidget
->setLayout(KStandardItemListWidget::CompactLayout
); break;
71 case DetailsLayout
: standardItemListWidget
->setLayout(KStandardItemListWidget::DetailsLayout
); break;
72 default: Q_ASSERT(false); break;
75 standardItemListWidget
->setHighlightEntireRow(highlightEntireRow());
76 standardItemListWidget
->setSupportsItemExpanding(supportsItemExpanding());
80 bool KStandardItemListView::itemSizeHintUpdateRequired(const QSet
<QByteArray
>& changedRoles
) const
82 // The only thing that can modify the item's size hint is the amount of space
83 // needed to display the text for the visible roles.
84 // Even if the icons have a different size they are always aligned within
85 // the area defined by KItemStyleOption.iconSize and hence result in no
86 // change of the item-size.
87 const auto roles
= visibleRoles();
88 for (const QByteArray
& role
: roles
) {
89 if (changedRoles
.contains(role
)) {
96 bool KStandardItemListView::itemLayoutSupportsItemExpanding(ItemLayout layout
) const
98 return layout
== DetailsLayout
;
101 void KStandardItemListView::onItemLayoutChanged(ItemLayout current
, ItemLayout previous
)
105 updateLayoutOfVisibleItems();
108 void KStandardItemListView::onScrollOrientationChanged(Qt::Orientation current
, Qt::Orientation previous
)
112 updateLayoutOfVisibleItems();
115 void KStandardItemListView::onSupportsItemExpandingChanged(bool supportsExpanding
)
117 Q_UNUSED(supportsExpanding
)
118 updateLayoutOfVisibleItems();
122 void KStandardItemListView::polishEvent()
124 switch (m_itemLayout
) {
125 case IconsLayout
: applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_LargeIconSize
), 2, 4, 8); break;
126 case CompactLayout
: applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_SmallIconSize
), 2, 8, 0); break;
127 case DetailsLayout
: applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_SmallIconSize
), 2, 0, 0); break;
128 default: Q_ASSERT(false); break;
131 QGraphicsWidget::polishEvent();
134 void KStandardItemListView::applyDefaultStyleOption(int iconSize
,
136 int horizontalMargin
,
139 KItemListStyleOption option
= styleOption();
141 if (option
.iconSize
< 0) {
142 option
.iconSize
= iconSize
;
144 if (option
.padding
< 0) {
145 option
.padding
= padding
;
147 if (option
.horizontalMargin
< 0) {
148 option
.horizontalMargin
= horizontalMargin
;
150 if (option
.verticalMargin
< 0) {
151 option
.verticalMargin
= verticalMargin
;
154 setStyleOption(option
);
157 void KStandardItemListView::updateLayoutOfVisibleItems()
160 const auto widgets
= visibleItemListWidgets();
161 for (KItemListWidget
* widget
: widgets
) {
162 initializeItemListWidget(widget
);