QGIS API Documentation  3.0.2-Girona (307d082)
qgsmapthemecollection.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsmapthemecollection.h
3  --------------------------------------
4  Date : September 2014
5  Copyright : (C) 2014 by Martin Dobias
6  Email : wonder dot sk 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 QGSMAPTHEMECOLLECTION_H
17 #define QGSMAPTHEMECOLLECTION_H
18 
19 #include "qgis_core.h"
20 #include "qgis_sip.h"
21 #include <QMap>
22 #include <QObject>
23 #include <QPointer>
24 #include <QSet>
25 #include <QStringList>
26 
27 #include "qgsmaplayer.h"
28 
29 class QDomDocument;
30 class QgsLayerTreeModel;
31 class QgsLayerTreeNode;
32 class QgsLayerTreeGroup;
33 class QgsLayerTreeLayer;
34 class QgsProject;
35 
44 class CORE_EXPORT QgsMapThemeCollection : public QObject
45 {
46  Q_OBJECT
47 
48  Q_PROPERTY( QStringList mapThemes READ mapThemes NOTIFY mapThemesChanged )
49  Q_PROPERTY( QgsProject *project READ project WRITE setProject NOTIFY projectChanged )
50 
51  public:
52 
58  class CORE_EXPORT MapThemeLayerRecord
59  {
60  public:
62  MapThemeLayerRecord( QgsMapLayer *l = nullptr ): mLayer( l ) {}
63 
65  {
66  return mLayer == other.mLayer &&
67  usingCurrentStyle == other.usingCurrentStyle && currentStyle == other.currentStyle &&
68  usingLegendItems == other.usingLegendItems && checkedLegendItems == other.checkedLegendItems;
69  }
71  {
72  return !( *this == other );
73  }
74 
76  QgsMapLayer *layer() const { return mLayer; }
77 
79  void setLayer( QgsMapLayer *layer );
80 
82  bool usingCurrentStyle = false;
84  QString currentStyle;
86  bool usingLegendItems = false;
88  QSet<QString> checkedLegendItems;
89  private:
92  };
93 
100  class CORE_EXPORT MapThemeRecord
101  {
102  public:
103 
105  {
106  return validLayerRecords() == other.validLayerRecords();
107  }
109  {
110  return !( *this == other );
111  }
112 
114  QList<QgsMapThemeCollection::MapThemeLayerRecord> layerRecords() const { return mLayerRecords; }
115 
117  void setLayerRecords( const QList<QgsMapThemeCollection::MapThemeLayerRecord> &records ) { mLayerRecords = records; }
118 
120  void removeLayerRecord( QgsMapLayer *layer );
121 
123  void addLayerRecord( const QgsMapThemeCollection::MapThemeLayerRecord &record );
124 
129  QHash<QgsMapLayer *, QgsMapThemeCollection::MapThemeLayerRecord> validLayerRecords() const SIP_SKIP;
130 
131  private:
133  QList<MapThemeLayerRecord> mLayerRecords;
134 
135  friend class QgsMapThemeCollection;
136  };
137 
142 
147  bool hasMapTheme( const QString &name ) const;
148 
153  void insert( const QString &name, const QgsMapThemeCollection::MapThemeRecord &state );
154 
161  void update( const QString &name, const QgsMapThemeCollection::MapThemeRecord &state );
162 
167  void removeMapTheme( const QString &name );
168 
170  void clear();
171 
176  QStringList mapThemes() const;
177 
182  QgsMapThemeCollection::MapThemeRecord mapThemeState( const QString &name ) const { return mMapThemes[name]; }
183 
191  QStringList mapThemeVisibleLayerIds( const QString &name ) const;
192 
200  QList<QgsMapLayer *> mapThemeVisibleLayers( const QString &name ) const;
201 
206  QMap<QString, QString> mapThemeStyleOverrides( const QString &name );
207 
213  void readXml( const QDomDocument &doc );
214 
220  void writeXml( QDomDocument &doc );
221 
228 
234  void applyTheme( const QString &name, QgsLayerTreeGroup *root, QgsLayerTreeModel *model );
235 
241  QgsProject *project();
242 
247  void setProject( QgsProject *project );
248 
255  QList< QgsMapLayer * > masterLayerOrder() const;
256 
264  QList< QgsMapLayer * > masterVisibleLayers() const;
265 
266  signals:
267 
272  void mapThemesChanged();
273 
278  void mapThemeChanged( const QString &theme );
279 
286  void projectChanged();
287 
288  private slots:
289 
293  void registryLayersRemoved( const QStringList &layerIDs );
294 
296  void layerStyleRenamed( const QString &oldName, const QString &newName );
297 
298  private:
299 
303  void applyMapThemeCheckedLegendNodesToLayer( const MapThemeLayerRecord &layerRec, QgsMapLayer *layer );
304 
308  void reconnectToLayersStyleManager();
309 
310  static bool findRecordForLayer( QgsMapLayer *layer, const MapThemeRecord &rec, MapThemeLayerRecord &layerRec );
311  static MapThemeLayerRecord createThemeLayerRecord( QgsLayerTreeLayer *nodeLayer, QgsLayerTreeModel *model );
313  static void applyThemeToLayer( QgsLayerTreeLayer *nodeLayer, QgsLayerTreeModel *model, const MapThemeRecord &rec );
314  static void applyThemeToGroup( QgsLayerTreeGroup *parent, QgsLayerTreeModel *model, const MapThemeRecord &rec );
315 
316  typedef QMap<QString, MapThemeRecord> MapThemeRecordMap;
317  MapThemeRecordMap mMapThemes;
319  QgsProject *mProject = nullptr;
320 };
321 
322 
323 #endif // QGSMAPTHEMECOLLECTION_H
Layer tree group node serves as a container for layers and further groups.
bool operator!=(const QgsMapThemeCollection::MapThemeLayerRecord &other) const
QgsMapLayer * layer() const
Returns map layer or null if the layer does not exist anymore.
Base class for all map layer types.
Definition: qgsmaplayer.h:56
void setProject(QgsProject *project)
The QgsProject on which this map theme collection works.
bool hasMapTheme(const QString &name) const
Returns whether a map theme with a matching name exists.
QList< QgsMapLayer * > mapThemeVisibleLayers(const QString &name) const
Returns the list of layers that are visible for the specified map theme.
QMap< QString, QString > mapThemeStyleOverrides(const QString &name)
Get layer style overrides (for QgsMapSettings) of the visible layers for given map theme...
QHash< QgsMapLayer *, QgsMapThemeCollection::MapThemeLayerRecord > validLayerRecords() const
Return set with only records for valid layers.
QgsMapThemeCollection::MapThemeRecord mapThemeState(const QString &name) const
Returns the recorded state of a map theme.
Individual map theme record of visible layers and styles.
MapThemeLayerRecord(QgsMapLayer *l=nullptr)
Initialize layer record with a map layer - it will be stored as a weak pointer.
void update(const QString &name, const QgsMapThemeCollection::MapThemeRecord &state)
Updates a map theme within the collection.
void clear()
Remove all map themes from the collection.
Individual record of a visible layer in a map theme record.
QPointer< QgsMapLayer > QgsWeakMapLayerPointer
Weak pointer for QgsMapLayer.
Definition: qgsmaplayer.h:1349
void mapThemesChanged()
Emitted when map themes within the collection are changed.
QStringList mapThemeVisibleLayerIds(const QString &name) const
Returns the list of layer IDs that are visible for the specified map theme.
void readXml(const QDomDocument &doc)
Reads the map theme collection state from XML.
void projectChanged()
Emitted when the project changes.
The QgsLayerTreeModel class is model implementation for Qt item views framework.
QList< QgsMapLayer *> masterVisibleLayers() const
Returns the master list of visible layers.
void mapThemeChanged(const QString &theme)
Emitted when a map theme changes definition.
bool operator==(const QgsMapThemeCollection::MapThemeLayerRecord &other) const
QgsMapThemeCollection(QgsProject *project=nullptr)
Create map theme collection that handles themes of the given project.
#define SIP_SKIP
Definition: qgis_sip.h:119
QList< QgsMapLayer *> masterLayerOrder() const
Returns the master layer order (this will always match the project&#39;s QgsProject::layerOrder() )...
void removeMapTheme(const QString &name)
Remove an existing map theme from collection.
void setLayerRecords(const QList< QgsMapThemeCollection::MapThemeLayerRecord > &records)
Sets layer records for the theme.
QSet< QString > checkedLegendItems
Rule keys of check legend items in layer tree model.
QStringList mapThemes() const
Returns a list of existing map theme names.
This class is a base class for nodes in a layer tree.
Reads and writes project states.
Definition: qgsproject.h:82
bool operator!=(const QgsMapThemeCollection::MapThemeRecord &other) const
void applyTheme(const QString &name, QgsLayerTreeGroup *root, QgsLayerTreeModel *model)
Apply theme given by its name and modify layer tree, current style of layers and checked legend items...
void insert(const QString &name, const QgsMapThemeCollection::MapThemeRecord &state)
Inserts a new map theme to the collection.
QgsProject * project()
The QgsProject on which this map theme collection works.
QList< QgsMapThemeCollection::MapThemeLayerRecord > layerRecords() const
Returns a list of records for all visible layer belonging to the theme.
Container class that allows storage of map themes consisting of visible map layers and layer styles...
static QgsMapThemeCollection::MapThemeRecord createThemeFromCurrentState(QgsLayerTreeGroup *root, QgsLayerTreeModel *model)
Static method to create theme from the current state of layer visibilities in layer tree...
QString currentStyle
Name of the current style of the layer.
bool usingCurrentStyle
Whether current style is valid and should be applied.
void writeXml(QDomDocument &doc)
Writes the map theme collection state to XML.
bool operator==(const QgsMapThemeCollection::MapThemeRecord &other) const
bool usingLegendItems
Whether checkedLegendItems should be applied.
Layer tree node points to a map layer.