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.