]> cloud.milkyroute.net Git - dolphin.git/blob - src/kitemviews/kstandarditemlistview.cpp
Merge branch 'release/20.08'
[dolphin.git] / src / kitemviews / kstandarditemlistview.cpp
1 /*
2 * SPDX-FileCopyrightText: 2012 Peter Penz <peter.penz19@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "kstandarditemlistview.h"
8
9 #include "kstandarditemlistwidget.h"
10
11 #include <KIconLoader>
12
13 KStandardItemListView::KStandardItemListView(QGraphicsWidget* parent) :
14 KItemListView(parent),
15 m_itemLayout(DetailsLayout)
16 {
17 setAcceptDrops(true);
18 setScrollOrientation(Qt::Vertical);
19 setVisibleRoles({"text"});
20 }
21
22 KStandardItemListView::~KStandardItemListView()
23 {
24 }
25
26 void KStandardItemListView::setItemLayout(ItemLayout layout)
27 {
28 if (m_itemLayout == layout) {
29 return;
30 }
31
32 beginTransaction();
33
34 const ItemLayout previous = m_itemLayout;
35 m_itemLayout = layout;
36
37 setSupportsItemExpanding(itemLayoutSupportsItemExpanding(layout));
38 setScrollOrientation(layout == CompactLayout ? Qt::Horizontal : Qt::Vertical);
39
40 onItemLayoutChanged(layout, previous);
41
42 endTransaction();
43 }
44
45 KStandardItemListView::ItemLayout KStandardItemListView::itemLayout() const
46 {
47 return m_itemLayout;
48 }
49
50 KItemListWidgetCreatorBase* KStandardItemListView::defaultWidgetCreator() const
51 {
52 return new KItemListWidgetCreator<KStandardItemListWidget>();
53 }
54
55 KItemListGroupHeaderCreatorBase* KStandardItemListView::defaultGroupHeaderCreator() const
56 {
57 return new KItemListGroupHeaderCreator<KStandardItemListGroupHeader>();
58 }
59
60 void KStandardItemListView::initializeItemListWidget(KItemListWidget* item)
61 {
62 KStandardItemListWidget* standardItemListWidget = qobject_cast<KStandardItemListWidget*>(item);
63 Q_ASSERT(standardItemListWidget);
64
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;
70 }
71
72 standardItemListWidget->setSupportsItemExpanding(supportsItemExpanding());
73 }
74
75
76 bool KStandardItemListView::itemSizeHintUpdateRequired(const QSet<QByteArray>& changedRoles) const
77 {
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)) {
85 return true;
86 }
87 }
88 return false;
89 }
90
91 bool KStandardItemListView::itemLayoutSupportsItemExpanding(ItemLayout layout) const
92 {
93 return layout == DetailsLayout;
94 }
95
96 void KStandardItemListView::onItemLayoutChanged(ItemLayout current, ItemLayout previous)
97 {
98 Q_UNUSED(current)
99 Q_UNUSED(previous)
100 updateLayoutOfVisibleItems();
101 }
102
103 void KStandardItemListView::onScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous)
104 {
105 Q_UNUSED(current)
106 Q_UNUSED(previous)
107 updateLayoutOfVisibleItems();
108 }
109
110 void KStandardItemListView::onSupportsItemExpandingChanged(bool supportsExpanding)
111 {
112 Q_UNUSED(supportsExpanding)
113 updateLayoutOfVisibleItems();
114 }
115
116
117 void KStandardItemListView::polishEvent()
118 {
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;
124 }
125
126 QGraphicsWidget::polishEvent();
127 }
128
129 void KStandardItemListView::applyDefaultStyleOption(int iconSize,
130 int padding,
131 int horizontalMargin,
132 int verticalMargin)
133 {
134 KItemListStyleOption option = styleOption();
135
136 if (option.iconSize < 0) {
137 option.iconSize = iconSize;
138 }
139 if (option.padding < 0) {
140 option.padding = padding;
141 }
142 if (option.horizontalMargin < 0) {
143 option.horizontalMargin = horizontalMargin;
144 }
145 if (option.verticalMargin < 0) {
146 option.verticalMargin = verticalMargin;
147 }
148
149 setStyleOption(option);
150 }
151
152 void KStandardItemListView::updateLayoutOfVisibleItems()
153 {
154 if (model()) {
155 foreach (KItemListWidget* widget, visibleItemListWidgets()) {
156 initializeItemListWidget(widget);
157 }
158 }
159 }
160