Krita Source Code Documentation
Loading...
Searching...
No Matches
KisResourceItemListView.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2 * SPDX-FileCopyrightText: 2019 Wolthera van Hövell tot Westerflier <griffinvalley@gmail.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
8
9#include <QEvent>
10#include <QScroller>
11#include <QScrollBar>
12#include <QHelpEvent>
13
14#include "KisIconToolTip.h"
15
16
17struct Q_DECL_HIDDEN KisResourceItemListView::Private
18{
20
22 bool strictSelectionMode {false};
24
25 QScroller* scroller {0};
27
28 QSize requestedItemSize = QSize(56, 56);
29};
30
32 : QListView(parent)
33 , m_d(new Private(this))
34{
35 setSelectionMode(QAbstractItemView::SingleSelection);
36 setContextMenuPolicy(Qt::DefaultContextMenu);
37 setResizeMode(QListView::Adjust);
38 setUniformItemSizes(true);
39
40 // Default configuration
41 setViewMode(QListView::IconMode);
42 setGridSize(QSize(56, 56));
43 setIconSize(QSize(56, 56));
44 setResizeMode(QListView::Adjust);
45 setUniformItemSizes(true);
46
48 if (m_d->scroller) {
49 connect(m_d->scroller, SIGNAL(stateChanged(QScroller::State)), this, SLOT(slotScrollerStateChange(QScroller::State)));
50 }
51
52 connect(this, SIGNAL(clicked(QModelIndex)), SIGNAL(currentResourceClicked(const QModelIndex &)));
53
54 m_d->prev_scrollbar_style = horizontalScrollBar()->styleSheet();
55}
56
60
62{
63 m_d->viewMode = viewMode;
64
65 auto restoreScrollbar = [&, this] () {
66 horizontalScrollBar()->setStyleSheet(m_d->prev_scrollbar_style);
67 setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAsNeeded);
68 };
69
70 switch (viewMode) {
72 setViewMode(ViewMode::IconMode);
73 setFlow(Flow::LeftToRight);
74 setWrapping(true);
75 restoreScrollbar();
76
77 setItemSize(m_d->requestedItemSize);
78 break;
79 }
81 setViewMode(ViewMode::IconMode);
82 setFlow(Flow::LeftToRight);
83 setWrapping(false);
84
85 // this is the only way to hide it and not have it occupy space
86 horizontalScrollBar()->setStyleSheet("QScrollBar::horizontal {height: 0px;}");
87 setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
88
89 setItemSize(m_d->requestedItemSize);
90 break;
91 }
93 setViewMode(ViewMode::ListMode);
94 setFlow(Flow::TopToBottom);
95 setWrapping(false);
96 restoreScrollbar();
97 setItemSize(m_d->requestedItemSize);
98 // horizontalScrollBar()->setStyleSheet(m_d->prev_scrollbar_style);
99 setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAsNeeded);
100 setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAsNeeded);
101 break;
102 }
103 }
104}
105
107{
108 m_d->requestedItemSize = size;
109
110 switch (m_d->viewMode) {
112 setGridSize(size);
113 setIconSize(size);
114 break;
115 }
117 // you can not set the item size in strip mode
118 // it is configured automatically based on size
119 break;
120 }
122 const int w = width() - horizontalScrollBar()->width();
123 setGridSize(QSize(w, size.height()));
124 setIconSize(QSize(size));
125 break;
126 }
127 }
128}
129
131{
132 m_d->strictSelectionMode = enable;
133}
134
136{
137 m_d->tip.setFixedToolTipThumbnailSize(size);
138}
139
141{
142 m_d->tip.setToolTipShouldRenderCheckers(value);
143}
144
145void KisResourceItemListView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
146{
147 // QAbstractItemView moves the current index if the row it points to is removed,
148 // which we don't want for strict selections
149 QModelIndex current = currentIndex();
150 if (selectionMode() == SingleSelection
151 && m_d->strictSelectionMode
152 && current.isValid()
153 && current.row() >= start
154 && current.row() <= end) {
155
156 selectionModel()->clear();
157 }
158 QListView::rowsAboutToBeRemoved(parent, start, end);
159}
160
161void KisResourceItemListView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
162{
163 // base class takes care of viewport updates
164 QListView::selectionChanged(selected, deselected);
165
166 if (selected.isEmpty()) {
167 Q_EMIT currentResourceChanged(QModelIndex());
168 }
169 else {
170 Q_EMIT currentResourceChanged(selected.indexes().first());
171 }
172}
173
174QItemSelectionModel::SelectionFlags KisResourceItemListView::selectionCommand(const QModelIndex &index, const QEvent *event) const
175{
176 QItemSelectionModel::SelectionFlags cmd = QListView::selectionCommand(index, event);
177
178 // avoid deselecting the current item by Ctrl-clicking in single selection mode
179 if (selectionMode() == SingleSelection
180 && m_d->strictSelectionMode
181 && cmd.testFlag(QItemSelectionModel::Deselect)) {
182
183 cmd = QItemSelectionModel::NoUpdate;
184 }
185 return cmd;
186}
187
188void KisResourceItemListView::contextMenuEvent(QContextMenuEvent *event)
189{
190 QListView::contextMenuEvent(event);
191 Q_EMIT contextMenuRequested(event->globalPos());
192}
193
195{
196 if (!model()) return true;
197
198 if (event->type() == QEvent::ToolTip) {
199 QHelpEvent *he = static_cast<QHelpEvent *>(event);
200#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
201 QStyleOptionViewItem option = viewOptions();
202#else
203 QStyleOptionViewItem option;
204 initViewItemOption(&option);
205#endif
206 QModelIndex index = model()->buddy(indexAt(he->pos()));
207 if (index.isValid()) {
208 option.rect = visualRect(index);
209 m_d->tip.showTip(he->pos(), option, index);
210 return true;
211 }
212 m_d->tip.hide();
213 }
214
215 return QListView::viewportEvent(event);
216}
217
219{
220 QListView::resizeEvent(event);
221
222 switch (m_d->viewMode) {
224 const int height = event->size().height();
225 setGridSize(QSize(height, height));
226 setIconSize(QSize(height, height));
227 break;
228 }
230 setItemSize(m_d->requestedItemSize);
231 break;
232 }
234 break;
235 }
236 }
237 scrollTo(currentIndex(), QAbstractItemView::PositionAtCenter);
238}
float value(const T *src, size_t ch)
KRITAWIDGETUTILS_EXPORT QScroller * createPreconfiguredScroller(QAbstractScrollArea *target)
void currentResourceClicked(const QModelIndex &)
void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) override
KisResourceItemListView(QWidget *parent=nullptr)
Private(KisResourceItemListView *_q)
void slotScrollerStateChange(QScroller::State state)
bool viewportEvent(QEvent *event) override
QItemSelectionModel::SelectionFlags selectionCommand(const QModelIndex &index, const QEvent *event=nullptr) const override
void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) override
void currentResourceChanged(const QModelIndex &)
void setToolTipShouldRenderCheckers(bool value)
void setListViewMode(ListViewMode layout)
const QScopedPointer< Private > m_d
void setItemSize(QSize size)
setItemSize convenience function which sets both the icon and the grid size to the same value.
void resizeEvent(QResizeEvent *event) override
void contextMenuRequested(const QPoint &)
void setFixedToolTipThumbnailSize(const QSize &size)
void setStrictSelectionMode(bool enable)
setStrictSelectionMode sets additional restrictions on the selection.
void contextMenuEvent(QContextMenuEvent *event) override