20#include "moc_qgsmaplayerloadstyledialog.cpp"
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 );
46 const QString myLastUsedDir = settings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
49 connect( mStyleTypeComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
this, [ = ](
int )
58 updateLoadButtonState();
76 mStyleCategoriesListView->setModel( mModel );
77 mStyleCategoriesListView->setWordWrap(
true );
81 switch ( mLayer->
type() )
84 mFileWidget->setFilter( tr(
"QGIS Layer Style File, SLD File" ) + QStringLiteral(
" (*.qml *.sld)" ) );
88 mFileWidget->setFilter( tr(
"All Styles" ) + QStringLiteral(
" (*.qml *.json);;" )
89 + tr(
"QGIS Layer Style File" ) + QStringLiteral(
" (*.qml);;" )
90 + tr(
"MapBox GL Style JSON File" ) + QStringLiteral(
" (*.json)" ) );
105 mFileWidget->setDefaultRoot( myLastUsedDir );
110 const QFileInfo tmplFileInfo( path );
111 settings.
setValue( QStringLiteral(
"style/lastStyleDir" ), tmplFileInfo.absolutePath() );
113 updateLoadButtonState();
117 mLoadButton->setDisabled(
true );
118 mDeleteButton->setDisabled(
true );
119 mRelatedTable->setEditTriggers( QTableWidget::NoEditTriggers );
120 mRelatedTable->horizontalHeader()->setStretchLastSection(
true );
121 mRelatedTable->setSelectionBehavior( QTableWidget::SelectRows );
122 mRelatedTable->verticalHeader()->setVisible(
false );
123 mOthersTable->setEditTriggers( QTableWidget::NoEditTriggers );
124 mOthersTable->horizontalHeader()->setStretchLastSection(
true );
125 mOthersTable->setSelectionBehavior( QTableWidget::SelectRows );
126 mOthersTable->verticalHeader()->setVisible(
false );
127 connect( mRelatedTable->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &QgsMapLayerLoadStyleDialog::onRelatedTableSelectionChanged );
128 connect( mOthersTable->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &QgsMapLayerLoadStyleDialog::onOthersTableSelectionChanged );
129 connect( mRelatedTable, &QTableWidget::doubleClicked,
this, &QDialog::accept );
130 connect( mOthersTable, &QTableWidget::doubleClicked,
this, &QDialog::accept );
131 connect( mCancelButton, &QPushButton::clicked,
this, &QDialog::reject );
132 connect( mButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsMapLayerLoadStyleDialog::showHelp );
133 connect( mLoadButton, &QPushButton::clicked,
this, &QDialog::accept );
134 connect( mDeleteButton, &QPushButton::clicked,
this, &QgsMapLayerLoadStyleDialog::deleteStyleFromDB );
135 connect(
this, &QgsMapLayerLoadStyleDialog::rejected, [ = ]
140 setTabOrder( mRelatedTable, mOthersTable );
142 mStyleCategoriesListView->adjustSize();
145 connect( mSelectAllButton, &QPushButton::clicked,
this, &QgsMapLayerLoadStyleDialog::selectAll );
146 connect( mDeselectAllButton, &QPushButton::clicked,
this, &QgsMapLayerLoadStyleDialog::deselectAll );
147 connect( mInvertSelectionButton, &QPushButton::clicked,
this, &QgsMapLayerLoadStyleDialog::invertSelection );
150void QgsMapLayerLoadStyleDialog::invertSelection()
152 for (
int i = 0; i < mModel->
rowCount( QModelIndex() ); i++ )
154 QModelIndex index = mModel->index( i, 0 );
155 Qt::CheckState currentState = Qt::CheckState( mModel->
data( index, Qt::CheckStateRole ).toInt() );
156 Qt::CheckState newState = ( currentState == Qt::Checked ) ? Qt::Unchecked : Qt::Checked;
157 mModel->
setData( index, newState, Qt::CheckStateRole );
161void QgsMapLayerLoadStyleDialog::selectAll()
163 for (
int i = 0; i < mModel->
rowCount( QModelIndex() ); i++ )
165 QModelIndex index = mModel->index( i, 0 );
166 mModel->
setData( index, Qt::Checked, Qt::CheckStateRole );
170void QgsMapLayerLoadStyleDialog::deselectAll()
172 for (
int i = 0; i < mModel->
rowCount( QModelIndex() ); i++ )
174 QModelIndex index = mModel->index( i, 0 );
175 mModel->
setData( index, Qt::Unchecked, Qt::CheckStateRole );
189 const QFileInfo fi( mFileWidget->filePath() );
190 if ( fi.exists() && fi.suffix().compare( QStringLiteral(
"sld" ), Qt::CaseInsensitive ) == 0 )
198 return QFileInfo( mFileWidget->filePath() ).suffix();
203 return mFileWidget->filePath();
209 mSectionLimit = sectionLimit;
210 const int relatedTableNOfCols = sectionLimit > 0 ? 2 : 1;
211 const int othersTableNOfCols = ( sectionLimit >= 0 && ids.count() - sectionLimit > 0 ) ? 2 : 1;
212 const QString twoColsHeader( QStringLiteral(
"Name;Description" ) );
213 const QString oneColsHeader( QStringLiteral(
"No styles found in the database" ) );
214 const QString relatedTableHeader = relatedTableNOfCols == 1 ? oneColsHeader : twoColsHeader;
215 const QString othersTableHeader = othersTableNOfCols == 1 ? oneColsHeader : twoColsHeader;
217 mRelatedTable->setColumnCount( relatedTableNOfCols );
218 mOthersTable->setColumnCount( othersTableNOfCols );
219 mRelatedTable->setHorizontalHeaderLabels( relatedTableHeader.split(
';' ) );
220 mOthersTable->setHorizontalHeaderLabels( othersTableHeader.split(
';' ) );
221 mRelatedTable->setRowCount( sectionLimit );
222 mOthersTable->setRowCount( sectionLimit >= 0 ? ( ids.count() - sectionLimit ) : 0 );
223 mRelatedTable->setDisabled( relatedTableNOfCols == 1 );
224 mOthersTable->setDisabled( othersTableNOfCols == 1 );
226 if ( sectionLimit >= 0 )
228 for (
int i = 0; i < sectionLimit; i++ )
230 QTableWidgetItem *item =
new QTableWidgetItem( names.value( i, QString() ) );
231 item->setData( Qt::UserRole, ids[i] );
232 mRelatedTable->setItem( i, 0, item );
233 mRelatedTable->setItem( i, 1,
new QTableWidgetItem( descriptions.value( i, QString() ) ) );
235 for (
int i = sectionLimit; i < ids.count(); i++ )
237 const int j = i - sectionLimit;
238 QTableWidgetItem *item =
new QTableWidgetItem( names.value( i, QString() ) );
239 item->setData( Qt::UserRole, ids[i] );
240 mOthersTable->setItem( j, 0, item );
241 mOthersTable->setItem( j, 1,
new QTableWidgetItem( descriptions.value( i, QString() ) ) );
248 return mSelectedStyleId;
251void QgsMapLayerLoadStyleDialog::onRelatedTableSelectionChanged()
253 selectionChanged( mRelatedTable );
254 if ( mRelatedTable->selectionModel()->hasSelection() )
256 if ( mOthersTable->selectionModel()->hasSelection() )
258 disconnect( mOthersTable->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &QgsMapLayerLoadStyleDialog::onOthersTableSelectionChanged );
259 const QTableWidgetSelectionRange range( 0, 0, mOthersTable->rowCount() - 1, mOthersTable->columnCount() - 1 );
260 mOthersTable->setRangeSelected( range,
false );
261 connect( mOthersTable->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &QgsMapLayerLoadStyleDialog::onOthersTableSelectionChanged );
266void QgsMapLayerLoadStyleDialog::onOthersTableSelectionChanged()
268 selectionChanged( mOthersTable );
269 if ( mOthersTable->selectionModel()->hasSelection() )
271 if ( mRelatedTable->selectionModel()->hasSelection() )
273 disconnect( mRelatedTable->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &QgsMapLayerLoadStyleDialog::onRelatedTableSelectionChanged );
274 const QTableWidgetSelectionRange range( 0, 0, mRelatedTable->rowCount() - 1, mRelatedTable->columnCount() - 1 );
275 mRelatedTable->setRangeSelected( range,
false );
276 connect( mRelatedTable->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &QgsMapLayerLoadStyleDialog::onRelatedTableSelectionChanged );
281void QgsMapLayerLoadStyleDialog::selectionChanged( QTableWidget *styleTable )
283 QTableWidgetItem *item =
nullptr;
284 const QList<QTableWidgetItem *> selected = styleTable->selectedItems();
286 if ( !selected.isEmpty() )
288 item = selected.at( 0 );
289 mSelectedStyleName = item->text();
290 mSelectedStyleId = item->data( Qt::UserRole ).toString();
291 mLoadButton->setEnabled(
true );
292 mDeleteButton->setEnabled(
true );
296 mSelectedStyleName.clear();
297 mSelectedStyleId.clear();
298 mLoadButton->setEnabled(
false );
299 mDeleteButton->setEnabled(
false );
302 updateLoadButtonState();
313void QgsMapLayerLoadStyleDialog::deleteStyleFromDB()
316 const QString opInfo = QObject::tr(
"Delete style %1 from %2" ).arg( mSelectedStyleName, mLayer->
providerType() );
318 if ( QMessageBox::question(
nullptr, QObject::tr(
"Delete Style" ),
319 QObject::tr(
"Are you sure you want to delete the style %1?" ).arg( mSelectedStyleName ),
320 QMessageBox::Yes | QMessageBox::No, QMessageBox::No ) != QMessageBox::Yes )
324 if ( !msgError.isNull() )
327 QMessageBox::warning(
this, opInfo, tr(
"%1: fail. %2" ).arg( opInfo, msgError ) );
334 mRelatedTable->setRowCount( 0 );
335 mOthersTable->setRowCount( 0 );
339 QStringList ids, names, descriptions;
342 if ( !errorMsg.isNull() )
344 QMessageBox::warning(
this, tr(
"Error occurred while retrieving styles from database" ), errorMsg );
353void QgsMapLayerLoadStyleDialog::updateLoadButtonState()
357 && ( mRelatedTable->selectionModel()->hasSelection() || mOthersTable->selectionModel()->hasSelection()
363void QgsMapLayerLoadStyleDialog::showHelp()
365 QgsHelp::openHelp( QStringLiteral(
"introduction/general_tools.html#save-and-share-layer-properties" ) );
@ Group
Composite group layer. Added in QGIS 3.24.
@ Plugin
Plugin based layer.
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
@ Mesh
Mesh layer. Added in QGIS 3.2.
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
A label delegate being able to display html encoded content.
virtual Qgis::ProviderStyleStorageCapabilities styleStorageCapabilities() const
Returns the style storage capabilities.
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.
StyleType
Style storage type.
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.
QgsLayerPropertiesDialog::StyleType currentStyleType() const
Returns the selected style type.
Model for layer style categories.
void setCategories(QgsMapLayer::StyleCategories categories)
Reset the model data.
QVariant data(const QModelIndex &index, int role) const override
bool setData(const QModelIndex &index, const QVariant &value, int role) override
QgsMapLayer::StyleCategories categories() const
Returns the categories as defined in the model.
int rowCount(const QModelIndex &=QModelIndex()) const override
Base class for all map layer types.
virtual bool deleteStyleFromDatabase(const QString &styleId, QString &msgError)
Deletes a style from the database.
QString providerType() const
Returns the provider type (provider key) for this layer.
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.
QFlags< StyleCategory > StyleCategories
virtual Q_INVOKABLE QgsDataProvider * dataProvider()
Returns the layer's data provider, it may be nullptr.
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.
#define QgsDebugError(str)