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 bool strictSelectionMode {false};
22
23 QScroller* scroller {0};
25
26 QSize requestedItemSize = QSize(56, 56);
27};
28
30 : QListView(parent)
31 , m_d(new Private)
32{
33 setSelectionMode(QAbstractItemView::SingleSelection);
34 setContextMenuPolicy(Qt::DefaultContextMenu);
35 setResizeMode(QListView::Adjust);
36 setUniformItemSizes(true);
37
38 // Default configuration
39 setViewMode(QListView::IconMode);
40 setGridSize(QSize(56, 56));
41 setIconSize(QSize(56, 56));
42 setResizeMode(QListView::Adjust);
43 setUniformItemSizes(true);
44
46 if (m_d->scroller) {
47 connect(m_d->scroller, SIGNAL(stateChanged(QScroller::State)), this, SLOT(slotScrollerStateChange(QScroller::State)));
48 }
49
50 connect(this, SIGNAL(clicked(QModelIndex)), SIGNAL(currentResourceClicked(const QModelIndex &)));
51
52 m_d->prev_scrollbar_style = horizontalScrollBar()->styleSheet();
53}
54
58
60{
61 m_d->viewMode = viewMode;
62
63 auto restoreScrollbar = [&, this] () {
64 horizontalScrollBar()->setStyleSheet(m_d->prev_scrollbar_style);
65 setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAsNeeded);
66 };
67
68 switch (viewMode) {
70 setViewMode(ViewMode::IconMode);
71 setFlow(Flow::LeftToRight);
72 setWrapping(true);
73 restoreScrollbar();
74
75 setItemSize(m_d->requestedItemSize);
76 break;
77 }
79 setViewMode(ViewMode::IconMode);
80 setFlow(Flow::LeftToRight);
81 setWrapping(false);
82
83 // this is the only way to hide it and not have it occupy space
84 horizontalScrollBar()->setStyleSheet("QScrollBar::horizontal {height: 0px;}");
85 setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff);
86
87 setItemSize(m_d->requestedItemSize);
88 break;
89 }
91 setViewMode(ViewMode::ListMode);
92 setFlow(Flow::TopToBottom);
93 setWrapping(false);
94 restoreScrollbar();
95 setItemSize(m_d->requestedItemSize);
96 // horizontalScrollBar()->setStyleSheet(m_d->prev_scrollbar_style);
97 setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAsNeeded);
98 setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAsNeeded);
99 break;
100 }
101 }
102}
103
105{
106 m_d->requestedItemSize = size;
107
108 switch (m_d->viewMode) {
110 setGridSize(size);
111 setIconSize(size);
112 break;
113 }
115 // you can not set the item size in strip mode
116 // it is configured automatically based on size
117 break;
118 }
120 const int w = width() - horizontalScrollBar()->width();
121 setGridSize(QSize(w, size.height()));
122 setIconSize(QSize(size));
123 break;
124 }
125 }
126}
127
129{
130 m_d->strictSelectionMode = enable;
131}
132
134{
135 m_d->tip.setFixedToolTipThumbnailSize(size);
136}
137
139{
140 m_d->tip.setToolTipShouldRenderCheckers(value);
141}
142
143void KisResourceItemListView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
144{
145 // QAbstractItemView moves the current index if the row it points to is removed,
146 // which we don't want for strict selections
147 QModelIndex current = currentIndex();
148 if (selectionMode() == SingleSelection
149 && m_d->strictSelectionMode
150 && current.isValid()
151 && current.row() >= start
152 && current.row() <= end) {
153
154 selectionModel()->clear();
155 }
156 QListView::rowsAboutToBeRemoved(parent, start, end);
157}
158
159void KisResourceItemListView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
160{
161 // base class takes care of viewport updates
162 QListView::selectionChanged(selected, deselected);
163
164 if (selected.isEmpty()) {
165 Q_EMIT currentResourceChanged(QModelIndex());
166 }
167 else {
168 Q_EMIT currentResourceChanged(selected.indexes().first());
169 }
170}
171
172QItemSelectionModel::SelectionFlags KisResourceItemListView::selectionCommand(const QModelIndex &index, const QEvent *event) const
173{
174 QItemSelectionModel::SelectionFlags cmd = QListView::selectionCommand(index, event);
175
176 // avoid deselecting the current item by Ctrl-clicking in single selection mode
177 if (selectionMode() == SingleSelection
178 && m_d->strictSelectionMode
179 && cmd.testFlag(QItemSelectionModel::Deselect)) {
180
181 cmd = QItemSelectionModel::NoUpdate;
182 }
183 return cmd;
184}
185
186void KisResourceItemListView::contextMenuEvent(QContextMenuEvent *event)
187{
188 QListView::contextMenuEvent(event);
189 Q_EMIT contextMenuRequested(event->globalPos());
190}
191
193{
194 if (!model()) return true;
195
196 if (event->type() == QEvent::ToolTip) {
197 QHelpEvent *he = static_cast<QHelpEvent *>(event);
198#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
199 QStyleOptionViewItem option = viewOptions();
200#else
201 QStyleOptionViewItem option;
202 initViewItemOption(&option);
203#endif
204 QModelIndex index = model()->buddy(indexAt(he->pos()));
205 if (index.isValid()) {
206 option.rect = visualRect(index);
207 m_d->tip.showTip(this, he->pos(), option, index);
208 return true;
209 }
210 m_d->tip.hide();
211 }
212
213 return QListView::viewportEvent(event);
214}
215
217{
218 QListView::resizeEvent(event);
219
220 switch (m_d->viewMode) {
222 const int height = event->size().height();
223 setGridSize(QSize(height, height));
224 setIconSize(QSize(height, height));
225 break;
226 }
228 setItemSize(m_d->requestedItemSize);
229 }
230 }
231 scrollTo(currentIndex(), QAbstractItemView::PositionAtCenter);
232}
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KRITAWIDGETUTILS_EXPORT QScroller * createPreconfiguredScroller(QAbstractScrollArea *target)
void currentResourceClicked(const QModelIndex &)
void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) override
KisResourceItemListView(QWidget *parent=nullptr)
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