17#include "moc_qgslayerpropertiesdialog.cpp"
30#include "qstackedwidget.h"
36#include <QDesktopServices>
47 mMetadataWidget = widget;
53 if ( !mLayer || !mMetadataWidget )
57 const QString lastUsedDir = settings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
59 const QString fileName = QFileDialog::getOpenFileName(
this, tr(
"Load Layer Metadata" ), lastUsedDir,
60 tr(
"QGIS Layer Metadata File" ) +
" (*.qmd)" );
61 if ( fileName.isNull() )
66 bool defaultLoadedFlag =
false;
67 const QString message = mLayer->loadNamedMetadata( fileName, defaultLoadedFlag );
70 if ( defaultLoadedFlag )
72 mMetadataWidget->
setMetadata( &mLayer->metadata() );
77 QMessageBox::warning(
this, tr(
"Load Metadata" ), message );
80 settings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( fileName ).path() );
87 if ( !mLayer || !mMetadataWidget )
91 const QString lastUsedDir = settings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
93 QString outputFileName = QFileDialog::getSaveFileName(
this, tr(
"Save Layer Metadata as QMD" ),
94 lastUsedDir, tr(
"QMD File" ) +
" (*.qmd)" );
98 if ( outputFileName.isEmpty() )
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 )
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)" );
174 if ( fileName.isEmpty() )
178 if ( !fileName.endsWith( QLatin1String(
".qml" ), Qt::CaseInsensitive ) )
179 fileName += QLatin1String(
".qml" );
183 bool defaultLoadedFlag =
false;
184 const QString message = mLayer->loadNamedStyle( fileName, defaultLoadedFlag );
185 if ( defaultLoadedFlag )
187 settings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( fileName ).absolutePath() );
192 QMessageBox::information(
this, tr(
"Load Style" ), message );
203 const QString lastUsedDir = settings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
205 QString outputFileName = QFileDialog::getSaveFileName(
207 tr(
"Save layer properties as style file" ),
209 tr(
"QGIS Layer Style File" ) +
" (*.qml)" );
213 if ( outputFileName.isEmpty() )
222 bool defaultLoadedFlag =
false;
223 const QString message = mLayer->saveNamedStyle( outputFileName, defaultLoadedFlag );
225 if ( defaultLoadedFlag )
227 settings.
setValue( QStringLiteral(
"style/lastStyleDir" ), QFileInfo( outputFileName ).absolutePath() );
231 QMessageBox::information(
this, tr(
"Save Style" ), message );
244 bool defaultSavedFlag =
false;
250 const QString message = mLayer->saveDefaultStyle( defaultSavedFlag );
252 if ( !defaultSavedFlag )
255 QMessageBox::information(
this,
256 tr(
"Default Style" ),
284 if ( beforePage.isEmpty() )
295 bool defaultLoadedFlag =
false;
302 QMessageBox askToUser;
303 askToUser.setText( tr(
"Load default style from: " ) );
304 askToUser.setIcon( QMessageBox::Question );
305 askToUser.addButton( tr(
"Cancel" ), QMessageBox::RejectRole );
306 askToUser.addButton( tr(
"Local Database" ), QMessageBox::NoRole );
307 askToUser.addButton( tr(
"Datasource Database" ), QMessageBox::YesRole );
309 switch ( askToUser.exec() )
314 msg = mLayer->loadNamedStyle( mLayer->styleURI(), defaultLoadedFlag,
false );
315 if ( !defaultLoadedFlag )
318 QMessageBox::information(
this, tr(
"Default Style" ), msg );
320 if ( msg.compare( tr(
"Loaded from Provider" ) ) )
322 QMessageBox::information(
this, tr(
"Default Style" ),
323 tr(
"No default style was found for this layer." ) );
337 QString myMessage = mLayer->loadNamedStyle( mLayer->styleURI(), defaultLoadedFlag,
true );
340 if ( defaultLoadedFlag )
349 QMessageBox::information(
this, tr(
"Default Style" ), myMessage );
361 QMessageBox askToUser;
362 askToUser.setText( tr(
"Save default style to: " ) );
363 askToUser.setIcon( QMessageBox::Question );
364 askToUser.addButton( tr(
"Cancel" ), QMessageBox::RejectRole );
365 askToUser.addButton( tr(
"Local Database" ), QMessageBox::NoRole );
366 askToUser.addButton( tr(
"Datasource Database" ), QMessageBox::YesRole );
368 switch ( askToUser.exec() )
375 QString errorMessage;
378 if ( QMessageBox::question(
nullptr, QObject::tr(
"Save style in database" ),
379 QObject::tr(
"A matching style already exists in the database for this layer. Do you want to overwrite it?" ),
380 QMessageBox::Yes | QMessageBox::No ) == QMessageBox::No )
385 else if ( !errorMessage.isEmpty() )
387 QMessageBox::warning(
nullptr, QObject::tr(
"Save style in database" ),
392 mLayer->saveStyleToDatabase( QString(), QString(),
true, QString(), errorMsg );
393 if ( errorMsg.isNull() )
409 if ( !mLayer->dataProvider() )
417 bool defaultLoadedFlag =
false;
418 QString errorMessage;
428 errorMessage = mLayer->saveNamedStyle( filePath, defaultLoadedFlag, dlg.
styleCategories() );
432 errorMessage = mLayer->saveSldStyleV2( defaultLoadedFlag, sldContext );
436 if ( defaultLoadedFlag )
443 QMessageBox::information(
this, tr(
"Save Style" ), errorMessage );
450 QString infoWindowTitle = QObject::tr(
"Save style to DB (%1)" ).arg( mLayer->providerType() );
456 if ( QMessageBox::question(
nullptr, QObject::tr(
"Save style in database" ),
457 QObject::tr(
"A matching style already exists in the database for this layer. Do you want to overwrite it?" ),
458 QMessageBox::Yes | QMessageBox::No ) == QMessageBox::No )
463 else if ( !errorMessage.isEmpty() )
465 QMessageBox::warning(
this, infoWindowTitle, errorMessage );
471 if ( !errorMessage.isNull() )
473 QMessageBox::warning(
this, infoWindowTitle, errorMessage );
477 QMessageBox::information(
this, infoWindowTitle, tr(
"Style saved" ) );
483 QString infoWindowTitle = tr(
"Save default style to local database" );
484 errorMessage = mLayer->saveDefaultStyle( defaultLoadedFlag, dlg.
styleCategories() );
485 if ( !defaultLoadedFlag )
487 QMessageBox::warning(
this, infoWindowTitle, errorMessage );
491 QMessageBox::information(
this, infoWindowTitle, tr(
"Style saved" ) );
502 QStringList ids, names, descriptions;
505 int sectionLimit = mLayer->listStylesInDatabase( ids, names, descriptions, errorMsg );
511 mOldStyle = mLayer->styleManager()->style( mLayer->styleManager()->currentStyle() );
514 bool defaultLoadedFlag =
false;
523 errorMsg = mLayer->loadSldStyle( filePath, defaultLoadedFlag );
527 errorMsg = mLayer->loadNamedStyle( filePath, defaultLoadedFlag,
true, categories );
530 if ( defaultLoadedFlag )
538 QMessageBox::warning(
this, tr(
"Load Style" ), errorMsg );
546 QString qmlStyle = mLayer->getStyleFromDatabase( selectedStyleId, errorMsg );
547 if ( !errorMsg.isNull() )
549 QMessageBox::warning(
this, tr(
"Load Styles from Database" ), errorMsg );
553 QDomDocument myDocument( QStringLiteral(
"qgis" ) );
554 myDocument.setContent( qmlStyle );
556 if ( mLayer->importNamedStyle( myDocument, errorMsg, categories ) )
563 QMessageBox::warning(
this, tr(
"Load Styles from Database" ),
564 tr(
"The retrieved style is not a valid named style. Error message: %1" )
571 errorMsg = mLayer->loadNamedStyle( mLayer->styleURI(), defaultLoadedFlag,
true, categories );
573 if ( defaultLoadedFlag )
580 QMessageBox::warning(
this, tr(
"Load Default Style" ), errorMsg );
594 mOldStyle = mLayer->styleManager()->style( mLayer->styleManager()->currentStyle() );
597QString QgsLayerPropertiesDialog::generateDialogTitle()
const
599 QString title = tr(
"Layer Properties - %1" ).arg( mLayer->name() );
601 if ( !mLayer->styleManager()->isDefault( mLayer->styleManager()->currentStyle() ) )
602 title += QStringLiteral(
" (%1)" ).arg( mLayer->styleManager()->currentStyle() );
609 if (
mOldStyle.
xmlData() != mLayer->styleManager()->style( mLayer->styleManager()->currentStyle() ).xmlData() )
613 QDomDocument doc( QStringLiteral(
"qgis" ) );
614 int errorLine, errorColumn;
615 doc.setContent(
mOldStyle.
xmlData(),
false, &message, &errorLine, &errorColumn );
616 mLayer->importNamedStyle( doc, message );
627 const bool isMetadataPanel = ( index ==
mOptStackedWidget->indexOf( mMetadataPage ) );
628 mBtnStyle->setVisible( ! isMetadataPanel );
635 QFileInfo file( url.toLocalFile() );
636 if ( file.exists() && !file.isDir() )
639 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.
The QgsMapLayerSaveStyleDialog class provides the UI to save the current style or multiple styles int...
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.
QString xmlData() const
Returns XML content of the style.
Base class for all map layer types.
QFlags< StyleCategory > StyleCategories
static QString extensionPropertyType(PropertyType type)
Returns the extension of a Property.
A base dialog for options and properties dialogs that offers vertical tabs.
virtual void optionsStackedWidget_CurrentChanged(int index)
Select relevant tab on current page change.
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.
This class is a composition of two QSettings instances:
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.
The QgsSldExportContext class holds SLD export options and other information related to SLD export of...
#define Q_NOWARN_DEPRECATED_POP
#define Q_NOWARN_DEPRECATED_PUSH