digiKam
Loading...
Searching...
No Matches
dcategorizedview_p.h
Go to the documentation of this file.
1/* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2010-01-16
7 * Description : Item view for listing items in a categorized fashion optionally
8 *
9 * SPDX-FileCopyrightText: 2007 by Rafael Fernández López <ereslibre at kde dot org>
10 * SPDX-FileCopyrightText: 2009-2012 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
11 * SPDX-FileCopyrightText: 2011-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
12 *
13 * SPDX-License-Identifier: GPL-2.0-or-later
14 *
15 * ============================================================ */
16
17#pragma once
18
19#include "dcategorizedview.h"
20
21// C++ includes
22
23#include <cmath>
24
25// Qt includes
26
27#include <QVector>
28#include <QPainter>
29#include <QScrollBar>
30#include <QPaintEvent>
31
32// Local includes
33
35#include "dcategorydrawer.h"
36
43#define DOLPHIN_DRAGANDDROP
44
45class DCategoryDrawer;
46
47namespace Digikam
48{
49
50class DCategorizedSortFilterProxyModel;
51
52class Q_DECL_HIDDEN SparseModelIndexVector : public QVector<QModelIndex>
53{
54public:
55
56 explicit SparseModelIndexVector(int rowCount, QAbstractItemModel* const model_, int column_)
57 : QVector<QModelIndex>(rowCount),
58 model (model_),
59 column (column_)
60 {
61 }
62
63 inline QModelIndex& operator[](int i)
64 {
65 QModelIndex& index = QVector<QModelIndex>::operator[](i);
66
67 if (!index.isValid())
68 {
69 index = model->index(i, column);
70 }
71
72 return index;
73 }
74
75private:
76
77 // not to be used
78
79 const QModelIndex& operator[](int i) const
80 {
81 return QVector<QModelIndex>::operator[](i);
82 }
83
84private:
85
86 QAbstractItemModel* model = nullptr;
87 int column = 0;
88};
89
90// ------------------------------------------------------------------------------------
91
92class Q_DECL_HIDDEN DCategorizedView::Private
93{
94public:
95
96 explicit Private(DCategorizedView* const listView);
97 ~Private() = default;
98
99 // Methods
100
104 const QModelIndexList& intersectionSet(const QRect& rect);
105
109 QRect visualRectInViewport(const QModelIndex& index) const;
110
114 QRect visualCategoryRectInViewport(const QString& category) const;
115
119 const QRect& cacheIndex(const QModelIndex& index);
120
124 const QRect& cacheCategory(const QString& category);
125
130 const QRect& cachedRectIndex(const QModelIndex& index);
131
136 const QRect& cachedRectCategory(const QString& category);
137
142 QRect visualRect(const QModelIndex& index);
143
148 QRect categoryVisualRect(const QString& category);
149
153 QSize contentsSize();
154
160 void drawNewCategory(const QModelIndex& index,
161 int sortRole,
162 const QStyleOption& option,
163 QPainter* painter);
164
169 void updateScrollbars();
170
174 void drawDraggedItems(QPainter* painter);
175
180 void drawDraggedItems();
181
186 int categoryUpperBound(SparseModelIndexVector& modelIndexList, int begin, int averageSize = 0);
187
191 QItemSelection selectionForRect(const QRect& rect);
192
193public:
194
196
197 class Q_DECL_HIDDEN ElementInfo
198 {
199 public:
200
201 ElementInfo() = default;
202
203 QString category;
204 int relativeOffsetToCategory = 0;
205 };
206
207public:
208
210
211 DCategorizedView* listView = nullptr;
212 DCategoryDrawer* categoryDrawer = nullptr;
213 QSize biggestItemSize = QSize(0, 0);
214
216 bool mouseButtonPressed = false;
217 bool rightMouseButtonPressed = false;
218 bool dragLeftViewport = false;
219 bool drawItemsWhileDragging = true;
220 QModelIndex hovered;
224 int forcedSelectionPosition = 0;
225
232 QVector<ElementInfo> elementsInfo;
233 QHash<int, QRect> elementsPosition;
234 QHash<QString, QVector<int> > categoriesIndexes;
235 QHash<QString, QRect> categoriesPosition;
236 QStringList categories;
237 QModelIndexList intersectedIndexes;
239 QItemSelection lastCategorySelection;
240 QItemSelection lastSelection;
241
243
244 DCategorizedSortFilterProxyModel* proxyModel = nullptr;
245};
246
247} // namespace Digikam
Definition dcategorizedsortfilterproxymodel.h:43
Attributes.
Definition dcategorizedview_p.h:198
QString category
Definition dcategorizedview_p.h:203
Definition dcategorizedview_p.h:93
QRect lastDraggedItemsRect
Definition dcategorizedview_p.h:238
QPoint initialPressPosition
Definition dcategorizedview_p.h:222
QHash< QString, QVector< int > > categoriesIndexes
Definition dcategorizedview_p.h:234
QItemSelection lastSelection
Definition dcategorizedview_p.h:240
QString hoveredCategory
Definition dcategorizedview_p.h:221
QVector< ElementInfo > elementsInfo
Definition dcategorizedview_p.h:232
QModelIndexList intersectedIndexes
Definition dcategorizedview_p.h:237
QHash< int, QRect > elementsPosition
Definition dcategorizedview_p.h:233
QItemSelection lastCategorySelection
Definition dcategorizedview_p.h:239
QPoint mousePosition
Definition dcategorizedview_p.h:223
QModelIndex hovered
Definition dcategorizedview_p.h:220
QHash< QString, QRect > categoriesPosition
Definition dcategorizedview_p.h:235
QStringList categories
Definition dcategorizedview_p.h:236
Item view for listing items.
Definition dcategorizedview.h:39
Definition dcategorydrawer.h:42
Definition dcategorizedview_p.h:53
SparseModelIndexVector(int rowCount, QAbstractItemModel *const model_, int column_)
Definition dcategorizedview_p.h:56
QModelIndex & operator[](int i)
Definition dcategorizedview_p.h:63
Definition datefolderview.cpp:34