QGIS API Documentation 3.99.0-Master (18a1e75d814)
Loading...
Searching...
No Matches
qgsmaplayerstylemanagerwidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsmaplayerstylemanagerwidget.cpp
3 ---------------------
4 begin : June 2016
5 copyright : (C) 2016 by Nathan Woodrow
6 email : woodrow dot nathan 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 ***************************************************************************/
16
17#include "qgsapplication.h"
18#include "qgslogger.h"
19#include "qgsmapcanvas.h"
20#include "qgsmaplayer.h"
24#include "qgspointcloudlayer.h"
27#include "qgstiledscenelayer.h"
29#include "qgsvectorlayer.h"
31#include "qgsvectortilelayer.h"
33
34#include <QAction>
35#include <QFileDialog>
36#include <QInputDialog>
37#include <QMessageBox>
38#include <QString>
39#include <QToolBar>
40#include <QVBoxLayout>
41
42#include "moc_qgsmaplayerstylemanagerwidget.cpp"
43
44using namespace Qt::StringLiterals;
45
47 : QgsMapLayerConfigWidget( layer, canvas, parent )
48{
49 mModel = new QStandardItemModel( this );
50 mStyleList = new QListView( this );
51 mStyleList->setModel( mModel );
52 mStyleList->setViewMode( QListView::ListMode );
53 mStyleList->setResizeMode( QListView::Adjust );
54
55 QToolBar *toolbar = new QToolBar( this );
56 QAction *addAction = toolbar->addAction( tr( "Add" ) );
57 addAction->setIcon( QgsApplication::getThemeIcon( u"symbologyAdd.svg"_s ) );
58 connect( addAction, &QAction::triggered, this, &QgsMapLayerStyleManagerWidget::addStyle );
59 QAction *removeAction = toolbar->addAction( tr( "Remove Current" ) );
60 removeAction->setIcon( QgsApplication::getThemeIcon( u"symbologyRemove.svg"_s ) );
61 connect( removeAction, &QAction::triggered, this, &QgsMapLayerStyleManagerWidget::removeStyle );
62 QAction *loadFromFileAction = toolbar->addAction( tr( "Load Style" ) );
63 loadFromFileAction->setIcon( QgsApplication::getThemeIcon( u"/mActionFileOpen.svg"_s ) );
64 connect( loadFromFileAction, &QAction::triggered, this, &QgsMapLayerStyleManagerWidget::loadStyle );
65 QAction *saveAction = toolbar->addAction( tr( "Save Style" ) );
66 saveAction->setIcon( QgsApplication::getThemeIcon( u"mActionFileSave.svg"_s ) );
67 connect( saveAction, &QAction::triggered, this, &QgsMapLayerStyleManagerWidget::saveStyle );
68 QAction *saveAsDefaultAction = toolbar->addAction( tr( "Save as Default" ) );
69 connect( saveAsDefaultAction, &QAction::triggered, this, &QgsMapLayerStyleManagerWidget::saveAsDefault );
70 QAction *loadDefaultAction = toolbar->addAction( tr( "Restore Default" ) );
71 connect( loadDefaultAction, &QAction::triggered, this, &QgsMapLayerStyleManagerWidget::loadDefault );
72
73 connect( mStyleList, &QAbstractItemView::clicked, this, &QgsMapLayerStyleManagerWidget::styleClicked );
74
75 setLayout( new QVBoxLayout() );
76 layout()->setContentsMargins( 0, 0, 0, 0 );
77 layout()->addWidget( toolbar );
78 layout()->addWidget( mStyleList );
79
80 connect( mLayer->styleManager(), &QgsMapLayerStyleManager::currentStyleChanged, this, &QgsMapLayerStyleManagerWidget::currentStyleChanged );
81 connect( mLayer->styleManager(), &QgsMapLayerStyleManager::styleAdded, this, &QgsMapLayerStyleManagerWidget::styleAdded );
82 connect( mLayer->styleManager(), &QgsMapLayerStyleManager::styleRemoved, this, &QgsMapLayerStyleManagerWidget::styleRemoved );
83 connect( mLayer->styleManager(), &QgsMapLayerStyleManager::styleRenamed, this, &QgsMapLayerStyleManagerWidget::styleRenamed );
84
85 mModel->clear();
86
87 const QStringList styles = mLayer->styleManager()->styles();
88 for ( const QString &styleName : styles )
89 {
90 QStandardItem *item = new QStandardItem( styleName );
91 item->setData( styleName );
92 mModel->appendRow( item );
93 }
94
95 const QString active = mLayer->styleManager()->currentStyle();
96 currentStyleChanged( active );
97
98 connect( mModel, &QStandardItemModel::itemChanged, this, &QgsMapLayerStyleManagerWidget::renameStyle );
99}
100
101void QgsMapLayerStyleManagerWidget::styleClicked( const QModelIndex &index )
102{
103 if ( !mLayer || !index.isValid() )
104 return;
105
106 const QString name = index.data().toString();
108}
109
110void QgsMapLayerStyleManagerWidget::currentStyleChanged( const QString &name )
111{
112 const QList<QStandardItem *> items = mModel->findItems( name );
113 if ( items.isEmpty() )
114 return;
115
116 QStandardItem *item = items.at( 0 );
117
118 mStyleList->setCurrentIndex( item->index() );
119}
120
121void QgsMapLayerStyleManagerWidget::styleAdded( const QString &name )
122{
123 QgsDebugMsgLevel( u"Style added"_s, 2 );
124 QStandardItem *item = new QStandardItem( name );
125 item->setData( name );
126 mModel->appendRow( item );
127}
128
129void QgsMapLayerStyleManagerWidget::styleRemoved( const QString &name )
130{
131 const QList<QStandardItem *> items = mModel->findItems( name );
132 if ( items.isEmpty() )
133 return;
134
135 QStandardItem *item = items.at( 0 );
136 mModel->removeRow( item->row() );
137}
138
139void QgsMapLayerStyleManagerWidget::styleRenamed( const QString &oldname, const QString &newname )
140{
141 const QList<QStandardItem *> items = mModel->findItems( oldname );
142 if ( items.isEmpty() )
143 return;
144
145 QStandardItem *item = items.at( 0 );
146 item->setText( newname );
147 item->setData( newname );
148}
149
150void QgsMapLayerStyleManagerWidget::addStyle()
151{
152 bool ok;
153 const QString text = QInputDialog::getText( nullptr, tr( "New Style" ), tr( "Style name:" ), QLineEdit::Normal, u"new style"_s, &ok );
154 if ( !ok || text.isEmpty() )
155 return;
156
157 const bool res = mLayer->styleManager()->addStyleFromLayer( text );
158 if ( res ) // make it active!
159 {
160 mLayer->styleManager()->setCurrentStyle( text );
161 }
162 else
163 {
164 QgsDebugError( "Failed to add style: " + text );
165 }
166}
167
168void QgsMapLayerStyleManagerWidget::removeStyle()
169{
170 const QString current = mLayer->styleManager()->currentStyle();
171 const bool res = mLayer->styleManager()->removeStyle( current );
172 if ( !res )
173 QgsDebugError( u"Failed to remove current style"_s );
174}
175
176void QgsMapLayerStyleManagerWidget::renameStyle( QStandardItem *item )
177{
178 const QString oldName = item->data().toString();
179 const QString newName = item->text();
180 item->setData( newName );
181 whileBlocking( this )->mLayer->styleManager()->renameStyle( oldName, newName );
182}
183
184void QgsMapLayerStyleManagerWidget::saveAsDefault()
185{
186 if ( !mLayer )
187 return;
188
189 switch ( mLayer->type() )
190 {
192 QgsVectorLayerProperties( mMapCanvas, mMapLayerConfigWidgetContext.messageBar(), qobject_cast<QgsVectorLayer *>( mLayer ) ).saveDefaultStyle();
193 break;
194
196 QgsRasterLayerProperties( mLayer, mMapCanvas ).saveStyleAsDefault();
197 break;
198
200 QgsMeshLayerProperties( mLayer, mMapCanvas ).saveStyleAsDefault();
201 break;
202
204 QgsVectorTileLayerProperties( qobject_cast<QgsVectorTileLayer *>( mLayer ), mMapCanvas, mMapLayerConfigWidgetContext.messageBar() ).saveStyleAsDefault();
205 break;
206
208 QgsPointCloudLayerProperties( qobject_cast<QgsPointCloudLayer *>( mLayer ), mMapCanvas, mMapLayerConfigWidgetContext.messageBar() ).saveStyleAsDefault();
209 break;
210
212 QgsTiledSceneLayerProperties( qobject_cast<QgsTiledSceneLayer *>( mLayer ), mMapCanvas, mMapLayerConfigWidgetContext.messageBar() ).saveStyleAsDefault();
213 break;
214
215 // Not available for these
219 break;
220 }
221}
222
223void QgsMapLayerStyleManagerWidget::loadDefault()
224{
225 if ( !mLayer )
226 return;
227
228 switch ( mLayer->type() )
229 {
231 QgsVectorLayerProperties( mMapCanvas, mMapLayerConfigWidgetContext.messageBar(), qobject_cast<QgsVectorLayer *>( mLayer ) ).loadDefaultStyle();
232 break;
233
235 QgsRasterLayerProperties( mLayer, mMapCanvas ).loadDefaultStyle();
236 break;
237
239 QgsMeshLayerProperties( mLayer, mMapCanvas ).loadDefaultStyle();
240 break;
241
243 QgsVectorTileLayerProperties( qobject_cast<QgsVectorTileLayer *>( mLayer ), mMapCanvas, mMapLayerConfigWidgetContext.messageBar() ).loadDefaultStyle();
244 break;
245
247 QgsPointCloudLayerProperties( qobject_cast<QgsPointCloudLayer *>( mLayer ), mMapCanvas, mMapLayerConfigWidgetContext.messageBar() ).loadDefaultStyle();
248 break;
249
251 QgsTiledSceneLayerProperties( qobject_cast<QgsTiledSceneLayer *>( mLayer ), mMapCanvas, mMapLayerConfigWidgetContext.messageBar() ).loadDefaultStyle();
252 break;
253
254 // Not available for these
258 break;
259 }
260}
261
262void QgsMapLayerStyleManagerWidget::saveStyle()
263{
264 if ( !mLayer )
265 return;
266
267 switch ( mLayer->type() )
268 {
270 QgsVectorLayerProperties( mMapCanvas, mMapLayerConfigWidgetContext.messageBar(), qobject_cast<QgsVectorLayer *>( mLayer ) ).saveStyleAs();
271 break;
272
274 QgsRasterLayerProperties( mLayer, mMapCanvas ).saveStyleAs();
275 break;
276
278 QgsMeshLayerProperties( mLayer, mMapCanvas ).saveStyleToFile();
279 break;
280
282 QgsVectorTileLayerProperties( qobject_cast<QgsVectorTileLayer *>( mLayer ), mMapCanvas, mMapLayerConfigWidgetContext.messageBar() ).saveStyleToFile();
283 break;
284
286 QgsPointCloudLayerProperties( qobject_cast<QgsPointCloudLayer *>( mLayer ), mMapCanvas, mMapLayerConfigWidgetContext.messageBar() ).saveStyleToFile();
287 break;
288
290 QgsTiledSceneLayerProperties( qobject_cast<QgsTiledSceneLayer *>( mLayer ), mMapCanvas, mMapLayerConfigWidgetContext.messageBar() ).saveStyleToFile();
291 break;
292
293 // Not available for these
297 break;
298 }
299}
300
301void QgsMapLayerStyleManagerWidget::loadStyle()
302{
303 if ( !mLayer )
304 return;
305
306 switch ( mLayer->type() )
307 {
309 QgsVectorLayerProperties( mMapCanvas, mMapLayerConfigWidgetContext.messageBar(), qobject_cast<QgsVectorLayer *>( mLayer ) ).loadStyle();
310 break;
311
313 QgsRasterLayerProperties( mLayer, mMapCanvas ).loadStyleFromFile();
314 break;
315
317 QgsMeshLayerProperties( mLayer, mMapCanvas ).loadStyleFromFile();
318 break;
319
321 QgsVectorTileLayerProperties( qobject_cast<QgsVectorTileLayer *>( mLayer ), mMapCanvas, mMapLayerConfigWidgetContext.messageBar() ).loadStyle();
322 break;
323
325 QgsPointCloudLayerProperties( qobject_cast<QgsPointCloudLayer *>( mLayer ), mMapCanvas, mMapLayerConfigWidgetContext.messageBar() ).loadStyleFromFile();
326 break;
327
329 QgsTiledSceneLayerProperties( qobject_cast<QgsTiledSceneLayer *>( mLayer ), mMapCanvas, mMapLayerConfigWidgetContext.messageBar() ).loadStyleFromFile();
330 break;
331
332 // Not available for these
336 break;
337 }
338}
@ Group
Composite group layer. Added in QGIS 3.24.
Definition qgis.h:212
@ Plugin
Plugin based layer.
Definition qgis.h:207
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
Definition qgis.h:213
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
Definition qgis.h:210
@ Vector
Vector layer.
Definition qgis.h:205
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
Definition qgis.h:209
@ Mesh
Mesh layer. Added in QGIS 3.2.
Definition qgis.h:208
@ Raster
Raster layer.
Definition qgis.h:206
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
Definition qgis.h:211
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
Map canvas is a class for displaying all GIS data types on a canvas.
QgsMapLayerConfigWidget(QgsMapLayer *layer, QgsMapCanvas *canvas, QWidget *parent=nullptr)
A panel widget that can be shown in the map style dock.
QgsMapLayerConfigWidgetContext mMapLayerConfigWidgetContext
QgsMapLayerStyleManagerWidget(QgsMapLayer *layer, QgsMapCanvas *canvas, QWidget *parent=nullptr)
Style manager widget to manage the layers styles.
bool setCurrentStyle(const QString &name)
Set a different style as the current style - will apply it to the layer.
void styleAdded(const QString &name)
Emitted when a new style has been added.
void styleRenamed(const QString &oldName, const QString &newName)
Emitted when a style has been renamed.
void currentStyleChanged(const QString &currentName)
Emitted when the current style has been changed.
void styleRemoved(const QString &name)
Emitted when a style has been removed.
Base class for all map layer types.
Definition qgsmaplayer.h:83
QgsMapLayerStyleManager * styleManager() const
Gets access to the layer's style manager.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
Definition qgis.h:6854
#define QgsDebugMsgLevel(str, level)
Definition qgslogger.h:63
#define QgsDebugError(str)
Definition qgslogger.h:59