Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsstylemodel.h
3 : : ---------------
4 : : begin : September 2018
5 : : copyright : (C) 2018 by Nyall Dawson
6 : : email : nyall dot dawson at gmail dot com
7 : : ***************************************************************************
8 : : * *
9 : : * This program is free software; you can redistribute it and/or modify *
10 : : * it under the terms of the GNU General Public License as published by *
11 : : * the Free Software Foundation; either version 2 of the License, or *
12 : : * (at your option) any later version. *
13 : : * *
14 : : ***************************************************************************/
15 : :
16 : : #ifndef QGSSTYLEMODEL_H
17 : : #define QGSSTYLEMODEL_H
18 : :
19 : : #include "qgis_core.h"
20 : : #include "qgis_sip.h"
21 : : #include "qgsstyle.h"
22 : : #include "qgssymbol.h"
23 : : #include <QAbstractItemModel>
24 : : #include <QSortFilterProxyModel>
25 : : #include <QIcon>
26 : : #include <QHash>
27 : :
28 : : class QgsSymbol;
29 : :
30 : : #ifndef SIP_RUN
31 : :
32 : : /**
33 : : * \ingroup core
34 : : * \class QgsAbstractStyleEntityIconGenerator
35 : : *
36 : : * \brief An abstract base class for icon generators for a QgsStyleModel.
37 : : *
38 : : * This base class allows for creation of specialized icon generators for
39 : : * entities in a style database, and allows for deferred icon generation.
40 : : *
41 : : * \note Not available in Python bindings
42 : : * \since QGIS 3.16
43 : : */
44 : : class CORE_EXPORT QgsAbstractStyleEntityIconGenerator : public QObject
45 : : {
46 : : Q_OBJECT
47 : :
48 : : public:
49 : :
50 : : /**
51 : : * Constructor for QgsAbstractStyleEntityIconGenerator, with the specified \a parent
52 : : * object.
53 : : */
54 : : QgsAbstractStyleEntityIconGenerator( QObject *parent );
55 : :
56 : : /**
57 : : * Triggers generation of an icon for an entity from the specified \a style database,
58 : : * with matching entity \a type and \a name.
59 : : */
60 : : virtual void generateIcon( QgsStyle *style, QgsStyle::StyleEntity type, const QString &name ) = 0;
61 : :
62 : : /**
63 : : * Sets the list of icon \a sizes to generate.
64 : : *
65 : : * \see iconSizes()
66 : : */
67 : : void setIconSizes( const QList< QSize > &sizes );
68 : :
69 : : /**
70 : : * Returns the list of icon \a sizes to generate.
71 : : *
72 : : * \see setIconSizes()
73 : : */
74 : : QList< QSize > iconSizes() const;
75 : :
76 : : signals:
77 : :
78 : : /**
79 : : * Emitted when the \a icon for the style entity with matching \a type and \a name
80 : : * has been generated.
81 : : */
82 : : void iconGenerated( QgsStyle::StyleEntity type, const QString &name, const QIcon &icon );
83 : :
84 : : private:
85 : :
86 : : QList< QSize > mIconSizes;
87 : :
88 : : };
89 : :
90 : : #endif
91 : :
92 : : /**
93 : : * \ingroup core
94 : : * \class QgsStyleModel
95 : : *
96 : : * \brief A QAbstractItemModel subclass for showing symbol and color ramp entities contained
97 : : * within a QgsStyle database.
98 : : *
99 : : * If you are creating a style model for the default application style (see QgsStyle::defaultStyle()),
100 : : * consider using the shared style model available at QgsApplication::defaultStyleModel() for performance
101 : : * instead.
102 : : *
103 : : * \see QgsStyleProxyModel
104 : : *
105 : : * \since QGIS 3.4
106 : : */
107 : : class CORE_EXPORT QgsStyleModel: public QAbstractItemModel
108 : : {
109 : 0 : Q_OBJECT
110 : :
111 : : public:
112 : :
113 : : //! Model columns
114 : : enum Column
115 : : {
116 : : Name = 0, //!< Name column
117 : : Tags, //!< Tags column
118 : : };
119 : :
120 : : //! Custom model roles
121 : : enum Role
122 : : {
123 : : TypeRole = Qt::UserRole + 1, //!< Style entity type, see QgsStyle::StyleEntity
124 : : TagRole, //!< String list of tags
125 : : SymbolTypeRole, //!< Symbol type (for symbol or legend patch shape entities)
126 : : IsFavoriteRole, //!< Whether entity is flagged as a favorite
127 : : LayerTypeRole, //!< Layer type (for label settings entities)
128 : : CompatibleGeometryTypesRole, //!< Compatible layer geometry types (for 3D symbols)
129 : : };
130 : :
131 : : /**
132 : : * Constructor for QgsStyleModel, for the specified \a style and \a parent object.
133 : : *
134 : : * The \a style object must exist for the lifetime of this model.
135 : : */
136 : : explicit QgsStyleModel( QgsStyle *style, QObject *parent SIP_TRANSFERTHIS = nullptr );
137 : :
138 : : /**
139 : : * Returns the style managed by the model.
140 : : *
141 : : * \since QGIS 3.10
142 : : */
143 : 0 : QgsStyle *style() { return mStyle; }
144 : :
145 : : QVariant data( const QModelIndex &index, int role ) const override;
146 : : bool setData( const QModelIndex &index, const QVariant &value, int role = Qt::EditRole ) override;
147 : : Qt::ItemFlags flags( const QModelIndex &index ) const override;
148 : : QVariant headerData( int section, Qt::Orientation orientation,
149 : : int role = Qt::DisplayRole ) const override;
150 : : QModelIndex index( int row, int column,
151 : : const QModelIndex &parent = QModelIndex() ) const override;
152 : : QModelIndex parent( const QModelIndex &index ) const override;
153 : : int rowCount( const QModelIndex &parent = QModelIndex() ) const override;
154 : : int columnCount( const QModelIndex &parent = QModelIndex() ) const override;
155 : :
156 : : /**
157 : : * Adds an additional icon \a size to generate for Qt::DecorationRole data.
158 : : *
159 : : * This allows style icons to be generated at an icon size which
160 : : * corresponds exactly to the view's icon size in which this model is used.
161 : : */
162 : : void addDesiredIconSize( QSize size );
163 : :
164 : : /**
165 : : * Sets the icon \a generator to use for deferred style entity icon generation.
166 : : *
167 : : * Currently this is used for 3D symbol icons only.
168 : : *
169 : : * \note Not available in Python bindings
170 : : * \since QGIS 3.16
171 : : */
172 : : static void setIconGenerator( QgsAbstractStyleEntityIconGenerator *generator ) SIP_SKIP;
173 : :
174 : : private slots:
175 : :
176 : : void onEntityAdded( QgsStyle::StyleEntity type, const QString &name );
177 : : void onEntityRemoved( QgsStyle::StyleEntity type, const QString &name );
178 : : void onEntityChanged( QgsStyle::StyleEntity type, const QString &name );
179 : : void onEntityRename( QgsStyle::StyleEntity type, const QString &oldName, const QString &newName );
180 : : void onTagsChanged( int entity, const QString &name, const QStringList &tags );
181 : : void rebuildSymbolIcons();
182 : : void iconGenerated( QgsStyle::StyleEntity type, const QString &name, const QIcon &icon );
183 : :
184 : : private:
185 : :
186 : : QgsStyle *mStyle = nullptr;
187 : :
188 : : QHash< QgsStyle::StyleEntity, QStringList > mEntityNames;
189 : :
190 : : QList< QSize > mAdditionalSizes;
191 : : mutable std::unique_ptr< QgsExpressionContext > mExpressionContext;
192 : :
193 : : mutable QHash< QgsStyle::StyleEntity, QHash< QString, QIcon > > mIconCache;
194 : :
195 : : static QgsAbstractStyleEntityIconGenerator *sIconGenerator;
196 : : mutable QSet< QString > mPending3dSymbolIcons;
197 : :
198 : : QgsStyle::StyleEntity entityTypeFromRow( int row ) const;
199 : :
200 : : int offsetForEntity( QgsStyle::StyleEntity entity ) const;
201 : :
202 : : };
203 : :
204 : : /**
205 : : * \ingroup core
206 : : * \class QgsStyleProxyModel
207 : : *
208 : : * \brief A QSortFilterProxyModel subclass for showing filtered symbol and color ramps entries from a QgsStyle database.
209 : : *
210 : : * \see QgsStyleModel
211 : : *
212 : : * \since QGIS 3.4
213 : : */
214 : : class CORE_EXPORT QgsStyleProxyModel: public QSortFilterProxyModel
215 : : {
216 : : Q_OBJECT
217 : :
218 : : public:
219 : :
220 : : /**
221 : : * Constructor for QgsStyleProxyModel, for the specified \a style and \a parent object.
222 : : *
223 : : * The \a style object must exist for the lifetime of this model.
224 : : */
225 : : explicit QgsStyleProxyModel( QgsStyle *style, QObject *parent SIP_TRANSFERTHIS = nullptr );
226 : :
227 : : /**
228 : : * Constructor for QgsStyleProxyModel, using the specified source \a model and \a parent object.
229 : : *
230 : : * The source \a model object must exist for the lifetime of this model.
231 : : */
232 : : explicit QgsStyleProxyModel( QgsStyleModel *model, QObject *parent SIP_TRANSFERTHIS = nullptr );
233 : :
234 : : /**
235 : : * Returns the current filter string, if set.
236 : : *
237 : : * \see setFilterString()
238 : : */
239 : : QString filterString() const { return mFilterString; }
240 : :
241 : : /**
242 : : * Returns the style entity type filter.
243 : : *
244 : : * \note This filter is only active if entityFilterEnabled() is TRUE.
245 : : * \see setEntityFilter()
246 : : */
247 : : QgsStyle::StyleEntity entityFilter() const;
248 : :
249 : : /**
250 : : * Sets the style entity type \a filter.
251 : : *
252 : : * \note This filter is only active if entityFilterEnabled() is TRUE.
253 : : *
254 : : * \see entityFilter()
255 : : */
256 : : void setEntityFilter( QgsStyle::StyleEntity filter );
257 : :
258 : : /**
259 : : * Sets the style entity type \a filters.
260 : : *
261 : : * \note These filters are only active if entityFilterEnabled() is TRUE.
262 : : * \note Not available in Python bindings
263 : : *
264 : : * \see setEntityFilter()
265 : : * \since QGIS 3.10
266 : : */
267 : : void setEntityFilters( const QList<QgsStyle::StyleEntity> &filters ) SIP_SKIP;
268 : :
269 : : /**
270 : : * Returns TRUE if filtering by entity type is enabled.
271 : : *
272 : : * \see setEntityFilterEnabled()
273 : : * \see entityFilter()
274 : : */
275 : : bool entityFilterEnabled() const;
276 : :
277 : : /**
278 : : * Sets whether filtering by entity type is \a enabled.
279 : : *
280 : : * If \a enabled is FALSE, then the value of entityFilter() will have no
281 : : * effect on the model filtering.
282 : : *
283 : : * \see entityFilterEnabled()
284 : : * \see setEntityFilter()
285 : : */
286 : : void setEntityFilterEnabled( bool enabled );
287 : :
288 : : /**
289 : : * Returns the symbol type filter.
290 : : *
291 : : * \note This filter is only active if symbolTypeFilterEnabled() is TRUE, and has
292 : : * no effect on non-symbol entities (i.e. color ramps).
293 : : *
294 : : * \see setSymbolType()
295 : : */
296 : : QgsSymbol::SymbolType symbolType() const;
297 : :
298 : : /**
299 : : * Sets the symbol \a type filter.
300 : : *
301 : : * \note This filter is only active if symbolTypeFilterEnabled() is TRUE.
302 : : *
303 : : * \see symbolType()
304 : : */
305 : : void setSymbolType( QgsSymbol::SymbolType type );
306 : :
307 : : /**
308 : : * Returns TRUE if filtering by symbol type is enabled.
309 : : *
310 : : * \see setSymbolTypeFilterEnabled()
311 : : * \see symbolType()
312 : : */
313 : : bool symbolTypeFilterEnabled() const;
314 : :
315 : : /**
316 : : * Sets whether filtering by symbol type is \a enabled.
317 : : *
318 : : * If \a enabled is FALSE, then the value of symbolType() will have no
319 : : * effect on the model filtering. This has
320 : : * no effect on non-symbol entities (i.e. color ramps).
321 : : *
322 : : * \see symbolTypeFilterEnabled()
323 : : * \see setSymbolType()
324 : : */
325 : : void setSymbolTypeFilterEnabled( bool enabled );
326 : :
327 : : /**
328 : : * Returns the layer type filter, or QgsWkbTypes::UnknownGeometry if no
329 : : * layer type filter is present.
330 : : *
331 : : * This setting has an effect on label settings entities and 3d symbols only.
332 : : *
333 : : * \see setLayerType()
334 : : */
335 : : QgsWkbTypes::GeometryType layerType() const;
336 : :
337 : : /**
338 : : * Sets the layer \a type filter. Set \a type to QgsWkbTypes::UnknownGeometry if no
339 : : * layer type filter is desired.
340 : : *
341 : : * \see layerType()
342 : : */
343 : : void setLayerType( QgsWkbTypes::GeometryType type );
344 : :
345 : : /**
346 : : * Sets a tag \a id to filter style entities by. Only entities with the given
347 : : * tag will be shown in the model.
348 : : *
349 : : * Set \a id to -1 to disable tag filtering.
350 : : *
351 : : * \see tagId()
352 : : */
353 : : void setTagId( int id );
354 : :
355 : : /**
356 : : * Returns the tag id used to filter style entities by.
357 : : *
358 : : * If returned value is -1, then no tag filtering is being conducted.
359 : : *
360 : : * \see setTagId()
361 : : */
362 : : int tagId() const;
363 : :
364 : : /**
365 : : * Sets a smart group \a id to filter style entities by. Only entities within the given
366 : : * smart group will be shown in the model.
367 : : *
368 : : * Set \a id to -1 to disable smart group filtering.
369 : : *
370 : : * \see smartGroupId()
371 : : */
372 : : void setSmartGroupId( int id );
373 : :
374 : : /**
375 : : * Returns the smart group id used to filter style entities by.
376 : : *
377 : : * If returned value is -1, then no smart group filtering is being conducted.
378 : : *
379 : : * \see setSmartGroupId()
380 : : */
381 : : int smartGroupId() const;
382 : :
383 : : bool filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const override;
384 : :
385 : : /**
386 : : * Returns TRUE if the model is showing only favorited entities.
387 : : *
388 : : * \see setFavoritesOnly()
389 : : */
390 : : bool favoritesOnly() const;
391 : :
392 : : /**
393 : : * Sets whether the model should show only favorited entities.
394 : : *
395 : : * \see setFavoritesOnly()
396 : : */
397 : : void setFavoritesOnly( bool favoritesOnly );
398 : :
399 : : /**
400 : : * Adds an additional icon \a size to generate for Qt::DecorationRole data.
401 : : *
402 : : * This allows style icons to be generated at an icon size which
403 : : * corresponds exactly to the view's icon size in which this model is used.
404 : : */
405 : : void addDesiredIconSize( QSize size );
406 : :
407 : : public slots:
408 : :
409 : : /**
410 : : * Sets a \a filter string, such that only symbol entities with names matching the
411 : : * specified string will be shown.
412 : : *
413 : : * \see filterString()
414 : : */
415 : : void setFilterString( const QString &filter );
416 : :
417 : : private:
418 : :
419 : : void initialize();
420 : :
421 : : QgsStyleModel *mModel = nullptr;
422 : : QgsStyle *mStyle = nullptr;
423 : :
424 : : QString mFilterString;
425 : :
426 : : int mTagId = -1;
427 : : QStringList mTaggedSymbolNames;
428 : :
429 : : int mSmartGroupId = -1;
430 : : QStringList mSmartGroupSymbolNames;
431 : :
432 : : bool mFavoritesOnly = false;
433 : :
434 : : bool mEntityFilterEnabled = false;
435 : : QList< QgsStyle::StyleEntity > mEntityFilters = QList< QgsStyle::StyleEntity >() << QgsStyle::SymbolEntity;
436 : :
437 : : bool mSymbolTypeFilterEnabled = false;
438 : : QgsSymbol::SymbolType mSymbolType = QgsSymbol::Marker;
439 : :
440 : : QgsWkbTypes::GeometryType mLayerType = QgsWkbTypes::UnknownGeometry;
441 : :
442 : : };
443 : :
444 : : #endif //QGSSTYLEMODEL_H
|