]> cloud.milkyroute.net Git - dolphin.git/blob - src/kitemviews/kstandarditemlistview.cpp
DolphinView: Conform to global scroll speed
[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 <QApplication>
8
9 #include "kstandarditemlistview.h"
10
11 #include "kstandarditemlistwidget.h"
12
13 #include <KIconLoader>
14
15 KStandardItemListView::KStandardItemListView(QGraphicsWidget *parent)
16 : KItemListView(parent)
17 , m_itemLayout(DetailsLayout)
18 {
19 setAcceptDrops(true);
20 setScrollOrientation(Qt::Vertical);
21 setVisibleRoles({"text"});
22 setAlternateBackgrounds(true);
23 }
24
25 KStandardItemListView::~KStandardItemListView()
26 {
27 }
28
29 void KStandardItemListView::setItemLayout(ItemLayout layout)
30 {
31 if (m_itemLayout == layout) {
32 return;
33 }
34
35 beginTransaction();
36
37 const ItemLayout previous = m_itemLayout;
38 m_itemLayout = layout;
39
40 // keep the leading padding option unchanged here
41 setHighlightEntireRow(itemLayoutHighlightEntireRow(layout));
42 setSupportsItemExpanding(itemLayoutSupportsItemExpanding(layout));
43 setScrollOrientation(layout == CompactLayout ? Qt::Horizontal : Qt::Vertical);
44
45 onItemLayoutChanged(layout, previous);
46
47 endTransaction();
48 }
49
50 KStandardItemListView::ItemLayout KStandardItemListView::itemLayout() const
51 {
52 return m_itemLayout;
53 }
54
55 KItemListWidgetCreatorBase *KStandardItemListView::defaultWidgetCreator() const
56 {
57 return new KItemListWidgetCreator<KStandardItemListWidget>();
58 }
59
60 KItemListGroupHeaderCreatorBase *KStandardItemListView::defaultGroupHeaderCreator() const
61 {
62 return new KItemListGroupHeaderCreator<KStandardItemListGroupHeader>();
63 }
64
65 void KStandardItemListView::initializeItemListWidget(KItemListWidget *item)
66 {
67 KStandardItemListWidget *standardItemListWidget = qobject_cast<KStandardItemListWidget *>(item);
68 Q_ASSERT(standardItemListWidget);
69
70 switch (itemLayout()) {
71 case IconsLayout:
72 standardItemListWidget->setLayout(KStandardItemListWidget::IconsLayout);
73 break;
74 case CompactLayout:
75 standardItemListWidget->setLayout(KStandardItemListWidget::CompactLayout);
76 break;
77 case DetailsLayout:
78 standardItemListWidget->setLayout(KStandardItemListWidget::DetailsLayout);
79 break;
80 default:
81 Q_ASSERT(false);
82 break;
83 }
84
85 standardItemListWidget->setHighlightEntireRow(highlightEntireRow());
86 standardItemListWidget->setSupportsItemExpanding(supportsItemExpanding());
87 }
88
89 bool KStandardItemListView::itemSizeHintUpdateRequired(const QSet<QByteArray> &changedRoles) const
90 {
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)) {
99 return true;
100 }
101 }
102 return false;
103 }
104
105 bool KStandardItemListView::itemLayoutHighlightEntireRow(ItemLayout layout) const
106 {
107 return layout == DetailsLayout;
108 }
109
110 bool KStandardItemListView::itemLayoutSupportsItemExpanding(ItemLayout layout) const
111 {
112 return layout == DetailsLayout;
113 }
114
115 qreal KStandardItemListView::scrollSingleStep() const
116 {
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();
121 }
122
123 return KItemListView::scrollSingleStep();
124 }
125
126 void KStandardItemListView::onItemLayoutChanged(ItemLayout current, ItemLayout previous)
127 {
128 Q_UNUSED(current)
129 Q_UNUSED(previous)
130 updateLayoutOfVisibleItems();
131 }
132
133 void KStandardItemListView::onScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous)
134 {
135 Q_UNUSED(current)
136 Q_UNUSED(previous)
137 updateLayoutOfVisibleItems();
138 }
139
140 void KStandardItemListView::onSupportsItemExpandingChanged(bool supportsExpanding)
141 {
142 Q_UNUSED(supportsExpanding)
143 updateLayoutOfVisibleItems();
144 }
145
146 void KStandardItemListView::polishEvent()
147 {
148 switch (m_itemLayout) {
149 case IconsLayout:
150 applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_LargeIconSize), 2, 4, 8);
151 break;
152 case CompactLayout:
153 applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_SmallIconSize), 2, 8, 0);
154 break;
155 case DetailsLayout:
156 applyDefaultStyleOption(style()->pixelMetric(QStyle::PM_SmallIconSize), 2, 0, 0);
157 break;
158 default:
159 Q_ASSERT(false);
160 break;
161 }
162
163 QGraphicsWidget::polishEvent();
164 }
165
166 void KStandardItemListView::applyDefaultStyleOption(int iconSize, int padding, int horizontalMargin, int verticalMargin)
167 {
168 KItemListStyleOption option = styleOption();
169
170 if (option.iconSize < 0) {
171 option.iconSize = iconSize;
172 }
173 if (option.padding < 0) {
174 option.padding = padding;
175 }
176 if (option.horizontalMargin < 0) {
177 option.horizontalMargin = horizontalMargin;
178 }
179 if (option.verticalMargin < 0) {
180 option.verticalMargin = verticalMargin;
181 }
182
183 setStyleOption(option);
184 }
185
186 void KStandardItemListView::updateLayoutOfVisibleItems()
187 {
188 if (model()) {
189 const auto widgets = visibleItemListWidgets();
190 for (KItemListWidget *widget : widgets) {
191 initializeItemListWidget(widget);
192 }
193 }
194 }
195
196 #include "moc_kstandarditemlistview.cpp"