Skip to content

Commit 97376b8

Browse files
3nidsnyalldawson
authored andcommitted
single dialog to load style (QML, SLD, DB)
1 parent 0cfa77d commit 97376b8

16 files changed

+557
-389
lines changed

python/core/auto_generated/qgsmaplayer.sip.in

+1-1
Original file line numberDiff line numberDiff line change
@@ -793,7 +793,7 @@ record in the users style table in their personal qgis.db)
793793
.. seealso:: :py:func:`also`
794794
%End
795795

796-
virtual QString loadNamedStyle( const QString &uri, bool &resultFlag /Out/ );
796+
virtual QString loadNamedStyle( const QString &uri, bool &resultFlag /Out/, StyleCategories categories = QgsMapLayer::AllStyleCategories );
797797
%Docstring
798798
Retrieve a named style for this layer if one
799799
exists (either as a .qml file on disk or as a

python/core/auto_generated/qgsvectorlayer.sip.in

+5-3
Original file line numberDiff line numberDiff line change
@@ -820,17 +820,19 @@ Delete a style from the database
820820
.. versionadded:: 3.0
821821
%End
822822

823-
virtual QString loadNamedStyle( const QString &theURI, bool &resultFlag /Out/, bool loadFromLocalDb );
823+
virtual QString loadNamedStyle( const QString &theURI, bool &resultFlag /Out/, bool loadFromLocalDb,
824+
StyleCategories categories = QgsMapLayer::AllStyleCategories );
824825
%Docstring
825826
Load a named style from file/local db/datasource db
826827

827828
:param theURI: the URI of the style or the URI of the layer
828829
:param resultFlag: will be set to true if a named style is correctly loaded
829830
:param loadFromLocalDb: if true forces to load from local db instead of datasource one
831+
:param categories: the style categories to be loaded.
830832
%End
831833

832-
virtual QString loadNamedStyle( const QString &theURI, bool &resultFlag /Out/ );
833-
834+
virtual QString loadNamedStyle( const QString &theURI, bool &resultFlag SIP_OUT,
835+
QgsMapLayer::StyleCategories categories = QgsMapLayer::AllStyleCategories );
834836
%Docstring
835837
Calls loadNamedStyle( theURI, resultFlag, false );
836838
Retained for backward compatibility

src/app/CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ SET(QGIS_APP_SRCS
5959
qgslayertreeviewfilterindicator.cpp
6060
qgslayertreeviewmemoryindicator.cpp
6161
qgslayertreeviewnonremovableindicator.cpp
62-
qgsloadstylefromdbdialog.cpp
6362
qgsmapcanvasdockwidget.cpp
6463
qgsmaplayerstyleguiutils.cpp
6564
qgsmapsavedialog.cpp
@@ -71,6 +70,7 @@ SET(QGIS_APP_SRCS
7170
qgsstatusbarcoordinateswidget.cpp
7271
qgsstatusbarmagnifierwidget.cpp
7372
qgsstatusbarscalewidget.cpp
73+
qgsvectorlayerloadstyledialog.cpp
7474
qgsversioninfo.cpp
7575
qgswelcomepageitemsmodel.cpp
7676
qgswelcomepage.cpp
@@ -283,7 +283,6 @@ SET (QGIS_APP_MOC_HDRS
283283
qgslayertreeviewmemoryindicator.h
284284
qgslayertreeviewfilterindicator.h
285285
qgslayertreeviewnonremovableindicator.h
286-
qgsloadstylefromdbdialog.h
287286
qgsmapcanvasdockwidget.h
288287
qgsmaplayerstyleguiutils.h
289288
qgsmapsavedialog.h
@@ -294,6 +293,7 @@ SET (QGIS_APP_MOC_HDRS
294293
qgsstatusbarcoordinateswidget.h
295294
qgsstatusbarmagnifierwidget.h
296295
qgsstatusbarscalewidget.h
296+
qgsvectorlayerloadstyledialog.h
297297
qgsversioninfo.h
298298
qgswelcomepageitemsmodel.h
299299
qgswelcomepage.h

src/app/qgsloadstylefromdbdialog.cpp renamed to src/app/qgsvectorlayerloadstyledialog.cpp

+126-33
Original file line numberDiff line numberDiff line change
@@ -13,56 +13,135 @@
1313
* *
1414
***************************************************************************/
1515

16-
#include "qgsloadstylefromdbdialog.h"
16+
#include <QMessageBox>
17+
#include <QVector>
18+
19+
#include "qgsvectorlayerloadstyledialog.h"
1720
#include "qgslogger.h"
1821
#include "qgisapp.h"
1922
#include "qgssettings.h"
23+
#include "qgsvectorlayerproperties.h"
24+
2025

21-
#include <QMessageBox>
22-
#include <QVector>
2326

24-
QgsLoadStyleFromDBDialog::QgsLoadStyleFromDBDialog( QWidget *parent )
27+
QgsVectorLayerLoadStyleDialog::QgsVectorLayerLoadStyleDialog( QgsVectorLayer *layer, QWidget *parent )
2528
: QDialog( parent )
29+
, mLayer( layer )
2630
{
2731
setupUi( this );
2832
setWindowTitle( QStringLiteral( "Database styles manager" ) );
2933

34+
QgsSettings settings;
35+
36+
QString providerName = mLayer->providerType();
37+
if ( providerName == QLatin1String( "ogr" ) )
38+
{
39+
providerName = mLayer->dataProvider()->storageType();
40+
if ( providerName == QLatin1String( "GPKG" ) )
41+
providerName = QStringLiteral( "GeoPackage" );
42+
}
43+
44+
QString myLastUsedDir = settings.value( QStringLiteral( "style/lastStyleDir" ), QDir::homePath() ).toString();
45+
46+
// load style type combobox
47+
connect( mStyleTypeComboBox, qgis::overload<int>::of( &QComboBox::currentIndexChanged ), this, [ = ]( int )
48+
{
49+
QgsVectorLayerProperties::StyleType type = currentStyleType();
50+
mFromFileWidget->setVisible( type != QgsVectorLayerProperties::DB );
51+
mFromDbWidget->setVisible( type == QgsVectorLayerProperties::DB );
52+
mDeleteButton->setVisible( type == QgsVectorLayerProperties::DB && mLayer->dataProvider()->isDeleteStyleFromDatabaseSupported() );
53+
mStyleCategoriesListWidget->setEnabled( currentStyleType() != QgsVectorLayerProperties::SLD );
54+
updateLoadButtonState();
55+
} );
56+
mStyleTypeComboBox->addItem( tr( "from file" ), QgsVectorLayerProperties::QML ); // QML is used as entry, but works for SLD too, see currentStyleType()
57+
if ( mLayer->dataProvider()->isSaveAndLoadStyleToDatabaseSupported() )
58+
mStyleTypeComboBox->addItem( tr( "from database (%1)" ).arg( providerName ), QgsVectorLayerProperties::DB );
59+
60+
// fill style categories
61+
QgsMapLayer::StyleCategories lastStyleCategories = settings.flagValue( QStringLiteral( "style/lastStyleCategories" ), QgsMapLayer::AllStyleCategories );
62+
for ( QgsMapLayer::StyleCategory category : qgsEnumMap<QgsMapLayer::StyleCategory>().keys() )
63+
{
64+
if ( category == QgsMapLayer::AllStyleCategories )
65+
continue;
66+
67+
QgsMapLayer::ReadableStyleCategory readableCategory = QgsMapLayer::readableStyleCategory( category );
68+
69+
QListWidgetItem *item = new QListWidgetItem( readableCategory.icon(), readableCategory.name(), mStyleCategoriesListWidget );
70+
item->setFlags( ( item->flags() | Qt::ItemIsUserCheckable ) & ~Qt::ItemIsSelectable );
71+
item->setCheckState( lastStyleCategories.testFlag( category ) ? Qt::Checked : Qt::Unchecked );
72+
item->setData( Qt::UserRole, category );
73+
}
74+
75+
// load from file setup
76+
mFileWidget->setFilter( tr( "QGIS Layer Style File, SLD File" ) + QStringLiteral( " (*.qml *.sld)" ) );
77+
mFileWidget->setStorageMode( QgsFileWidget::GetFile );
78+
mFileWidget->setDefaultRoot( myLastUsedDir );
79+
connect( mFileWidget, &QgsFileWidget::fileChanged, this, [ = ]( const QString & )
80+
{
81+
mStyleCategoriesListWidget->setEnabled( currentStyleType() != QgsVectorLayerProperties::SLD );
82+
updateLoadButtonState();
83+
} );
84+
85+
// load from DB
3086
mLoadButton->setDisabled( true );
3187
mDeleteButton->setDisabled( true );
3288
mRelatedTable->setEditTriggers( QTableWidget::NoEditTriggers );
3389
mRelatedTable->horizontalHeader()->setStretchLastSection( true );
3490
mRelatedTable->setSelectionBehavior( QTableWidget::SelectRows );
3591
mRelatedTable->verticalHeader()->setVisible( false );
36-
3792
mOthersTable->setEditTriggers( QTableWidget::NoEditTriggers );
3893
mOthersTable->horizontalHeader()->setStretchLastSection( true );
3994
mOthersTable->setSelectionBehavior( QTableWidget::SelectRows );
4095
mOthersTable->verticalHeader()->setVisible( false );
41-
42-
connect( mRelatedTable->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsLoadStyleFromDBDialog::onRelatedTableSelectionChanged );
43-
connect( mOthersTable->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsLoadStyleFromDBDialog::onOthersTableSelectionChanged );
96+
connect( mRelatedTable->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsVectorLayerLoadStyleDialog::onRelatedTableSelectionChanged );
97+
connect( mOthersTable->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsVectorLayerLoadStyleDialog::onOthersTableSelectionChanged );
4498
connect( mRelatedTable, &QTableWidget::doubleClicked, this, &QDialog::accept );
4599
connect( mOthersTable, &QTableWidget::doubleClicked, this, &QDialog::accept );
46100
connect( mCancelButton, &QPushButton::clicked, this, &QDialog::reject );
47101
connect( mLoadButton, &QPushButton::clicked, this, &QDialog::accept );
48-
connect( mDeleteButton, &QPushButton::clicked, this, &QgsLoadStyleFromDBDialog::deleteStyleFromDB );
49-
102+
connect( mDeleteButton, &QPushButton::clicked, this, &QgsVectorLayerLoadStyleDialog::deleteStyleFromDB );
50103
setTabOrder( mRelatedTable, mOthersTable );
51-
setTabOrder( mOthersTable, mCancelButton );
52-
setTabOrder( mCancelButton, mDeleteButton );
53-
setTabOrder( mDeleteButton, mLoadButton );
54104

55-
QgsSettings settings;
56-
restoreGeometry( settings.value( QStringLiteral( "Windows/loadStyleFromDb/geometry" ) ).toByteArray() );
105+
restoreGeometry( settings.value( QStringLiteral( "Windows/vectorLayerLoadStyle/geometry" ) ).toByteArray() );
106+
mStyleCategoriesListWidget->adjustSize();
57107
}
58108

59-
QgsLoadStyleFromDBDialog::~QgsLoadStyleFromDBDialog()
109+
QgsVectorLayerLoadStyleDialog::~QgsVectorLayerLoadStyleDialog()
60110
{
61111
QgsSettings settings;
62-
settings.setValue( QStringLiteral( "Windows/loadStyleFromDb/geometry" ), saveGeometry() );
112+
settings.setValue( QStringLiteral( "Windows/vectorLayerLoadStyle/geometry" ), saveGeometry() );
63113
}
64114

65-
void QgsLoadStyleFromDBDialog::initializeLists( const QStringList &ids, const QStringList &names, const QStringList &descriptions, int sectionLimit )
115+
QgsMapLayer::StyleCategories QgsVectorLayerLoadStyleDialog::styleCategories() const
116+
{
117+
QgsMapLayer::StyleCategories categories;
118+
for ( int row = 0; row < mStyleCategoriesListWidget->count(); ++row )
119+
{
120+
QListWidgetItem *item = mStyleCategoriesListWidget->item( row );
121+
if ( item->checkState() == Qt::Checked )
122+
categories |= item->data( Qt::UserRole ).value<QgsMapLayer::StyleCategory>();
123+
}
124+
return categories;
125+
}
126+
127+
QgsVectorLayerProperties::StyleType QgsVectorLayerLoadStyleDialog::currentStyleType() const
128+
{
129+
QgsVectorLayerProperties::StyleType type = mStyleTypeComboBox->currentData().value<QgsVectorLayerProperties::StyleType>();
130+
if ( type == QgsVectorLayerProperties::QML )
131+
{
132+
QFileInfo fi( mFileWidget->filePath() );
133+
if ( fi.exists() && fi.suffix().compare( QStringLiteral( "sld" ), Qt::CaseInsensitive ) == 0 )
134+
type = QgsVectorLayerProperties::SLD;
135+
}
136+
return type;
137+
}
138+
139+
QString QgsVectorLayerLoadStyleDialog::filePath() const
140+
{
141+
return mFileWidget->filePath();
142+
}
143+
144+
void QgsVectorLayerLoadStyleDialog::initializeLists( const QStringList &ids, const QStringList &names, const QStringList &descriptions, int sectionLimit )
66145
{
67146
mSectionLimit = sectionLimit;
68147
int relatedTableNOfCols = sectionLimit > 0 ? 2 : 1;
@@ -98,48 +177,42 @@ void QgsLoadStyleFromDBDialog::initializeLists( const QStringList &ids, const QS
98177
}
99178
}
100179

101-
QString QgsLoadStyleFromDBDialog::getSelectedStyleId()
180+
QString QgsVectorLayerLoadStyleDialog::selectedStyleId()
102181
{
103182
return mSelectedStyleId;
104183
}
105184

106-
void QgsLoadStyleFromDBDialog::setLayer( QgsVectorLayer *l )
107-
{
108-
mLayer = l;
109-
mDeleteButton->setVisible( mLayer->dataProvider()->isDeleteStyleFromDatabaseSupported() );
110-
}
111-
112-
void QgsLoadStyleFromDBDialog::onRelatedTableSelectionChanged()
185+
void QgsVectorLayerLoadStyleDialog::onRelatedTableSelectionChanged()
113186
{
114187
selectionChanged( mRelatedTable );
115188
if ( mRelatedTable->selectionModel()->hasSelection() )
116189
{
117190
if ( mOthersTable->selectionModel()->hasSelection() )
118191
{
119-
disconnect( mOthersTable->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsLoadStyleFromDBDialog::onOthersTableSelectionChanged );
192+
disconnect( mOthersTable->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsVectorLayerLoadStyleDialog::onOthersTableSelectionChanged );
120193
QTableWidgetSelectionRange range( 0, 0, mOthersTable->rowCount() - 1, mOthersTable->columnCount() - 1 );
121194
mOthersTable->setRangeSelected( range, false );
122-
connect( mOthersTable->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsLoadStyleFromDBDialog::onOthersTableSelectionChanged );
195+
connect( mOthersTable->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsVectorLayerLoadStyleDialog::onOthersTableSelectionChanged );
123196
}
124197
}
125198
}
126199

127-
void QgsLoadStyleFromDBDialog::onOthersTableSelectionChanged()
200+
void QgsVectorLayerLoadStyleDialog::onOthersTableSelectionChanged()
128201
{
129202
selectionChanged( mOthersTable );
130203
if ( mOthersTable->selectionModel()->hasSelection() )
131204
{
132205
if ( mRelatedTable->selectionModel()->hasSelection() )
133206
{
134-
disconnect( mRelatedTable->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsLoadStyleFromDBDialog::onRelatedTableSelectionChanged );
207+
disconnect( mRelatedTable->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsVectorLayerLoadStyleDialog::onRelatedTableSelectionChanged );
135208
QTableWidgetSelectionRange range( 0, 0, mRelatedTable->rowCount() - 1, mRelatedTable->columnCount() - 1 );
136209
mRelatedTable->setRangeSelected( range, false );
137-
connect( mRelatedTable->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsLoadStyleFromDBDialog::onRelatedTableSelectionChanged );
210+
connect( mRelatedTable->selectionModel(), &QItemSelectionModel::selectionChanged, this, &QgsVectorLayerLoadStyleDialog::onRelatedTableSelectionChanged );
138211
}
139212
}
140213
}
141214

142-
void QgsLoadStyleFromDBDialog::selectionChanged( QTableWidget *styleTable )
215+
void QgsVectorLayerLoadStyleDialog::selectionChanged( QTableWidget *styleTable )
143216
{
144217
QTableWidgetItem *item = nullptr;
145218
QList<QTableWidgetItem *> selected = styleTable->selectedItems();
@@ -159,9 +232,17 @@ void QgsLoadStyleFromDBDialog::selectionChanged( QTableWidget *styleTable )
159232
mLoadButton->setEnabled( false );
160233
mDeleteButton->setEnabled( false );
161234
}
235+
236+
updateLoadButtonState();
237+
}
238+
239+
void QgsVectorLayerLoadStyleDialog::accept()
240+
{
241+
QgsSettings().setFlagValue( QStringLiteral( "style/lastStyleCategories" ), styleCategories() );
242+
QDialog::accept();
162243
}
163244

164-
void QgsLoadStyleFromDBDialog::deleteStyleFromDB()
245+
void QgsVectorLayerLoadStyleDialog::deleteStyleFromDB()
165246
{
166247
QString msgError;
167248
QString opInfo = QObject::tr( "Delete style %1 from %2" ).arg( mSelectedStyleName, mLayer->providerType() );
@@ -200,3 +281,15 @@ void QgsLoadStyleFromDBDialog::deleteStyleFromDB()
200281
}
201282
}
202283
}
284+
285+
void QgsVectorLayerLoadStyleDialog::updateLoadButtonState()
286+
{
287+
QgsVectorLayerProperties::StyleType type = currentStyleType();
288+
mLoadButton->setEnabled( ( type == QgsVectorLayerProperties::DB
289+
&& ( mRelatedTable->selectionModel()->hasSelection() || mOthersTable->selectionModel()->hasSelection()
290+
) ) ||
291+
( type != QgsVectorLayerProperties::DB && !mFileWidget->filePath().isEmpty() ) );
292+
293+
294+
295+
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/***************************************************************************
2-
qgsloadstylefromdbdialog.h
2+
qgsvectorlayerloadstyle.h
33
---------------------
44
begin : April 2013
55
copyright : (C) 2013 by Emilio Loi
@@ -16,35 +16,44 @@
1616
#ifndef QGSLOADFILEFROMDBDIALOG_H
1717
#define QGSLOADFILEFROMDBDIALOG_H
1818

19-
#include "ui_qgsloadstylefromdbdialog.h"
19+
#include "ui_qgsvectorlayerloadstyledialog.h"
2020
#include "qgsguiutils.h"
2121
#include "qgis_app.h"
22-
#include "qgsvectordataprovider.h"
22+
#include "qgsvectorlayerproperties.h"
23+
#include "qgsmaplayer.h"
2324

24-
class APP_EXPORT QgsLoadStyleFromDBDialog : public QDialog, private Ui::QgsLoadStyleFromDBDialogLayout
25+
class APP_EXPORT QgsVectorLayerLoadStyleDialog : public QDialog, private Ui::QgsVectorLayerLoadStyleDialog
2526
{
26-
QString mSelectedStyleId;
27-
QString mSelectedStyleName;
28-
int mSectionLimit = 0;
2927
Q_OBJECT
3028
public:
31-
explicit QgsLoadStyleFromDBDialog( QWidget *parent = nullptr );
29+
explicit QgsVectorLayerLoadStyleDialog( QgsVectorLayer *layer, QWidget *parent = nullptr );
30+
31+
~QgsVectorLayerLoadStyleDialog() override;
32+
33+
QgsMapLayer::StyleCategories styleCategories() const;
34+
35+
QgsVectorLayerProperties::StyleType currentStyleType() const;
3236

33-
~QgsLoadStyleFromDBDialog() override;
37+
QString filePath() const;
3438

3539
void initializeLists( const QStringList &ids, const QStringList &names, const QStringList &descriptions, int sectionLimit );
36-
QString getSelectedStyleId();
40+
QString selectedStyleId();
3741
void selectionChanged( QTableWidget *styleTable );
38-
void setLayer( QgsVectorLayer *l );
3942

4043
public slots:
44+
void accept() override;
45+
46+
private slots:
47+
void updateLoadButtonState();
4148
void onRelatedTableSelectionChanged();
4249
void onOthersTableSelectionChanged();
4350
void deleteStyleFromDB();
4451

4552
private:
46-
QgsVectorLayer *mLayer = nullptr;
47-
53+
QgsVectorLayer *mLayer;
54+
QString mSelectedStyleId;
55+
QString mSelectedStyleName;
56+
int mSectionLimit = 0;
4857
};
4958

5059
#endif //QGSLOADFILEFROMDBDIALOG_H

0 commit comments

Comments
 (0)