Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Use QgsVectorLayerSaveStyleDialog when saving style from main window
right click menu

Fixes #29145
  • Loading branch information
nyalldawson committed Sep 16, 2020
1 parent 2eff061 commit 1ad2e78
Showing 1 changed file with 89 additions and 13 deletions.
102 changes: 89 additions & 13 deletions src/app/qgisapp.cpp
Expand Up @@ -92,6 +92,7 @@
#include "qgsprojecttimesettings.h"
#include "qgsmaplayertemporalproperties.h"
#include "qgsmeshlayertemporalproperties.h"
#include "qgsvectorlayersavestyledialog.h"

#include "qgsanalysis.h"
#include "qgsgeometrycheckregistry.h"
Expand Down Expand Up @@ -8832,24 +8833,99 @@ void QgisApp::saveStyleFile( QgsMapLayer *layer )
layer = activeLayer();
}

QgsSettings settings;
QString lastUsedDir = settings.value( QStringLiteral( "style/lastStyleDir" ), QDir::homePath() ).toString();
QString filename = QFileDialog::getSaveFileName( this,
tr( "Save as QGIS Layer Style File" ),
lastUsedDir,
tr( "QGIS Layer Style File" ) + " (*.qml)" );
if ( filename.isEmpty() )
if ( !layer )
return;

if ( ! filename.endsWith( QStringLiteral( ".qml" ) ) )
switch ( layer->type() )
{
filename += QStringLiteral( ".qml" );
}

bool defaultLoadedFlag;
layer->saveNamedStyle( filename, defaultLoadedFlag );
case QgsMapLayerType::VectorLayer:
{
QgsVectorLayer *vlayer = qobject_cast< QgsVectorLayer * >( layer );
QgsVectorLayerSaveStyleDialog dlg( vlayer, this );

if ( dlg.exec() )
{
bool resultFlag = false;

QgsVectorLayerProperties::StyleType type = dlg.currentStyleType();
switch ( type )
{
case QgsVectorLayerProperties::QML:
case QgsVectorLayerProperties::SLD:
{
QString message;
QString filePath = dlg.outputFilePath();
if ( type == QgsVectorLayerProperties::QML )
message = vlayer->saveNamedStyle( filePath, resultFlag, dlg.styleCategories() );
else
message = vlayer->saveSldStyle( filePath, resultFlag );

if ( resultFlag )
{
mInfoBar->pushMessage( tr( "Style saved" ), tr( "Successfully exported style to <a href=\"%1\">%2</a>" ).arg( QUrl::fromLocalFile( filePath ).toString(), QDir::toNativeSeparators( filePath ) ), Qgis::Success );
}
else
{
mInfoBar->pushMessage( tr( "Save Style" ), message, Qgis::Warning );
}

break;
}
case QgsVectorLayerProperties::DB:
{
QString infoWindowTitle = QObject::tr( "Save style to DB (%1)" ).arg( vlayer->providerType() );
QString msgError;

QgsVectorLayerSaveStyleDialog::SaveToDbSettings dbSettings = dlg.saveToDbSettings();

settings.setValue( QStringLiteral( "style/lastStyleDir" ), filename );
vlayer->saveStyleToDatabase( dbSettings.name, dbSettings.description, dbSettings.isDefault, dbSettings.uiFileContent, msgError );

if ( !msgError.isNull() )
{
mInfoBar->pushMessage( infoWindowTitle, msgError, Qgis::Warning );
}
else
{
mInfoBar->pushMessage( infoWindowTitle, tr( "Style saved" ), Qgis::Success );
}
break;
}
}
}
break;
}

case QgsMapLayerType::RasterLayer:
case QgsMapLayerType::MeshLayer:
{
QgsSettings settings;
QString lastUsedDir = settings.value( QStringLiteral( "style/lastStyleDir" ), QDir::homePath() ).toString();
QString filename = QFileDialog::getSaveFileName( this,
tr( "Save as QGIS Layer Style File" ),
lastUsedDir,
tr( "QGIS Layer Style File" ) + " (*.qml)" );
if ( filename.isEmpty() )
return;

if ( ! filename.endsWith( QStringLiteral( ".qml" ) ) )
{
filename += QStringLiteral( ".qml" );
}

bool defaultLoadedFlag;
layer->saveNamedStyle( filename, defaultLoadedFlag );

settings.setValue( QStringLiteral( "style/lastStyleDir" ), filename );
break;
}

case QgsMapLayerType::VectorTileLayer:
case QgsMapLayerType::AnnotationLayer:
case QgsMapLayerType::PluginLayer:
break;

}
}

///@cond PRIVATE
Expand Down

0 comments on commit 1ad2e78

Please sign in to comment.