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"});
22 KStandardItemListView::~KStandardItemListView()
26 void KStandardItemListView::setItemLayout(ItemLayout layout
)
28 if (m_itemLayout
== layout
) {
34 const ItemLayout previous
= m_itemLayout
;
35 m_itemLayout
= layout
;
37 setSupportsItemExpanding(itemLayoutSupportsItemExpanding(layout
));
38 setScrollOrientation(layout
== CompactLayout
? Qt::Horizontal
: Qt::Vertical
);
40 onItemLayoutChanged(layout
, previous
);
45 KStandardItemListView::ItemLayout
KStandardItemListView::itemLayout() const
50 KItemListWidgetCreatorBase
* KStandardItemListView::defaultWidgetCreator() const
52 return new KItemListWidgetCreator
<KStandardItemListWidget
>();
55 KItemListGroupHeaderCreatorBase
* KStandardItemListView::defaultGroupHeaderCreator() const
57 return new KItemListGroupHeaderCreator
<KStandardItemListGroupHeader
>();
60 void KStandardItemListView::initializeItemListWidget(KItemListWidget
* item
)
62 KStandardItemListWidget
* standardItemListWidget
= qobject_cast
<KStandardItemListWidget
*>(item
);
63 Q_ASSERT(standardItemListWidget
);
65 switch (itemLayout()) {
66 case IconsLayout
: standardItemListWidget
->setLayout(KStandardItemListWidget::IconsLayout
); break;
67 case CompactLayout
: standardItemListWidget
->setLayout(KStandardItemListWidget::CompactLayout
); break;
68 case DetailsLayout
: standardItemListWidget
->setLayout(KStandardItemListWidget::DetailsLayout
); break;
69 default: Q_ASSERT(false); break;
72 standardItemListWidget
->setSupportsItemExpanding(supportsItemExpanding());
76 bool KStandardItemListView::itemSizeHintUpdateRequired(const QSet
<QByteArray
>& changedRoles
) const
78 // The only thing that can modify the item's size hint is the amount of space
79 // needed to display the text for the visible roles.
80 // Even if the icons have a different size they are always aligned within
81 // the area defined by KItemStyleOption.iconSize and hence result in no
82 // change of the item-size.
83 const auto roles
= visibleRoles();
84 for (const QByteArray
& role
: roles
) {
85 if (changedRoles
.contains(role
)) {
92 bool KStandardItemListView::itemLayoutSupportsItemExpanding(ItemLayout layout
) const
94 return layout
== DetailsLayout
;
97 void KStandardItemListView::onItemLayoutChanged(ItemLayout current
, ItemLayout previous
)
101 updateLayoutOfVisibleItems();
104 void KStandardItemListView::onScrollOrientationChanged(Qt::Orientation current
, Qt::Orientation previous
)
108 updateLayoutOfVisibleItems();
111 void KStandardItemListView::onSupportsItemExpandingChanged(bool supportsExpanding
)
113 Q_UNUSED(supportsExpanding
)
114 updateLayoutOfVisibleItems();
118 void KStandardItemListView::polishEvent()
120 switch (m_itemLayout
) {
121 case IconsLayout
: applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_LargeIconSize
), 2, 4, 8); break;
122 case CompactLayout
: applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_SmallIconSize
), 2, 8, 0); break;
123 case DetailsLayout
: applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_SmallIconSize
), 2, 0, 0); break;
124 default: Q_ASSERT(false); break;
127 QGraphicsWidget::polishEvent();
130 void KStandardItemListView::applyDefaultStyleOption(int iconSize
,
132 int horizontalMargin
,
135 KItemListStyleOption option
= styleOption();
137 if (option
.iconSize
< 0) {
138 option
.iconSize
= iconSize
;
140 if (option
.padding
< 0) {
141 option
.padding
= padding
;
143 if (option
.horizontalMargin
< 0) {
144 option
.horizontalMargin
= horizontalMargin
;
146 if (option
.verticalMargin
< 0) {
147 option
.verticalMargin
= verticalMargin
;
150 setStyleOption(option
);
153 void KStandardItemListView::updateLayoutOfVisibleItems()
156 const auto widgets
= visibleItemListWidgets();
157 for (KItemListWidget
* widget
: widgets
) {
158 initializeItemListWidget(widget
);