16 #include <QMessageBox> 
   35   setWindowTitle( tr( 
"Database Styles Manager" ) );
 
   37   mDeleteButton = mButtonBox->button( QDialogButtonBox::StandardButton::Close );
 
   38   mDeleteButton->setText( tr( 
"Delete Style" ) );
 
   40   mLoadButton = mButtonBox->button( QDialogButtonBox::StandardButton::Open );
 
   41   mLoadButton->setText( tr( 
"Load Style" ) );
 
   42   mCancelButton = mButtonBox->button( QDialogButtonBox::StandardButton::Cancel );
 
   47   if ( providerName == QLatin1String( 
"ogr" ) )
 
   51     if ( providerName == QLatin1String( 
"GPKG" ) )
 
   52       providerName = QStringLiteral( 
"GeoPackage" );
 
   55   const QString myLastUsedDir = settings.
value( QStringLiteral( 
"style/lastStyleDir" ), QDir::homePath() ).toString();
 
   58   connect( mStyleTypeComboBox, qOverload<int>( &QComboBox::currentIndexChanged ), 
this, [ = ]( 
int )
 
   62     mFileLabel->setVisible( !vl || type != QgsVectorLayerProperties::StyleType::DB );
 
   63     mFileWidget->setVisible( !vl || type != QgsVectorLayerProperties::StyleType::DB );
 
   66       mFromDbWidget->setVisible( type == QgsVectorLayerProperties::StyleType::DB );
 
   71       mFromDbWidget->setVisible( 
false );
 
   72       mDeleteButton->setVisible( 
false );
 
   75     mStyleCategoriesListView->setEnabled( !vl || 
currentStyleType() != QgsVectorLayerProperties::StyleType::SLD );
 
   76     updateLoadButtonState();
 
   80   if ( 
QgsVectorLayer *vl = qobject_cast< QgsVectorLayer * >( mLayer ) )
 
   82     if ( vl->dataProvider()->isSaveAndLoadStyleToDatabaseSupported() )
 
   84       mStyleTypeComboBox->addItem( tr( 
"From Database (%1)" ).arg( providerName ), QgsVectorLayerProperties::StyleType::DB );
 
   85       if ( settings.
value( QStringLiteral( 
"style/lastLoadStyleTypeSelection" ) ) == QgsVectorLayerProperties::StyleType::DB )
 
   87         mStyleTypeComboBox->setCurrentIndex( mStyleTypeComboBox->findData( QgsVectorLayerProperties::StyleType::DB ) );
 
   96   mStyleCategoriesListView->setModel( mModel );
 
   99   switch ( mLayer->
type() )
 
  102       mFileWidget->setFilter( tr( 
"QGIS Layer Style File, SLD File" ) + QStringLiteral( 
" (*.qml *.sld)" ) );
 
  106       mFileWidget->setFilter( tr( 
"All Styles" ) + QStringLiteral( 
" (*.qml *.json);;" )
 
  107                               + tr( 
"QGIS Layer Style File" ) + QStringLiteral( 
" (*.qml);;" )
 
  108                               + tr( 
"MapBox GL Style JSON File" ) + QStringLiteral( 
" (*.json)" ) );
 
  122   mFileWidget->setDefaultRoot( myLastUsedDir );
 
  128     const QFileInfo tmplFileInfo( path );
 
  129     settings.
setValue( QStringLiteral( 
"style/lastStyleDir" ), tmplFileInfo.absolutePath() );
 
  131     updateLoadButtonState();
 
  135   mLoadButton->setDisabled( 
true );
 
  136   mDeleteButton->setDisabled( 
true );
 
  137   mRelatedTable->setEditTriggers( QTableWidget::NoEditTriggers );
 
  138   mRelatedTable->horizontalHeader()->setStretchLastSection( 
true );
 
  139   mRelatedTable->setSelectionBehavior( QTableWidget::SelectRows );
 
  140   mRelatedTable->verticalHeader()->setVisible( 
false );
 
  141   mOthersTable->setEditTriggers( QTableWidget::NoEditTriggers );
 
  142   mOthersTable->horizontalHeader()->setStretchLastSection( 
true );
 
  143   mOthersTable->setSelectionBehavior( QTableWidget::SelectRows );
 
  144   mOthersTable->verticalHeader()->setVisible( 
false );
 
  145   connect( mRelatedTable->selectionModel(), &QItemSelectionModel::selectionChanged, 
this, &QgsMapLayerLoadStyleDialog::onRelatedTableSelectionChanged );
 
  146   connect( mOthersTable->selectionModel(), &QItemSelectionModel::selectionChanged, 
this, &QgsMapLayerLoadStyleDialog::onOthersTableSelectionChanged );
 
  147   connect( mRelatedTable, &QTableWidget::doubleClicked, 
this, &QDialog::accept );
 
  148   connect( mOthersTable, &QTableWidget::doubleClicked, 
this, &QDialog::accept );
 
  149   connect( mCancelButton, &QPushButton::clicked, 
this, &QDialog::reject );
 
  150   connect( mButtonBox, &QDialogButtonBox::helpRequested, 
this, &QgsMapLayerLoadStyleDialog::showHelp );
 
  151   connect( mLoadButton, &QPushButton::clicked, 
this, &QDialog::accept );
 
  152   connect( mDeleteButton, &QPushButton::clicked, 
this, &QgsMapLayerLoadStyleDialog::deleteStyleFromDB );
 
  153   connect( 
this, &QgsMapLayerLoadStyleDialog::rejected, [ = ]
 
  158   setTabOrder( mRelatedTable, mOthersTable );
 
  160   mStyleCategoriesListView->adjustSize();
 
  173     const QFileInfo fi( mFileWidget->filePath() );
 
  174     if ( fi.exists() && fi.suffix().compare( QStringLiteral( 
"sld" ), Qt::CaseInsensitive ) == 0 )
 
  182   return QFileInfo( mFileWidget->filePath() ).suffix();
 
  187   return mFileWidget->filePath();
 
  193   mSectionLimit = sectionLimit;
 
  194   const int relatedTableNOfCols = sectionLimit > 0 ? 2 : 1;
 
  195   const int othersTableNOfCols = ( sectionLimit >= 0 && ids.count() - sectionLimit > 0 ) ? 2 : 1;
 
  196   const QString twoColsHeader( QStringLiteral( 
"Name;Description" ) );
 
  197   const QString oneColsHeader( QStringLiteral( 
"No styles found in the database" ) );
 
  198   const QString relatedTableHeader = relatedTableNOfCols == 1 ? oneColsHeader : twoColsHeader;
 
  199   const QString othersTableHeader = othersTableNOfCols == 1 ? oneColsHeader : twoColsHeader;
 
  201   mRelatedTable->setColumnCount( relatedTableNOfCols );
 
  202   mOthersTable->setColumnCount( othersTableNOfCols );
 
  203   mRelatedTable->setHorizontalHeaderLabels( relatedTableHeader.split( 
';' ) );
 
  204   mOthersTable->setHorizontalHeaderLabels( othersTableHeader.split( 
';' ) );
 
  205   mRelatedTable->setRowCount( sectionLimit );
 
  206   mOthersTable->setRowCount( sectionLimit >= 0 ? ( ids.count() - sectionLimit ) : 0 );
 
  207   mRelatedTable->setDisabled( relatedTableNOfCols == 1 );
 
  208   mOthersTable->setDisabled( othersTableNOfCols == 1 );
 
  210   if ( sectionLimit >= 0 )
 
  212     for ( 
int i = 0; i < sectionLimit; i++ )
 
  214       QTableWidgetItem *item = 
new QTableWidgetItem( names.value( i, QString() ) );
 
  215       item->setData( Qt::UserRole, ids[i] );
 
  216       mRelatedTable->setItem( i, 0, item );
 
  217       mRelatedTable->setItem( i, 1, 
new QTableWidgetItem( descriptions.value( i, QString() ) ) );
 
  219     for ( 
int i = sectionLimit; i < ids.count(); i++ )
 
  221       const int j = i - sectionLimit;
 
  222       QTableWidgetItem *item = 
new QTableWidgetItem( names.value( i, QString() ) );
 
  223       item->setData( Qt::UserRole, ids[i] );
 
  224       mOthersTable->setItem( j, 0, item );
 
  225       mOthersTable->setItem( j, 1, 
new QTableWidgetItem( descriptions.value( i, QString() ) ) );
 
  232   return mSelectedStyleId;
 
  235 void QgsMapLayerLoadStyleDialog::onRelatedTableSelectionChanged()
 
  237   selectionChanged( mRelatedTable );
 
  238   if ( mRelatedTable->selectionModel()->hasSelection() )
 
  240     if ( mOthersTable->selectionModel()->hasSelection() )
 
  242       disconnect( mOthersTable->selectionModel(), &QItemSelectionModel::selectionChanged, 
this, &QgsMapLayerLoadStyleDialog::onOthersTableSelectionChanged );
 
  243       const QTableWidgetSelectionRange range( 0, 0, mOthersTable->rowCount() - 1, mOthersTable->columnCount() - 1 );
 
  244       mOthersTable->setRangeSelected( range, 
false );
 
  245       connect( mOthersTable->selectionModel(), &QItemSelectionModel::selectionChanged, 
this, &QgsMapLayerLoadStyleDialog::onOthersTableSelectionChanged );
 
  250 void QgsMapLayerLoadStyleDialog::onOthersTableSelectionChanged()
 
  252   selectionChanged( mOthersTable );
 
  253   if ( mOthersTable->selectionModel()->hasSelection() )
 
  255     if ( mRelatedTable->selectionModel()->hasSelection() )
 
  257       disconnect( mRelatedTable->selectionModel(), &QItemSelectionModel::selectionChanged, 
this, &QgsMapLayerLoadStyleDialog::onRelatedTableSelectionChanged );
 
  258       const QTableWidgetSelectionRange range( 0, 0, mRelatedTable->rowCount() - 1, mRelatedTable->columnCount() - 1 );
 
  259       mRelatedTable->setRangeSelected( range, 
false );
 
  260       connect( mRelatedTable->selectionModel(), &QItemSelectionModel::selectionChanged, 
this, &QgsMapLayerLoadStyleDialog::onRelatedTableSelectionChanged );
 
  265 void QgsMapLayerLoadStyleDialog::selectionChanged( QTableWidget *styleTable )
 
  267   QTableWidgetItem *item = 
nullptr;
 
  268   const QList<QTableWidgetItem *> selected = styleTable->selectedItems();
 
  270   if ( !selected.isEmpty() )
 
  272     item = selected.at( 0 );
 
  273     mSelectedStyleName = item->text();
 
  274     mSelectedStyleId = item->data( Qt::UserRole ).toString();
 
  275     mLoadButton->setEnabled( 
true );
 
  276     mDeleteButton->setEnabled( 
true );
 
  280     mSelectedStyleName.clear();
 
  281     mSelectedStyleId.clear();
 
  282     mLoadButton->setEnabled( 
false );
 
  283     mDeleteButton->setEnabled( 
false );
 
  286   updateLoadButtonState();
 
  297 void QgsMapLayerLoadStyleDialog::deleteStyleFromDB()
 
  304   const QString opInfo = QObject::tr( 
"Delete style %1 from %2" ).arg( mSelectedStyleName, mLayer->
providerType() );
 
  306   if ( QMessageBox::question( 
nullptr, QObject::tr( 
"Delete Style" ),
 
  307                               QObject::tr( 
"Are you sure you want to delete the style %1?" ).arg( mSelectedStyleName ),
 
  308                               QMessageBox::Yes | QMessageBox::No, QMessageBox::No ) != QMessageBox::Yes )
 
  312   if ( !msgError.isNull() )
 
  315     QMessageBox::warning( 
this, opInfo, tr( 
"%1: fail. %2" ).arg( opInfo, msgError ) );
 
  322     mRelatedTable->setRowCount( 0 );
 
  323     mOthersTable->setRowCount( 0 );
 
  327     QStringList ids, names, descriptions;
 
  330     if ( !errorMsg.isNull() )
 
  332       QMessageBox::warning( 
this, tr( 
"Error occurred while retrieving styles from database" ), errorMsg );
 
  341 void QgsMapLayerLoadStyleDialog::updateLoadButtonState()
 
  347                                && ( mRelatedTable->selectionModel()->hasSelection() || mOthersTable->selectionModel()->hasSelection()
 
  353     mLoadButton->setEnabled( !mFileWidget->filePath().isEmpty() );
 
  357 void QgsMapLayerLoadStyleDialog::showHelp()
 
  359   QgsHelp::openHelp( QStringLiteral( 
"introduction/general_tools.html#save-and-share-layer-properties" ) );
 
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
 
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
 
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
 
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.
 
QgsMapLayerLoadStyleDialog(QgsMapLayer *layer, QWidget *parent=nullptr)
Constructor for QgsMapLayerLoadStyleDialog, associated with the specified map layer.
 
QString filePath() const
Returns the full path to the selected layer style source file.
 
QString fileExtension() const
Returns the file extension for the selected layer style source file.
 
QgsVectorLayerProperties::StyleType currentStyleType() const
Returns the selected vector style type, for vector layers only.
 
Model for layer style categories.
 
void setCategories(QgsMapLayer::StyleCategories categories)
Reset the model data.
 
QgsMapLayer::StyleCategories categories() const
Returns the categories as defined in the model.
 
Base class for all map layer types.
 
QString providerType() const
Returns the provider type (provider key) for this layer.
 
This class is a composition of two QSettings instances:
 
T flagValue(const QString &key, const T &defaultValue, const Section section=NoSection)
Returns the setting value for a setting based on a flag.
 
void setFlagValue(const QString &key, const T &value, const Section section=NoSection)
Set the value of a setting based on a flag.
 
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.
 
virtual QString storageType() const
Returns the permanent storage type for this layer as a friendly name.
 
virtual bool isDeleteStyleFromDatabaseSupported() const
It returns false by default.
 
Represents a vector layer which manages a vector based data sets.
 
virtual int listStylesInDatabase(QStringList &ids, QStringList &names, QStringList &descriptions, QString &msgError)
Lists all the style in db split into related to the layer and not related to.
 
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
 
virtual bool deleteStyleFromDatabase(const QString &styleId, QString &msgError)
Deletes a style from the database.
 
@ PointCloudLayer
Point cloud layer. Added in QGIS 3.18.
 
@ MeshLayer
Mesh layer. Added in QGIS 3.2.
 
@ VectorLayer
Vector layer.
 
@ RasterLayer
Raster layer.
 
@ GroupLayer
Composite group layer. Added in QGIS 3.24.
 
@ VectorTileLayer
Vector tile layer. Added in QGIS 3.14.
 
@ AnnotationLayer
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
 
@ PluginLayer
Plugin based layer.