32#include <QDesktopServices>
38#include <qstackedwidget.h>
40#include "moc_qgslayerpropertiesdialog.cpp"
42using namespace Qt::StringLiterals;
52 mMetadataWidget = widget;
58 if ( !mLayer || !mMetadataWidget )
62 const QString lastUsedDir = settings.
value( u
"style/lastStyleDir"_s, QDir::homePath() ).toString();
64 const QString fileName = QFileDialog::getOpenFileName(
this, tr(
"Load Layer Metadata" ), lastUsedDir, tr(
"QGIS Layer Metadata File" ) +
" (*.qmd)" );
65 if ( fileName.isNull() )
70 bool defaultLoadedFlag =
false;
71 const QString message = mLayer->loadNamedMetadata( fileName, defaultLoadedFlag );
74 if ( defaultLoadedFlag )
76 mMetadataWidget->setMetadata( &mLayer->metadata() );
81 QMessageBox::warning(
this, tr(
"Load Metadata" ), message );
84 settings.
setValue( u
"style/lastStyleDir"_s, QFileInfo( fileName ).path() );
91 if ( !mLayer || !mMetadataWidget )
95 const QString lastUsedDir = settings.
value( u
"style/lastStyleDir"_s, QDir::homePath() ).toString();
97 QString outputFileName = QFileDialog::getSaveFileName(
this, tr(
"Save Layer Metadata as QMD" ), lastUsedDir, tr(
"QMD File" ) +
" (*.qmd)" );
101 if ( outputFileName.isEmpty() )
106 mMetadataWidget->acceptMetadata();
114 bool defaultLoadedFlag =
false;
115 const QString message = mLayer->saveNamedMetadata( outputFileName, defaultLoadedFlag );
116 if ( defaultLoadedFlag )
117 settings.
setValue( u
"style/lastStyleDir"_s, QFileInfo( outputFileName ).absolutePath() );
119 QMessageBox::information(
this, tr(
"Save Metadata" ), message );
126 if ( !mLayer || !mMetadataWidget )
129 mMetadataWidget->acceptMetadata();
131 bool defaultSavedFlag =
false;
132 const QString infoWindowTitle = QObject::tr(
"Save Default Metadata" );
133 const QString errorMsg = mLayer->saveDefaultMetadata( defaultSavedFlag );
134 if ( !defaultSavedFlag )
136 QMessageBox::warning(
this, infoWindowTitle, errorMsg );
141 QMessageBox::information(
this, infoWindowTitle, tr(
"Metadata saved." ) );
147 if ( !mLayer || !mMetadataWidget )
150 bool defaultLoadedFlag =
false;
151 const QString message = mLayer->loadNamedMetadata( mLayer->metadataUri(), defaultLoadedFlag );
153 if ( defaultLoadedFlag )
155 mMetadataWidget->setMetadata( &mLayer->metadata() );
159 QMessageBox::information(
this, tr(
"Default Metadata" ), message );
170 const QString lastUsedDir = settings.
value( u
"style/lastStyleDir"_s, QDir::homePath() ).toString();
172 QString fileName = QFileDialog::getOpenFileName(
this, tr(
"Load layer properties from style file" ), lastUsedDir, tr(
"QGIS Layer Style File" ) +
" (*.qml)" );
173 if ( fileName.isEmpty() )
177 if ( !fileName.endsWith(
".qml"_L1, Qt::CaseInsensitive ) )
178 fileName +=
".qml"_L1;
182 bool defaultLoadedFlag =
false;
183 const QString message = mLayer->loadNamedStyle( fileName, defaultLoadedFlag );
184 if ( defaultLoadedFlag )
186 settings.
setValue( u
"style/lastStyleDir"_s, QFileInfo( fileName ).absolutePath() );
191 QMessageBox::information(
this, tr(
"Load Style" ), message );
202 const QString lastUsedDir = settings.
value( u
"style/lastStyleDir"_s, QDir::homePath() ).toString();
204 QString outputFileName = QFileDialog::getSaveFileName(
this, tr(
"Save layer properties as style file" ), lastUsedDir, tr(
"QGIS Layer Style File" ) +
" (*.qml)" );
208 if ( outputFileName.isEmpty() )
217 bool defaultLoadedFlag =
false;
218 const QString message = mLayer->saveNamedStyle( outputFileName, defaultLoadedFlag );
220 if ( defaultLoadedFlag )
222 settings.
setValue( u
"style/lastStyleDir"_s, QFileInfo( outputFileName ).absolutePath() );
226 QMessageBox::information(
this, tr(
"Save Style" ), message );
239 bool defaultSavedFlag =
false;
245 const QString message = mLayer->saveDefaultStyle( defaultSavedFlag );
247 if ( !defaultSavedFlag )
250 QMessageBox::information(
this, tr(
"Default Style" ), message );
276 if ( beforePage.isEmpty() )
287 bool defaultLoadedFlag =
false;
294 QMessageBox askToUser;
295 askToUser.setText( tr(
"Load default style from: " ) );
296 askToUser.setIcon( QMessageBox::Question );
297 askToUser.addButton( tr(
"Cancel" ), QMessageBox::RejectRole );
298 askToUser.addButton( tr(
"Local Database" ), QMessageBox::NoRole );
299 askToUser.addButton( tr(
"Datasource Database" ), QMessageBox::YesRole );
301 switch ( askToUser.exec() )
306 msg = mLayer->loadNamedStyle( mLayer->styleURI(), defaultLoadedFlag,
false );
307 if ( !defaultLoadedFlag )
310 QMessageBox::information(
this, tr(
"Default Style" ), msg );
312 if ( msg.compare( tr(
"Loaded from Provider" ) ) )
314 QMessageBox::information(
this, tr(
"Default Style" ), tr(
"No default style was found for this layer." ) );
328 QString myMessage = mLayer->loadNamedStyle( mLayer->styleURI(), defaultLoadedFlag,
true );
331 if ( defaultLoadedFlag )
340 QMessageBox::information(
this, tr(
"Default Style" ), myMessage );
352 QMessageBox askToUser;
353 askToUser.setText( tr(
"Save default style to: " ) );
354 askToUser.setIcon( QMessageBox::Question );
355 QPushButton *cancelButton = askToUser.addButton( tr(
"Cancel" ), QMessageBox::RejectRole );
356 askToUser.addButton( tr(
"Local Database" ), QMessageBox::NoRole );
357 QPushButton *datasourceButton = askToUser.addButton( tr(
"Datasource Database" ), QMessageBox::YesRole );
361 if ( askToUser.clickedButton() == cancelButton )
365 else if ( askToUser.clickedButton() == datasourceButton )
368 QString errorMessage;
372 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 )
378 else if ( !errorMessage.isEmpty() )
380 QMessageBox::warning(
nullptr, QObject::tr(
"Save style in database" ), errorMessage );
384 mLayer->saveStyleToDatabaseV2( QString(), QString(),
true, QString(), errorMsg );
385 if ( errorMsg.isNull() )
397 if ( !mLayer->dataProvider() )
405 bool defaultLoadedFlag =
false;
406 QString errorMessage;
416 errorMessage = mLayer->saveNamedStyle( filePath, defaultLoadedFlag, dlg.
styleCategories() );
420 errorMessage = mLayer->saveSldStyleV2( defaultLoadedFlag, sldContext );
424 if ( defaultLoadedFlag )
431 QMessageBox::information(
this, tr(
"Save Style" ), errorMessage );
438 QString infoWindowTitle = QObject::tr(
"Save style to DB (%1)" ).arg( mLayer->providerType() );
445 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 )
451 else if ( !errorMessage.isEmpty() )
453 QMessageBox::warning(
this, infoWindowTitle, errorMessage );
459 if ( !errorMessage.isNull() )
461 QMessageBox::warning(
this, infoWindowTitle, errorMessage );
465 QMessageBox::information(
this, infoWindowTitle, tr(
"Style saved" ) );
471 QString infoWindowTitle = tr(
"Save default style to local database" );
472 errorMessage = mLayer->saveDefaultStyle( defaultLoadedFlag, dlg.
styleCategories() );
473 if ( !defaultLoadedFlag )
475 QMessageBox::warning(
this, infoWindowTitle, errorMessage );
479 QMessageBox::information(
this, infoWindowTitle, tr(
"Style saved" ) );
490 QStringList ids, names, descriptions;
493 int sectionLimit = mLayer->listStylesInDatabase( ids, names, descriptions, errorMsg );
499 mOldStyle = mLayer->styleManager()->style( mLayer->styleManager()->currentStyle() );
502 bool defaultLoadedFlag =
false;
511 errorMsg = mLayer->loadSldStyle( filePath, defaultLoadedFlag );
515 errorMsg = mLayer->loadNamedStyle( filePath, defaultLoadedFlag,
true, categories );
518 if ( defaultLoadedFlag )
526 QMessageBox::warning(
this, tr(
"Load Style" ), errorMsg );
534 QString qmlStyle = mLayer->getStyleFromDatabase( selectedStyleId, errorMsg );
535 if ( !errorMsg.isNull() )
537 QMessageBox::warning(
this, tr(
"Load Styles from Database" ), errorMsg );
541 QDomDocument myDocument( u
"qgis"_s );
542 myDocument.setContent( qmlStyle );
544 if ( mLayer->importNamedStyle( myDocument, errorMsg, categories ) )
551 QMessageBox::warning(
this, tr(
"Load Styles from Database" ), tr(
"The retrieved style is not a valid named style. Error message: %1" ).arg( errorMsg ) );
557 errorMsg = mLayer->loadNamedStyle( mLayer->styleURI(), defaultLoadedFlag,
true, categories );
559 if ( defaultLoadedFlag )
566 QMessageBox::warning(
this, tr(
"Load Default Style" ), errorMsg );
580 mOldStyle = mLayer->styleManager()->style( mLayer->styleManager()->currentStyle() );
583QString QgsLayerPropertiesDialog::generateDialogTitle()
const
585 QString title = tr(
"Layer Properties - %1" ).arg( mLayer->name() );
587 if ( !mLayer->styleManager()->isDefault( mLayer->styleManager()->currentStyle() ) )
588 title += u
" (%1)"_s.arg( mLayer->styleManager()->currentStyle() );
595 if (
mOldStyle.xmlData() != mLayer->styleManager()->style( mLayer->styleManager()->currentStyle() ).xmlData() )
599 QDomDocument doc( u
"qgis"_s );
600 int errorLine, errorColumn;
601 doc.setContent(
mOldStyle.xmlData(),
false, &message, &errorLine, &errorColumn );
602 mLayer->importNamedStyle( doc, message );
613 const bool isMetadataPanel = ( index ==
mOptStackedWidget->indexOf( mMetadataPage ) );
614 mBtnStyle->setVisible( !isMetadataPanel );
621 QFileInfo file( url.toLocalFile() );
622 if ( file.exists() && !file.isDir() )
625 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