29#include "moc_qgsmaplayerloadstyledialog.cpp"
37 setWindowTitle( tr(
"Database Styles Manager" ) );
39 mDeleteButton = mButtonBox->button( QDialogButtonBox::StandardButton::Close );
40 mDeleteButton->setText( tr(
"Delete Style" ) );
42 mLoadButton = mButtonBox->button( QDialogButtonBox::StandardButton::Open );
43 mLoadButton->setText( tr(
"Load Style" ) );
44 mCancelButton = mButtonBox->button( QDialogButtonBox::StandardButton::Cancel );
48 const QString myLastUsedDir = settings.
value( QStringLiteral(
"style/lastStyleDir" ), QDir::homePath() ).toString();
51 connect( mStyleTypeComboBox, qOverload<int>( &QComboBox::currentIndexChanged ),
this, [
this](
int ) {
59 updateLoadButtonState();
76 mModel->setCategories( lastStyleCategories );
77 mStyleCategoriesListView->setModel( mModel );
78 mStyleCategoriesListView->setWordWrap(
true );
82 switch ( mLayer->type() )
85 mFileWidget->setFilter( tr(
"QGIS Layer Style File, SLD File" ) + QStringLiteral(
" (*.qml *.sld)" ) );
89 mFileWidget->setFilter( tr(
"All Styles" ) + QStringLiteral(
" (*.qml *.json);;" ) + tr(
"QGIS Layer Style File" ) + QStringLiteral(
" (*.qml);;" ) + tr(
"MapBox GL Style JSON File" ) + QStringLiteral(
" (*.json)" ) );
103 mFileWidget->setDefaultRoot( myLastUsedDir );
107 const QFileInfo tmplFileInfo( path );
108 settings.
setValue( QStringLiteral(
"style/lastStyleDir" ), tmplFileInfo.absolutePath() );
110 updateLoadButtonState();
114 mLoadButton->setDisabled(
true );
115 mDeleteButton->setDisabled(
true );
116 mRelatedTable->setEditTriggers( QTableWidget::NoEditTriggers );
117 mRelatedTable->horizontalHeader()->setStretchLastSection(
true );
118 mRelatedTable->setSelectionBehavior( QTableWidget::SelectRows );
119 mRelatedTable->verticalHeader()->setVisible(
false );
120 mOthersTable->setEditTriggers( QTableWidget::NoEditTriggers );
121 mOthersTable->horizontalHeader()->setStretchLastSection(
true );
122 mOthersTable->setSelectionBehavior( QTableWidget::SelectRows );
123 mOthersTable->verticalHeader()->setVisible(
false );
124 connect( mRelatedTable->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &QgsMapLayerLoadStyleDialog::onRelatedTableSelectionChanged );
125 connect( mOthersTable->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &QgsMapLayerLoadStyleDialog::onOthersTableSelectionChanged );
126 connect( mRelatedTable, &QTableWidget::doubleClicked,
this, &QDialog::accept );
127 connect( mOthersTable, &QTableWidget::doubleClicked,
this, &QDialog::accept );
128 connect( mCancelButton, &QPushButton::clicked,
this, &QDialog::reject );
129 connect( mButtonBox, &QDialogButtonBox::helpRequested,
this, &QgsMapLayerLoadStyleDialog::showHelp );
130 connect( mLoadButton, &QPushButton::clicked,
this, &QDialog::accept );
131 connect( mDeleteButton, &QPushButton::clicked,
this, &QgsMapLayerLoadStyleDialog::deleteStyleFromDB );
132 connect(
this, &QgsMapLayerLoadStyleDialog::rejected, [
this] {
136 setTabOrder( mRelatedTable, mOthersTable );
138 mStyleCategoriesListView->adjustSize();
141 connect( mSelectAllButton, &QPushButton::clicked,
this, &QgsMapLayerLoadStyleDialog::selectAll );
142 connect( mDeselectAllButton, &QPushButton::clicked,
this, &QgsMapLayerLoadStyleDialog::deselectAll );
143 connect( mInvertSelectionButton, &QPushButton::clicked,
this, &QgsMapLayerLoadStyleDialog::invertSelection );
146void QgsMapLayerLoadStyleDialog::invertSelection()
148 for (
int i = 0; i < mModel->
rowCount( QModelIndex() ); i++ )
150 QModelIndex index = mModel->index( i, 0 );
151 Qt::CheckState currentState = Qt::CheckState( mModel->
data( index, Qt::CheckStateRole ).toInt() );
152 Qt::CheckState newState = ( currentState == Qt::Checked ) ? Qt::Unchecked : Qt::Checked;
153 mModel->
setData( index, newState, Qt::CheckStateRole );
157void QgsMapLayerLoadStyleDialog::selectAll()
159 for (
int i = 0; i < mModel->rowCount( QModelIndex() ); i++ )
161 QModelIndex index = mModel->index( i, 0 );
162 mModel->setData( index, Qt::Checked, Qt::CheckStateRole );
166void QgsMapLayerLoadStyleDialog::deselectAll()
168 for (
int i = 0; i < mModel->rowCount( QModelIndex() ); i++ )
170 QModelIndex index = mModel->index( i, 0 );
171 mModel->setData( index, Qt::Unchecked, Qt::CheckStateRole );
177 return mModel->categories();
185 const QFileInfo fi( mFileWidget->filePath() );
186 if ( fi.exists() && fi.suffix().compare( QStringLiteral(
"sld" ), Qt::CaseInsensitive ) == 0 )
194 return QFileInfo( mFileWidget->filePath() ).suffix();
199 return mFileWidget->filePath();
205 mSectionLimit = sectionLimit;
206 const int relatedTableNOfCols = sectionLimit > 0 ? 2 : 1;
207 const int othersTableNOfCols = ( sectionLimit >= 0 && ids.count() - sectionLimit > 0 ) ? 2 : 1;
208 const QString twoColsHeader( QStringLiteral(
"Name;Description" ) );
209 const QString oneColsHeader( QStringLiteral(
"No styles found in the database" ) );
210 const QString relatedTableHeader = relatedTableNOfCols == 1 ? oneColsHeader : twoColsHeader;
211 const QString othersTableHeader = othersTableNOfCols == 1 ? oneColsHeader : twoColsHeader;
213 mRelatedTable->setColumnCount( relatedTableNOfCols );
214 mOthersTable->setColumnCount( othersTableNOfCols );
215 mRelatedTable->setHorizontalHeaderLabels( relatedTableHeader.split(
';' ) );
216 mOthersTable->setHorizontalHeaderLabels( othersTableHeader.split(
';' ) );
217 mRelatedTable->setRowCount( sectionLimit );
218 mOthersTable->setRowCount( sectionLimit >= 0 ? ( ids.count() - sectionLimit ) : 0 );
219 mRelatedTable->setDisabled( relatedTableNOfCols == 1 );
220 mOthersTable->setDisabled( othersTableNOfCols == 1 );
222 if ( sectionLimit >= 0 )
224 for (
int i = 0; i < sectionLimit; i++ )
226 QTableWidgetItem *item =
new QTableWidgetItem( names.value( i, QString() ) );
227 item->setData( Qt::UserRole, ids[i] );
228 mRelatedTable->setItem( i, 0, item );
229 mRelatedTable->setItem( i, 1,
new QTableWidgetItem( descriptions.value( i, QString() ) ) );
231 for (
int i = sectionLimit; i < ids.count(); i++ )
233 const int j = i - sectionLimit;
234 QTableWidgetItem *item =
new QTableWidgetItem( names.value( i, QString() ) );
235 item->setData( Qt::UserRole, ids[i] );
236 mOthersTable->setItem( j, 0, item );
237 mOthersTable->setItem( j, 1,
new QTableWidgetItem( descriptions.value( i, QString() ) ) );
244 return mSelectedStyleId;
247void QgsMapLayerLoadStyleDialog::onRelatedTableSelectionChanged()
249 selectionChanged( mRelatedTable );
250 if ( mRelatedTable->selectionModel()->hasSelection() )
252 if ( mOthersTable->selectionModel()->hasSelection() )
254 disconnect( mOthersTable->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &QgsMapLayerLoadStyleDialog::onOthersTableSelectionChanged );
255 const QTableWidgetSelectionRange range( 0, 0, mOthersTable->rowCount() - 1, mOthersTable->columnCount() - 1 );
256 mOthersTable->setRangeSelected( range,
false );
257 connect( mOthersTable->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &QgsMapLayerLoadStyleDialog::onOthersTableSelectionChanged );
262void QgsMapLayerLoadStyleDialog::onOthersTableSelectionChanged()
264 selectionChanged( mOthersTable );
265 if ( mOthersTable->selectionModel()->hasSelection() )
267 if ( mRelatedTable->selectionModel()->hasSelection() )
269 disconnect( mRelatedTable->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &QgsMapLayerLoadStyleDialog::onRelatedTableSelectionChanged );
270 const QTableWidgetSelectionRange range( 0, 0, mRelatedTable->rowCount() - 1, mRelatedTable->columnCount() - 1 );
271 mRelatedTable->setRangeSelected( range,
false );
272 connect( mRelatedTable->selectionModel(), &QItemSelectionModel::selectionChanged,
this, &QgsMapLayerLoadStyleDialog::onRelatedTableSelectionChanged );
277void QgsMapLayerLoadStyleDialog::selectionChanged( QTableWidget *styleTable )
279 QTableWidgetItem *item =
nullptr;
280 const QList<QTableWidgetItem *> selected = styleTable->selectedItems();
282 if ( !selected.isEmpty() )
284 item = selected.at( 0 );
285 mSelectedStyleName = item->text();
286 mSelectedStyleId = item->data( Qt::UserRole ).toString();
287 mLoadButton->setEnabled(
true );
288 mDeleteButton->setEnabled(
true );
292 mSelectedStyleName.clear();
293 mSelectedStyleId.clear();
294 mLoadButton->setEnabled(
false );
295 mDeleteButton->setEnabled(
false );
298 updateLoadButtonState();
309void QgsMapLayerLoadStyleDialog::deleteStyleFromDB()
312 const QString opInfo = QObject::tr(
"Delete style %1 from %2" ).arg( mSelectedStyleName, mLayer->
providerType() );
314 if ( QMessageBox::question(
nullptr, QObject::tr(
"Delete Style" ), QObject::tr(
"Are you sure you want to delete the style %1?" ).arg( mSelectedStyleName ), QMessageBox::Yes | QMessageBox::No, QMessageBox::No ) != QMessageBox::Yes )
318 if ( !msgError.isNull() )
321 QMessageBox::warning(
this, opInfo, tr(
"%1: fail. %2" ).arg( opInfo, msgError ) );
328 mRelatedTable->setRowCount( 0 );
329 mOthersTable->setRowCount( 0 );
333 QStringList ids, names, descriptions;
335 const int sectionLimit = mLayer->listStylesInDatabase( ids, names, descriptions, errorMsg );
336 if ( !errorMsg.isNull() )
338 QMessageBox::warning(
this, tr(
"Error occurred while retrieving styles from database" ), errorMsg );
347void QgsMapLayerLoadStyleDialog::updateLoadButtonState()
353void QgsMapLayerLoadStyleDialog::showHelp()
355 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 able to display HTML encoded content.
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.
QVariant data(const QModelIndex &index, int role) const override
bool setData(const QModelIndex &index, const QVariant &value, int role) override
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.
QFlags< StyleCategory > StyleCategories
Stores settings for use within QGIS.
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)