digiKam
Loading...
Searching...
No Matches
abstractmarkertiler.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 : 2009-12-01
7 * Description : An abstract base class for tiling of markers
8 *
9 * SPDX-FileCopyrightText: 2009-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
10 * SPDX-FileCopyrightText: 2009-2011 by Michael G. Hansen <mike at mghansen dot de>
11 *
12 * SPDX-License-Identifier: GPL-2.0-or-later
13 *
14 * ============================================================ */
15
16#pragma once
17
18// Qt includes
19
20#include <QBitArray>
21#include <QObject>
22#include <QPoint>
23
24// Local includes
25
26#include "tileindex.h"
27#include "geoifacetypes.h"
28#include "digikam_export.h"
29#include "geogroupstate.h"
30
31namespace Digikam
32{
33
34class DIGIKAM_EXPORT AbstractMarkerTiler : public QObject
35{
36 Q_OBJECT
37
38public:
39
41 {
42 FlagNull = 0,
43 FlagMovable = 1
44 };
45
46 Q_DECLARE_FLAGS(TilerFlags, TilerFlag)
47
48public:
49
51 {
52 public:
53
54 ClickInfo() = default;
55
56 public:
57
60 GeoGroupState groupSelectionState;
61 GeoMouseModes currentMouseMode;
62 };
63
64public:
65
66 class Tile
67 {
68 public:
69
70 Tile() = default;
71 ~Tile();
72
73 public:
74
75 Tile* getChild(const int linearIndex);
76
77 Tile* addChild(const int linearIndex, Tile* tilePointer);
78
82 void deleteChild(Tile* const childTile, const int knownLinearIndex = -1);
83
84 bool childrenEmpty() const;
85
89 int nextNonEmptyIndex(int linearIndex) const;
90
91 private:
92
93 // Disable
94 Tile(const Tile&) = delete;
95 Tile& operator=(const Tile&) = delete;
96
97 private:
98
99 static int maxChildCount();
100
101 void prepareForChildren();
102
103 private:
104
105 QVector<Tile*> children;
106 QVector<int> nonEmptyIndices;
107 };
108
109public:
110
112 {
113 public:
114
115 NonEmptyIterator(AbstractMarkerTiler* const model, const int level);
116 NonEmptyIterator(AbstractMarkerTiler* const model, const int level, const TileIndex& startIndex, const TileIndex& endIndex);
117 NonEmptyIterator(AbstractMarkerTiler* const model, const int level, const GeoCoordinates::PairList& normalizedMapBounds);
119
120 bool atEnd() const;
121 TileIndex nextIndex();
122 TileIndex currentIndex() const;
123 AbstractMarkerTiler* model() const;
124
125 private:
126
127 bool initializeNextBounds();
128
129 private:
130
131 // Disable
132 NonEmptyIterator(const NonEmptyIterator&) = delete;
133 NonEmptyIterator& operator=(const NonEmptyIterator&) = delete;
134
135 private:
136
137 class Private;
138 Private* const d = nullptr;
139 };
140
141public:
142
143 explicit AbstractMarkerTiler(QObject* const parent = nullptr);
144 ~AbstractMarkerTiler() override;
145
147 virtual TilerFlags tilerFlags() const;
148 virtual Tile* tileNew() = 0;
149 virtual void prepareTiles(const GeoCoordinates& upperLeft, const GeoCoordinates& lowerRight, int level) = 0;
150 virtual void regenerateTiles() = 0;
151 virtual Tile* getTile(const TileIndex& tileIndex, const bool stopIfEmpty) = 0;
152 virtual int getTileMarkerCount(const TileIndex& tileIndex) = 0;
153 virtual int getTileSelectedCount(const TileIndex& tileIndex) = 0;
154
156 virtual QVariant getTileRepresentativeMarker(const TileIndex& tileIndex, const int sortKey) = 0;
157 virtual QVariant bestRepresentativeIndexFromList(const QList<QVariant>& indices, const int sortKey) = 0;
158 virtual QPixmap pixmapFromRepresentativeIndex(const QVariant& index, const QSize& size) = 0;
159 virtual bool indicesEqual(const QVariant& a, const QVariant& b) const = 0;
160 virtual GeoGroupState getTileGroupState(const TileIndex& tileIndex) = 0;
161 virtual GeoGroupState getGlobalGroupState() = 0;
162
164 virtual void onIndicesClicked(const ClickInfo& clickInfo);
165 virtual void onIndicesMoved(const TileIndex::List& tileIndicesList, const GeoCoordinates& targetCoordinates,
166 const QPersistentModelIndex& targetSnapIndex);
167
168 virtual void setActive(const bool state) = 0;
169 Tile* rootTile();
170 bool indicesEqual(const QIntList& a, const QIntList& b, const int upToLevel) const;
171 bool isDirty() const;
172 void setDirty(const bool state = true);
173 void resetRootTile();
174
175Q_SIGNALS:
176
178 void signalThumbnailAvailableForIndex(const QVariant& index, const QPixmap& pixmap);
179
180private:
181
182 class Private;
183 Private* const d = nullptr;
184};
185
186} // namespace Digikam
187
188Q_DECLARE_OPERATORS_FOR_FLAGS(Digikam::AbstractMarkerTiler::TilerFlags)
Definition abstractmarkertiler.h:51
TileIndex::List tileIndicesList
Definition abstractmarkertiler.h:58
GeoGroupState groupSelectionState
Definition abstractmarkertiler.h:60
GeoMouseModes currentMouseMode
Definition abstractmarkertiler.h:61
QVariant representativeIndex
Definition abstractmarkertiler.h:59
Definition abstractmarkertiler.h:112
Definition abstractmarkertiler.h:67
Definition abstractmarkertiler.h:35
virtual int getTileMarkerCount(const TileIndex &tileIndex)=0
virtual void setActive(const bool state)=0
void signalThumbnailAvailableForIndex(const QVariant &index, const QPixmap &pixmap)
virtual Tile * tileNew()=0
virtual QVariant bestRepresentativeIndexFromList(const QList< QVariant > &indices, const int sortKey)=0
virtual bool indicesEqual(const QVariant &a, const QVariant &b) const =0
TilerFlag
Definition abstractmarkertiler.h:41
bool indicesEqual(const QIntList &a, const QIntList &b, const int upToLevel) const
virtual GeoGroupState getTileGroupState(const TileIndex &tileIndex)=0
virtual QVariant getTileRepresentativeMarker(const TileIndex &tileIndex, const int sortKey)=0
These should be implemented for thumbnail handling.
virtual int getTileSelectedCount(const TileIndex &tileIndex)=0
virtual Tile * getTile(const TileIndex &tileIndex, const bool stopIfEmpty)=0
virtual void prepareTiles(const GeoCoordinates &upperLeft, const GeoCoordinates &lowerRight, int level)=0
virtual QPixmap pixmapFromRepresentativeIndex(const QVariant &index, const QSize &size)=0
virtual void regenerateTiles()=0
virtual GeoGroupState getGlobalGroupState()=0
Definition geocoordinates.h:44
QList< GeoCoordinates::Pair > PairList
Definition geocoordinates.h:60
Definition tileindex.h:35
QList< TileIndex > List
Definition tileindex.h:93
Definition datefolderview.cpp:34
QList< int > QIntList
Definition geoifacetypes.h:48