Skip to content

Commit df94b50

Browse files
authored
Merge pull request #5180 from nirvn/fix_levels
2 parents 5796783 + fe8b751 commit df94b50

6 files changed

+178
-97
lines changed

python/gui/symbology/qgssymbollevelsdialog.sip

+45-7
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,71 @@
88

99

1010

11-
class QgsSymbolLevelsDialog : QDialog
11+
12+
class QgsSymbolLevelsWidget : QgsPanelWidget
1213
{
14+
%Docstring
15+
A widget which allows the user to modify the rendering order of symbol layers.
16+
.. seealso:: QgsSymbolLevelsDialog
17+
.. versionadded:: 3.0
18+
%End
1319

1420
%TypeHeaderCode
1521
#include "qgssymbollevelsdialog.h"
1622
%End
1723
public:
18-
19-
~QgsSymbolLevelsDialog();
24+
QgsSymbolLevelsWidget( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent /TransferThis/ = 0 );
25+
%Docstring
26+
Constructor for QgsSymbolLevelsWidget
27+
%End
2028

2129
bool usingLevels() const;
2230
%Docstring
31+
Returns whether the level ordering is enabled
2332
:rtype: bool
2433
%End
2534

2635
void setForceOrderingEnabled( bool enabled );
36+
%Docstring
37+
Sets whether the level ordering is always forced on and hide the checkbox (used by rule-based renderer)
38+
\param enabled toggle level ordering
39+
%End
2740

2841
public slots:
29-
void updateUi();
30-
31-
void renderingPassChanged( int row, int column );
42+
void apply();
43+
%Docstring
44+
Apply button
45+
%End
3246

3347
protected:
3448

3549

50+
51+
3652
private:
37-
QgsSymbolLevelsDialog();
53+
QgsSymbolLevelsWidget();
54+
55+
};
56+
57+
class QgsSymbolLevelsDialog : QDialog
58+
{
59+
%Docstring
60+
A dialog which allows the user to modify the rendering order of symbol layers.
61+
.. seealso:: QgsSymbolLevelsWidget
62+
%End
63+
64+
%TypeHeaderCode
65+
#include "qgssymbollevelsdialog.h"
66+
%End
67+
public:
68+
69+
QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent /TransferThis/ = 0 );
70+
%Docstring
71+
Constructor for QgsSymbolLevelsDialog.
72+
%End
73+
74+
void setForceOrderingEnabled( bool enabled );
75+
3876
};
3977

4078

src/gui/symbology/qgsrendererwidget.cpp

+11-2
Original file line numberDiff line numberDiff line change
@@ -251,11 +251,20 @@ void QgsRendererWidget::changeSymbolAngle()
251251

252252
void QgsRendererWidget::showSymbolLevelsDialog( QgsFeatureRenderer *r )
253253
{
254-
QgsSymbolLevelsDialog dlg( r->legendSymbolItems(), r->usingSymbolLevels(), this );
254+
QgsPanelWidget *panel = QgsPanelWidget::findParentPanel( this );
255+
if ( panel && panel->dockMode() )
256+
{
257+
QgsSymbolLevelsWidget *widget = new QgsSymbolLevelsWidget( r, r->usingSymbolLevels(), panel );
258+
widget->setPanelTitle( tr( "Symbol Levels" ) );
259+
connect( widget, &QgsPanelWidget::widgetChanged, widget, &QgsSymbolLevelsWidget::apply );
260+
connect( widget, &QgsPanelWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
261+
panel->openPanel( widget );
262+
return;
263+
}
255264

265+
QgsSymbolLevelsDialog dlg( r, r->usingSymbolLevels(), panel );
256266
if ( dlg.exec() )
257267
{
258-
r->setUsingSymbolLevels( dlg.usingLevels() );
259268
emit widgetChanged();
260269
}
261270
}

src/gui/symbology/qgsrulebasedrendererwidget.cpp

+17-3
Original file line numberDiff line numberDiff line change
@@ -396,10 +396,24 @@ void QgsRuleBasedRendererWidget::keyPressEvent( QKeyEvent *event )
396396

397397
void QgsRuleBasedRendererWidget::setRenderingOrder()
398398
{
399-
QgsSymbolLevelsDialog dlg( mRenderer->legendSymbolItems(), true, this );
400-
dlg.setForceOrderingEnabled( true );
399+
QgsPanelWidget *panel = QgsPanelWidget::findParentPanel( this );
400+
if ( panel && panel->dockMode() )
401+
{
402+
QgsSymbolLevelsWidget *widget = new QgsSymbolLevelsWidget( mRenderer, true, panel );
403+
widget->setForceOrderingEnabled( true );
404+
widget->setPanelTitle( tr( "Symbol Levels" ) );
405+
connect( widget, &QgsPanelWidget::widgetChanged, widget, &QgsSymbolLevelsWidget::apply );
406+
connect( widget, &QgsPanelWidget::widgetChanged, this, &QgsPanelWidget::widgetChanged );
407+
panel->openPanel( widget );
408+
return;
409+
}
401410

402-
dlg.exec();
411+
QgsSymbolLevelsDialog dlg( mRenderer, true, panel );
412+
dlg.setForceOrderingEnabled( true );
413+
if ( dlg.exec() )
414+
{
415+
emit widgetChanged();
416+
}
403417
}
404418

405419
void QgsRuleBasedRendererWidget::saveSectionWidth( int section, int oldSize, int newSize )

src/gui/symbology/qgssymbollevelsdialog.cpp

+51-27
Original file line numberDiff line numberDiff line change
@@ -23,32 +23,32 @@
2323
#include <QTableWidgetItem>
2424
#include <QItemDelegate>
2525
#include <QSpinBox>
26-
26+
#include <QDialogButtonBox>
2727

2828

2929
////////////////
3030

31-
QgsSymbolLevelsDialog::QgsSymbolLevelsDialog( const QgsLegendSymbolList &list, bool usingSymbolLevels, QWidget *parent )
32-
: QDialog( parent )
31+
QgsSymbolLevelsWidget::QgsSymbolLevelsWidget( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent )
32+
: QgsPanelWidget( parent )
33+
, mRenderer( renderer )
3334
, mForceOrderingEnabled( false )
3435
{
3536
setupUi( this );
3637

37-
QgsSettings settings;
38-
restoreGeometry( settings.value( QStringLiteral( "Windows/symbolLevelsDlg/geometry" ) ).toByteArray() );
39-
4038
tableLevels->setItemDelegate( new SpinBoxDelegate( this ) );
4139

4240
chkEnable->setChecked( usingSymbolLevels );
4341

44-
connect( chkEnable, &QAbstractButton::clicked, this, &QgsSymbolLevelsDialog::updateUi );
45-
connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsSymbolLevelsDialog::showHelp );
42+
connect( chkEnable, &QAbstractButton::clicked, this, &QgsSymbolLevelsWidget::updateUi );
4643

47-
// only consider entries with symbols
48-
Q_FOREACH ( const QgsLegendSymbolItem &item, list )
44+
if ( mRenderer )
4945
{
50-
if ( item.symbol() )
51-
mList << item;
46+
// only consider entries with symbols
47+
Q_FOREACH ( const QgsLegendSymbolItem &item, mRenderer->legendSymbolItems() )
48+
{
49+
if ( item.symbol() )
50+
mList << item;
51+
}
5252
}
5353

5454
int maxLayers = 0;
@@ -84,16 +84,10 @@ QgsSymbolLevelsDialog::QgsSymbolLevelsDialog( const QgsLegendSymbolList &list, b
8484

8585
populateTable();
8686

87-
connect( tableLevels, &QTableWidget::cellChanged, this, &QgsSymbolLevelsDialog::renderingPassChanged );
87+
connect( tableLevels, &QTableWidget::cellChanged, this, &QgsSymbolLevelsWidget::renderingPassChanged );
8888
}
8989

90-
QgsSymbolLevelsDialog::~QgsSymbolLevelsDialog()
91-
{
92-
QgsSettings settings;
93-
settings.setValue( QStringLiteral( "Windows/symbolLevelsDlg/geometry" ), saveGeometry() );
94-
}
95-
96-
void QgsSymbolLevelsDialog::populateTable()
90+
void QgsSymbolLevelsWidget::populateTable()
9791
{
9892
for ( int row = 0; row < mList.count(); row++ )
9993
{
@@ -123,12 +117,27 @@ void QgsSymbolLevelsDialog::populateTable()
123117

124118
}
125119

126-
void QgsSymbolLevelsDialog::updateUi()
120+
void QgsSymbolLevelsWidget::updateUi()
127121
{
128122
tableLevels->setEnabled( chkEnable->isChecked() );
123+
emit widgetChanged();
129124
}
130125

131-
void QgsSymbolLevelsDialog::setDefaultLevels()
126+
void QgsSymbolLevelsWidget::apply()
127+
{
128+
for ( int i = 0; i < mList.count(); i++ )
129+
{
130+
QgsSymbol *sym = mList.at( i ).symbol();
131+
for ( int layer = 0; layer < sym->symbolLayerCount(); layer++ )
132+
{
133+
mRenderer->setLegendSymbolItem( mList.at( i ).ruleKey(), sym->clone() );
134+
}
135+
}
136+
137+
mRenderer->setUsingSymbolLevels( usingLevels() );
138+
}
139+
140+
void QgsSymbolLevelsWidget::setDefaultLevels()
132141
{
133142
for ( int i = 0; i < mList.count(); i++ )
134143
{
@@ -140,22 +149,24 @@ void QgsSymbolLevelsDialog::setDefaultLevels()
140149
}
141150
}
142151

143-
bool QgsSymbolLevelsDialog::usingLevels() const
152+
bool QgsSymbolLevelsWidget::usingLevels() const
144153
{
145154
return chkEnable->isChecked();
146155
}
147156

148-
void QgsSymbolLevelsDialog::renderingPassChanged( int row, int column )
157+
void QgsSymbolLevelsWidget::renderingPassChanged( int row, int column )
149158
{
150159
if ( row < 0 || row >= mList.count() )
151160
return;
152161
QgsSymbol *sym = mList.at( row ).symbol();
153162
if ( column < 0 || column > sym->symbolLayerCount() )
154163
return;
155164
sym->symbolLayer( column - 1 )->setRenderingPass( tableLevels->item( row, column )->text().toInt() );
165+
166+
emit widgetChanged();
156167
}
157168

158-
void QgsSymbolLevelsDialog::setForceOrderingEnabled( bool enabled )
169+
void QgsSymbolLevelsWidget::setForceOrderingEnabled( bool enabled )
159170
{
160171
mForceOrderingEnabled = enabled;
161172
if ( enabled )
@@ -167,11 +178,24 @@ void QgsSymbolLevelsDialog::setForceOrderingEnabled( bool enabled )
167178
chkEnable->show();
168179
}
169180

170-
void QgsSymbolLevelsDialog::showHelp()
181+
QgsSymbolLevelsDialog::QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent )
182+
: QDialog( parent )
171183
{
172-
QgsHelp::openHelp( QStringLiteral( "working_with_vector/vector_properties.html#symbols-levels" ) );
184+
QVBoxLayout *vLayout = new QVBoxLayout();
185+
mWidget = new QgsSymbolLevelsWidget( renderer, usingSymbolLevels );
186+
vLayout->addWidget( mWidget );
187+
QDialogButtonBox *bbox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal );
188+
connect( bbox, &QDialogButtonBox::accepted, mWidget, &QgsSymbolLevelsWidget::apply );
189+
connect( bbox, &QDialogButtonBox::accepted, this, &QgsSymbolLevelsDialog::accept );
190+
connect( bbox, &QDialogButtonBox::rejected, this, &QgsSymbolLevelsDialog::reject );
191+
vLayout->addWidget( bbox );
192+
setLayout( vLayout );
173193
}
174194

195+
void QgsSymbolLevelsDialog::setForceOrderingEnabled( bool enabled )
196+
{
197+
mWidget->setForceOrderingEnabled( enabled );
198+
}
175199

176200
/// @cond PRIVATE
177201

src/gui/symbology/qgssymbollevelsdialog.h

+46-13
Original file line numberDiff line numberDiff line change
@@ -20,36 +20,43 @@
2020
#include <QList>
2121
#include <QItemDelegate>
2222

23-
#include "qgsrenderer.h"
2423
#include "qgshelp.h"
24+
#include "qgspanelwidget.h"
25+
#include "qgsrenderer.h"
26+
2527
#include "ui_qgssymbollevelsdialogbase.h"
2628
#include "qgis_gui.h"
2729

28-
/** \ingroup gui
29-
* \class QgsSymbolLevelsDialog
30+
/** \class QgsSymbolLevelsWidget
31+
* \ingroup gui
32+
* A widget which allows the user to modify the rendering order of symbol layers.
33+
* \see QgsSymbolLevelsDialog
34+
* \since QGIS 3.0
3035
*/
31-
class GUI_EXPORT QgsSymbolLevelsDialog : public QDialog, private Ui::QgsSymbolLevelsDialogBase
36+
class GUI_EXPORT QgsSymbolLevelsWidget : public QgsPanelWidget, private Ui::QgsSymbolLevelsDialogBase
3237
{
3338
Q_OBJECT
3439
public:
35-
//! \note not available in Python bindings
36-
QgsSymbolLevelsDialog( const QgsLegendSymbolList &list, bool usingSymbolLevels, QWidget *parent = nullptr ) SIP_SKIP;
37-
38-
~QgsSymbolLevelsDialog();
40+
//! Constructor for QgsSymbolLevelsWidget
41+
QgsSymbolLevelsWidget( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent SIP_TRANSFERTHIS = 0 );
3942

43+
//! Returns whether the level ordering is enabled
4044
bool usingLevels() const;
4145

42-
// used by rule-based renderer (to hide checkbox to enable/disable ordering)
46+
/** Sets whether the level ordering is always forced on and hide the checkbox (used by rule-based renderer)
47+
* \param enabled toggle level ordering
48+
*/
4349
void setForceOrderingEnabled( bool enabled );
4450

4551
public slots:
52+
//! Apply button
53+
void apply();
54+
55+
private slots:
4656
void updateUi();
4757

4858
void renderingPassChanged( int row, int column );
4959

50-
private slots:
51-
void showHelp();
52-
5360
protected:
5461
//! \note not available in Python bindings
5562
void populateTable() SIP_SKIP;
@@ -58,16 +65,42 @@ class GUI_EXPORT QgsSymbolLevelsDialog : public QDialog, private Ui::QgsSymbolLe
5865

5966
//! maximal number of layers from all symbols
6067
int mMaxLayers;
68+
69+
QgsFeatureRenderer *mRenderer;
6170
QgsLegendSymbolList mList;
71+
6272
//! whether symbol layers always should be used (default false)
6373
bool mForceOrderingEnabled;
6474

6575
private:
6676
#ifdef SIP_RUN
67-
QgsSymbolLevelsDialog();
77+
QgsSymbolLevelsWidget();
78+
6879
#endif
6980
};
7081

82+
/** \class QgsSymbolLevelsDialog
83+
* \ingroup gui
84+
* A dialog which allows the user to modify the rendering order of symbol layers.
85+
* \see QgsSymbolLevelsWidget
86+
*/
87+
class GUI_EXPORT QgsSymbolLevelsDialog : public QDialog
88+
{
89+
Q_OBJECT
90+
public:
91+
92+
//! Constructor for QgsSymbolLevelsDialog.
93+
QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent SIP_TRANSFERTHIS = 0 );
94+
95+
// used by rule-based renderer (to hide checkbox to enable/disable ordering)
96+
void setForceOrderingEnabled( bool enabled );
97+
98+
private:
99+
100+
QgsSymbolLevelsWidget *mWidget = nullptr;
101+
102+
};
103+
71104
#ifndef SIP_RUN
72105
///@cond PRIVATE
73106

0 commit comments

Comments
 (0)