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 foreach (const QByteArray
& role
, visibleRoles()) {
84 if (changedRoles
.contains(role
)) {
91 bool KStandardItemListView::itemLayoutSupportsItemExpanding(ItemLayout layout
) const
93 return layout
== DetailsLayout
;
96 void KStandardItemListView::onItemLayoutChanged(ItemLayout current
, ItemLayout previous
)
100 updateLayoutOfVisibleItems();
103 void KStandardItemListView::onScrollOrientationChanged(Qt::Orientation current
, Qt::Orientation previous
)
107 updateLayoutOfVisibleItems();
110 void KStandardItemListView::onSupportsItemExpandingChanged(bool supportsExpanding
)
112 Q_UNUSED(supportsExpanding
)
113 updateLayoutOfVisibleItems();
117 void KStandardItemListView::polishEvent()
119 switch (m_itemLayout
) {
120 case IconsLayout
: applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_LargeIconSize
), 2, 4, 8); break;
121 case CompactLayout
: applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_SmallIconSize
), 2, 8, 0); break;
122 case DetailsLayout
: applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_SmallIconSize
), 2, 0, 0); break;
123 default: Q_ASSERT(false); break;
126 QGraphicsWidget::polishEvent();
129 void KStandardItemListView::applyDefaultStyleOption(int iconSize
,
131 int horizontalMargin
,
134 KItemListStyleOption option
= styleOption();
136 if (option
.iconSize
< 0) {
137 option
.iconSize
= iconSize
;
139 if (option
.padding
< 0) {
140 option
.padding
= padding
;
142 if (option
.horizontalMargin
< 0) {
143 option
.horizontalMargin
= horizontalMargin
;
145 if (option
.verticalMargin
< 0) {
146 option
.verticalMargin
= verticalMargin
;
149 setStyleOption(option
);
152 void KStandardItemListView::updateLayoutOfVisibleItems()
155 foreach (KItemListWidget
* widget
, visibleItemListWidgets()) {
156 initializeItemListWidget(widget
);