16 #include <QVBoxLayout> 
   18 #include <QInputDialog> 
   19 #include <QMessageBox> 
   20 #include <QFileDialog> 
   23 #include "qgssettings.h" 
   38   mModel = 
new QStandardItemModel( 
this );
 
   39   mStyleList = 
new QListView( 
this );
 
   40   mStyleList->setModel( mModel );
 
   41   mStyleList->setViewMode( QListView::ListMode );
 
   42   mStyleList->setResizeMode( QListView::Adjust );
 
   44   QToolBar *toolbar = 
new QToolBar( 
this );
 
   45   QAction *addAction = toolbar->addAction( tr( 
"Add" ) );
 
   47   connect( addAction, &QAction::triggered, 
this, &QgsMapLayerStyleManagerWidget::addStyle );
 
   48   QAction *removeAction = toolbar->addAction( tr( 
"Remove Current" ) );
 
   50   connect( removeAction, &QAction::triggered, 
this, &QgsMapLayerStyleManagerWidget::removeStyle );
 
   51   QAction *loadFromFileAction = toolbar->addAction( tr( 
"Load Style" ) );
 
   53   connect( loadFromFileAction, &QAction::triggered, 
this, &QgsMapLayerStyleManagerWidget::loadStyle );
 
   54   QAction *saveAsDefaultAction = toolbar->addAction( tr( 
"Save as Default" ) );
 
   55   connect( saveAsDefaultAction, &QAction::triggered, 
this, &QgsMapLayerStyleManagerWidget::saveAsDefault );
 
   56   QAction *loadDefaultAction = toolbar->addAction( tr( 
"Restore Default" ) );
 
   57   connect( loadDefaultAction, &QAction::triggered, 
this, &QgsMapLayerStyleManagerWidget::loadDefault );
 
   67   connect( mStyleList, &QAbstractItemView::clicked, 
this, &QgsMapLayerStyleManagerWidget::styleClicked );
 
   69   setLayout( 
new QVBoxLayout() );
 
   70   layout()->setContentsMargins( 0, 0, 0, 0 );
 
   71   layout()->addWidget( toolbar );
 
   72   layout()->addWidget( mStyleList );
 
   82   for ( 
const QString &styleName : styles )
 
   84     QStandardItem *item = 
new QStandardItem( styleName );
 
   85     item->setData( styleName );
 
   86     mModel->appendRow( item );
 
   90   currentStyleChanged( active );
 
   92   connect( mModel, &QStandardItemModel::itemChanged, 
this, &QgsMapLayerStyleManagerWidget::renameStyle );
 
   95 void QgsMapLayerStyleManagerWidget::styleClicked( 
const QModelIndex &index )
 
  100   QString name = index.data().toString();
 
  104 void QgsMapLayerStyleManagerWidget::currentStyleChanged( 
const QString &name )
 
  106   QList<QStandardItem *> items = mModel->findItems( name );
 
  107   if ( items.isEmpty() )
 
  110   QStandardItem *item = items.at( 0 );
 
  112   mStyleList->setCurrentIndex( item->index() );
 
  115 void QgsMapLayerStyleManagerWidget::styleAdded( 
const QString &name )
 
  118   QStandardItem *item = 
new QStandardItem( name );
 
  119   item->setData( name );
 
  120   mModel->appendRow( item );
 
  123 void QgsMapLayerStyleManagerWidget::styleRemoved( 
const QString &name )
 
  125   QList<QStandardItem *> items = mModel->findItems( name );
 
  126   if ( items.isEmpty() )
 
  129   QStandardItem *item = items.at( 0 );
 
  130   mModel->removeRow( item->row() );
 
  133 void QgsMapLayerStyleManagerWidget::styleRenamed( 
const QString &oldname, 
const QString &newname )
 
  135   QList<QStandardItem *> items = mModel->findItems( oldname );
 
  136   if ( items.isEmpty() )
 
  139   QStandardItem *item = items.at( 0 );
 
  140   item->setText( newname );
 
  141   item->setData( newname );
 
  144 void QgsMapLayerStyleManagerWidget::addStyle()
 
  147   QString text = QInputDialog::getText( 
nullptr, tr( 
"New Style" ),
 
  148                                         tr( 
"Style name:" ), QLineEdit::Normal,
 
  149                                         QStringLiteral( 
"new style" ), &ok );
 
  150   if ( !ok || text.isEmpty() )
 
  164 void QgsMapLayerStyleManagerWidget::removeStyle()
 
  167   QList<QStandardItem *> items = mModel->findItems( current );
 
  168   if ( items.isEmpty() )
 
  171   QStandardItem *item = items.at( 0 );
 
  175     mModel->removeRow( item->row() );
 
  179     QgsDebugMsg( QStringLiteral( 
"Failed to remove current style" ) );
 
  184 void QgsMapLayerStyleManagerWidget::renameStyle( QStandardItem *item )
 
  186   const QString oldName = item->data().toString();
 
  187   const QString newName = item->text();
 
  188   item->setData( newName );
 
  189   whileBlocking( 
this )->mLayer->styleManager()->renameStyle( oldName, newName );
 
  192 void QgsMapLayerStyleManagerWidget::saveAsDefault()
 
  198     if ( layer->dataProvider()->isSaveAndLoadStyleToDatabaseSupported() )
 
  200       QMessageBox askToUser;
 
  201       askToUser.setWindowTitle( tr( 
"Save Style" ) );
 
  202       askToUser.setText( tr( 
"Save default style to: " ) );
 
  203       askToUser.setIcon( QMessageBox::Question );
 
  204       askToUser.addButton( tr( 
"Cancel" ), QMessageBox::RejectRole );
 
  205       askToUser.addButton( tr( 
"Local Database" ), QMessageBox::NoRole );
 
  206       askToUser.addButton( tr( 
"Datasource Database" ), QMessageBox::YesRole );
 
  208       switch ( askToUser.exec() )
 
  213           layer->saveStyleToDatabase( QString(), QString(), 
true, QString(), errorMsg );
 
  214           if ( errorMsg.isNull() )
 
  225   bool defaultSavedFlag = 
false;
 
  227   if ( !defaultSavedFlag )
 
  229     QMessageBox::warning( 
this, tr( 
"Default Style" ), errorMsg );
 
  234 void QgsMapLayerStyleManagerWidget::loadDefault()
 
  237   bool defaultLoadedFlag = 
false;
 
  241     if ( layer->dataProvider()->isSaveAndLoadStyleToDatabaseSupported() )
 
  243       QMessageBox askToUser;
 
  244       askToUser.setWindowTitle( tr( 
"Load Style" ) );
 
  245       askToUser.setText( tr( 
"Load default style from: " ) );
 
  246       askToUser.setIcon( QMessageBox::Question );
 
  247       askToUser.addButton( tr( 
"Cancel" ), QMessageBox::RejectRole );
 
  248       askToUser.addButton( tr( 
"Local Database" ), QMessageBox::NoRole );
 
  249       askToUser.addButton( tr( 
"Datasource Database" ), QMessageBox::YesRole );
 
  251       switch ( askToUser.exec() )
 
  256           msg = layer->loadNamedStyle( 
mLayer->
styleURI(), defaultLoadedFlag );
 
  257           if ( !defaultLoadedFlag )
 
  260             QMessageBox::information( 
this, tr( 
"Default Style" ), msg );
 
  262           if ( msg.compare( tr( 
"Loaded from Provider" ) ) )
 
  264             QMessageBox::information( 
this, tr( 
"Default Style" ),
 
  265                                       tr( 
"No default style was found for this layer" ) );
 
  277     myMessage = layer->loadNamedStyle( 
mLayer->
styleURI(), defaultLoadedFlag, 
true );
 
  281     myMessage = layer->loadNamedStyle( 
mLayer->
styleURI(), defaultLoadedFlag );
 
  288   if ( !defaultLoadedFlag )
 
  291     QMessageBox::information( 
this, tr( 
"Default Style" ), myMessage );
 
  300 void QgsMapLayerStyleManagerWidget::saveStyle()
 
  305 void QgsMapLayerStyleManagerWidget::loadStyle()
 
  307   QgsSettings myQSettings;  
 
  308   QString myLastUsedDir = myQSettings.value( QStringLiteral( 
"style/lastStyleDir" ), QDir::homePath() ).toString();
 
  310   QString myFileName = QFileDialog::getOpenFileName( 
this, tr( 
"Load layer properties from style file" ), myLastUsedDir,
 
  311                        tr( 
"QGIS Layer Style File" ) + 
" (*.qml);;" + tr( 
"SLD File" ) + 
" (*.sld)" );
 
  312   if ( myFileName.isNull() )
 
  318   bool defaultLoadedFlag = 
false;
 
  320   if ( myFileName.endsWith( QLatin1String( 
".sld" ), Qt::CaseInsensitive ) )
 
  330   if ( defaultLoadedFlag )
 
  337     QMessageBox::warning( 
this, tr( 
"Load Style" ), myMessage );
 
  340   QFileInfo myFI( myFileName );
 
  341   QString myPath = myFI.path();
 
  342   myQSettings.setValue( QStringLiteral( 
"style/lastStyleDir" ), myPath );
 
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.
QString currentStyle() const
Returns name of the current style.
bool removeStyle(const QString &name)
Remove a stored style.
QStringList styles() const
Returns list of all defined style names.
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.
bool addStyleFromLayer(const QString &name)
Add style by cloning the current one.
void currentStyleChanged(const QString ¤tName)
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.
virtual QString saveDefaultStyle(bool &resultFlag)
Save the properties of this layer as the default style (either as a .qml file on disk or as a record ...
virtual QString loadSldStyle(const QString &uri, bool &resultFlag)
Attempts to style the layer using the formatting from an SLD type file.
virtual QString styleURI() const
Retrieve the style URI for this layer (either as a .qml file on disk or as a record in the users styl...
virtual QString loadNamedStyle(const QString &uri, bool &resultFlag, QgsMapLayer::StyleCategories categories=QgsMapLayer::AllStyleCategories)
Retrieve a named style for this layer if one exists (either as a .qml file on disk or as a record in ...
QgsMapLayerStyleManager * styleManager() const
Gets access to the layer's style manager.
Represents a raster layer.
Represents a vector layer which manages a vector based data sets.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.