32#include <QDesktopServices>
36#include <qstackedwidget.h>
38#include "moc_qgslayerpropertiesdialog.cpp"
49 mMetadataWidget = widget;
55 if ( !mLayer || !mMetadataWidget )
59 const QString lastUsedDir = settings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
61 const QString fileName = QFileDialog::getOpenFileName(
this, tr(
"Load Layer Metadata" ), lastUsedDir, tr(
"QGIS Layer Metadata File" ) +
" (*.qmd)" );
62 if ( fileName.isNull() )
67 bool defaultLoadedFlag =
false;
68 const QString message = mLayer->loadNamedMetadata( fileName, defaultLoadedFlag );
71 if ( defaultLoadedFlag )
73 mMetadataWidget->setMetadata( &mLayer->metadata() );
78 QMessageBox::warning(
this, tr(
"Load Metadata" ), message );
81 settings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( fileName ).path() );
88 if ( !mLayer || !mMetadataWidget )
92 const QString lastUsedDir = settings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
94 QString outputFileName = QFileDialog::getSaveFileName(
this, tr(
"Save Layer Metadata as QMD" ), lastUsedDir, tr(
"QMD File" ) +
" (*.qmd)" );
98 if ( outputFileName.isEmpty() )
103 mMetadataWidget->acceptMetadata();
111 bool defaultLoadedFlag =
false;
112 const QString message = mLayer->saveNamedMetadata( outputFileName, defaultLoadedFlag );
113 if ( defaultLoadedFlag )
114 settings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( outputFileName ).absolutePath() );
116 QMessageBox::information(
this, tr(
"Save Metadata" ), message );
123 if ( !mLayer || !mMetadataWidget )
126 mMetadataWidget->acceptMetadata();
128 bool defaultSavedFlag =
false;
129 const QString infoWindowTitle = QObject::tr(
"Save Default Metadata" );
130 const QString errorMsg = mLayer->saveDefaultMetadata( defaultSavedFlag );
131 if ( !defaultSavedFlag )
133 QMessageBox::warning(
this, infoWindowTitle, errorMsg );
138 QMessageBox::information(
this, infoWindowTitle, tr(
"Metadata saved." ) );
144 if ( !mLayer || !mMetadataWidget )
147 bool defaultLoadedFlag =
false;
148 const QString message = mLayer->loadNamedMetadata( mLayer->metadataUri(), defaultLoadedFlag );
150 if ( defaultLoadedFlag )
152 mMetadataWidget->setMetadata( &mLayer->metadata() );
156 QMessageBox::information(
this, tr(
"Default Metadata" ), message );
167 const QString lastUsedDir = settings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
169 QString fileName = QFileDialog::getOpenFileName(
171 tr(
"Load layer properties from style file" ),
173 tr(
"QGIS Layer Style File" ) +
" (*.qml)"
175 if ( fileName.isEmpty() )
179 if ( !fileName.endsWith( QLatin1String(
".qml" ), Qt::CaseInsensitive ) )
180 fileName += QLatin1String(
".qml" );
184 bool defaultLoadedFlag =
false;
185 const QString message = mLayer->loadNamedStyle( fileName, defaultLoadedFlag );
186 if ( defaultLoadedFlag )
188 settings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( fileName ).absolutePath() );
193 QMessageBox::information(
this, tr(
"Load Style" ), message );
204 const QString lastUsedDir = settings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
206 QString outputFileName = QFileDialog::getSaveFileName(
208 tr(
"Save layer properties as style file" ),
210 tr(
"QGIS Layer Style File" ) +
" (*.qml)"
215 if ( outputFileName.isEmpty() )
224 bool defaultLoadedFlag =
false;
225 const QString message = mLayer->saveNamedStyle( outputFileName, defaultLoadedFlag );
227 if ( defaultLoadedFlag )
229 settings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( outputFileName ).absolutePath() );
233 QMessageBox::information(
this, tr(
"Save Style" ), message );
246 bool defaultSavedFlag =
false;
252 const QString message = mLayer->saveDefaultStyle( defaultSavedFlag );
254 if ( !defaultSavedFlag )
257 QMessageBox::information(
this, tr(
"Default Style" ), message );
283 if ( beforePage.isEmpty() )
294 bool defaultLoadedFlag =
false;
301 QMessageBox askToUser;
302 askToUser.setText( tr(
"Load default style from: " ) );
303 askToUser.setIcon( QMessageBox::Question );
304 askToUser.addButton( tr(
"Cancel" ), QMessageBox::RejectRole );
305 askToUser.addButton( tr(
"Local Database" ), QMessageBox::NoRole );
306 askToUser.addButton( tr(
"Datasource Database" ), QMessageBox::YesRole );
308 switch ( askToUser.exec() )
313 msg = mLayer->loadNamedStyle( mLayer->styleURI(), defaultLoadedFlag,
false );
314 if ( !defaultLoadedFlag )
317 QMessageBox::information(
this, tr(
"Default Style" ), msg );
319 if ( msg.compare( tr(
"Loaded from Provider" ) ) )
321 QMessageBox::information(
this, tr(
"Default Style" ), tr(
"No default style was found for this layer." ) );
335 QString myMessage = mLayer->loadNamedStyle( mLayer->styleURI(), defaultLoadedFlag,
true );
338 if ( defaultLoadedFlag )
347 QMessageBox::information(
this, tr(
"Default Style" ), myMessage );
359 QMessageBox askToUser;
360 askToUser.setText( tr(
"Save default style to: " ) );
361 askToUser.setIcon( QMessageBox::Question );
362 askToUser.addButton( tr(
"Cancel" ), QMessageBox::RejectRole );
363 askToUser.addButton( tr(
"Local Database" ), QMessageBox::NoRole );
364 askToUser.addButton( tr(
"Datasource Database" ), QMessageBox::YesRole );
366 switch ( askToUser.exec() )
373 QString errorMessage;
376 if ( QMessageBox::question(
nullptr, QObject::tr(
"Save style in database" ), QObject::tr(
"A matching style already exists in the database for this layer. Do you want to overwrite it?" ), QMessageBox::Yes | QMessageBox::No ) == QMessageBox::No )
381 else if ( !errorMessage.isEmpty() )
383 QMessageBox::warning(
nullptr, QObject::tr(
"Save style in database" ), errorMessage );
387 mLayer->saveStyleToDatabaseV2( QString(), QString(),
true, QString(), errorMsg );
388 if ( errorMsg.isNull() )
404 if ( !mLayer->dataProvider() )
412 bool defaultLoadedFlag =
false;
413 QString errorMessage;
423 errorMessage = mLayer->saveNamedStyle( filePath, defaultLoadedFlag, dlg.
styleCategories() );
427 errorMessage = mLayer->saveSldStyleV2( defaultLoadedFlag, sldContext );
431 if ( defaultLoadedFlag )
438 QMessageBox::information(
this, tr(
"Save Style" ), errorMessage );
445 QString infoWindowTitle = QObject::tr(
"Save style to DB (%1)" ).arg( mLayer->providerType() );
451 if ( QMessageBox::question(
nullptr, QObject::tr(
"Save style in database" ), QObject::tr(
"A matching style already exists in the database for this layer. Do you want to overwrite it?" ), QMessageBox::Yes | QMessageBox::No ) == QMessageBox::No )
456 else if ( !errorMessage.isEmpty() )
458 QMessageBox::warning(
this, infoWindowTitle, errorMessage );
464 if ( !errorMessage.isNull() )
466 QMessageBox::warning(
this, infoWindowTitle, errorMessage );
470 QMessageBox::information(
this, infoWindowTitle, tr(
"Style saved" ) );
476 QString infoWindowTitle = tr(
"Save default style to local database" );
477 errorMessage = mLayer->saveDefaultStyle( defaultLoadedFlag, dlg.
styleCategories() );
478 if ( !defaultLoadedFlag )
480 QMessageBox::warning(
this, infoWindowTitle, errorMessage );
484 QMessageBox::information(
this, infoWindowTitle, tr(
"Style saved" ) );
495 QStringList ids, names, descriptions;
498 int sectionLimit = mLayer->listStylesInDatabase( ids, names, descriptions, errorMsg );
504 mOldStyle = mLayer->styleManager()->style( mLayer->styleManager()->currentStyle() );
507 bool defaultLoadedFlag =
false;
516 errorMsg = mLayer->loadSldStyle( filePath, defaultLoadedFlag );
520 errorMsg = mLayer->loadNamedStyle( filePath, defaultLoadedFlag,
true, categories );
523 if ( defaultLoadedFlag )
531 QMessageBox::warning(
this, tr(
"Load Style" ), errorMsg );
539 QString qmlStyle = mLayer->getStyleFromDatabase( selectedStyleId, errorMsg );
540 if ( !errorMsg.isNull() )
542 QMessageBox::warning(
this, tr(
"Load Styles from Database" ), errorMsg );
546 QDomDocument myDocument( QStringLiteral(
"qgis" ) );
547 myDocument.setContent( qmlStyle );
549 if ( mLayer->importNamedStyle( myDocument, errorMsg, categories ) )
556 QMessageBox::warning(
this, tr(
"Load Styles from Database" ), tr(
"The retrieved style is not a valid named style. Error message: %1" ).arg( errorMsg ) );
562 errorMsg = mLayer->loadNamedStyle( mLayer->styleURI(), defaultLoadedFlag,
true, categories );
564 if ( defaultLoadedFlag )
571 QMessageBox::warning(
this, tr(
"Load Default Style" ), errorMsg );
585 mOldStyle = mLayer->styleManager()->style( mLayer->styleManager()->currentStyle() );
588QString QgsLayerPropertiesDialog::generateDialogTitle()
const
590 QString title = tr(
"Layer Properties - %1" ).arg( mLayer->name() );
592 if ( !mLayer->styleManager()->isDefault( mLayer->styleManager()->currentStyle() ) )
593 title += QStringLiteral(
" (%1)" ).arg( mLayer->styleManager()->currentStyle() );
600 if (
mOldStyle.xmlData() != mLayer->styleManager()->style( mLayer->styleManager()->currentStyle() ).xmlData() )
604 QDomDocument doc( QStringLiteral(
"qgis" ) );
605 int errorLine, errorColumn;
606 doc.setContent(
mOldStyle.xmlData(),
false, &message, &errorLine, &errorColumn );
607 mLayer->importNamedStyle( doc, message );
618 const bool isMetadataPanel = ( index ==
mOptStackedWidget->indexOf( mMetadataPage ) );
619 mBtnStyle->setVisible( !isMetadataPanel );
626 QFileInfo file( url.toLocalFile() );
627 if ( file.exists() && !file.isDir() )
630 QDesktopServices::openUrl( url );
@ NoVendorExtension
No vendor extensions.
Abstract base class for spatial data provider implementations.
virtual Qgis::ProviderStyleStorageCapabilities styleStorageCapabilities() const
Returns the style storage capabilities.
static QString ensureFileNameHasExtension(const QString &fileName, const QStringList &extensions)
Ensures that a fileName ends with an extension from the provided list of extensions.
static QgsNative * nativePlatformInterface()
Returns the global native interface, which offers abstraction to the host OS's underlying public inte...
QPushButton * mBtnStyle
Style button.
void saveMetadataToFile()
Allows the user to save the layer's metadata as a file.
virtual void rollback()
Rolls back changes made to the layer.
void optionsStackedWidget_CurrentChanged(int index) override
StyleType
Style storage type.
void saveStyleAsDefault()
Saves the current layer style as the default for the layer.
QList< QgsMapLayerConfigWidget * > mConfigWidgets
Layer config widgets.
void setMetadataWidget(QgsMetadataWidget *widget, QWidget *page)
Sets the metadata widget and page associated with the dialog.
void loadDefaultStyle()
Reloads the default style for the layer.
void saveStyleAs()
Saves a style when appriate button is pressed.
virtual void apply()=0
Applies the dialog settings to the layer.
virtual void syncToLayer()=0
Resets the dialog to the current layer state.
void loadStyle()
Triggers a dialog to load a saved style.
void saveStyleToFile()
Allows the user to save the layer's style to a file.
QgsMapCanvas * mCanvas
Associated map canvas.
void loadDefaultMetadata()
Reloads the default layer metadata for the layer.
void refocusDialog()
Ensures the dialog is focused and activated.
QgsLayerPropertiesDialog(QgsMapLayer *layer, QgsMapCanvas *canvas, const QString &settingsKey, QWidget *parent=nullptr, Qt::WindowFlags fl=Qt::WindowFlags(), QgsSettings *settings=nullptr)
Constructor for QgsLayerPropertiesDialog.
void storeCurrentStyleForUndo()
Stores the current layer style so that undo operations can be performed.
QgsMapLayerStyle mOldStyle
Previous layer style.
void loadMetadataFromFile()
Allows the user to load layer metadata from a file.
void saveDefaultStyle()
Saves the default style when appropriate button is pressed.
virtual void addPropertiesPageFactory(const QgsMapLayerConfigWidgetFactory *factory)
Adds properties page from a factory.
void loadStyleFromFile()
Allows the user to load layer style from a file.
QPushButton * mBtnMetadata
Metadata button.
void initialize()
Initialize the dialog.
void saveMetadataAsDefault()
Saves the current layer metadata as the default for the layer.
void openUrl(const QUrl &url)
Handles opening a url from the dialog.
Map canvas is a class for displaying all GIS data types on a canvas.
A reusable dialog which allows users to select stored layer styles and categories to load for a map l...
QgsMapLayer::StyleCategories styleCategories() const
Returns the list of selected style categories the user has opted to load.
void initializeLists(const QStringList &ids, const QStringList &names, const QStringList &descriptions, int sectionLimit)
Initialize list of database stored styles.
QString selectedStyleId()
Returns the ID of the selected database stored style.
QString filePath() const
Returns the full path to the selected layer style source file.
QgsLayerPropertiesDialog::StyleType currentStyleType() const
Returns the selected style type.
A dialog which allows saving map layer styles.
QString outputFilePath() const
Returns the selected file output path.
Qgis::SldExportOptions sldExportOptions() const
Returns the SLD export options.
SaveToDbSettings saveToDbSettings() const
Returns the database settings for saving the style in the DB.
QgsMapLayer::StyleCategories styleCategories() const
Returns the available style categories.
QgsLayerPropertiesDialog::StyleType currentStyleType() const
Returns the selected style storage type.
Base class for all map layer types.
QFlags< StyleCategory > StyleCategories
static QString extensionPropertyType(PropertyType type)
Returns the extension of a Property.
virtual void optionsStackedWidget_CurrentChanged(int index)
Select relevant tab on current page change.
QgsOptionsDialogBase(const QString &settingsKey, QWidget *parent=nullptr, Qt::WindowFlags fl=Qt::WindowFlags(), QgsSettings *settings=nullptr)
Constructor.
void addPage(const QString &title, const QString &tooltip, const QIcon &icon, QWidget *widget, const QStringList &path=QStringList(), const QString &key=QString())
Adds a new page to the dialog pages.
void restoreOptionsBaseUi(const QString &title=QString())
Restore the base ui.
QStackedWidget * mOptStackedWidget
void insertPage(const QString &title, const QString &tooltip, const QIcon &icon, QWidget *widget, const QString &before, const QStringList &path=QStringList(), const QString &key=QString())
Inserts a new page into the dialog pages.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
Stores settings for use within QGIS.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
Holds SLD export options and other information related to SLD export of a QGIS layer style.
#define Q_NOWARN_DEPRECATED_POP
#define Q_NOWARN_DEPRECATED_PUSH