Skip to content

Commit fe8b751

Browse files
committed
[FEATURE] Make symbol levels dialog a style dock panel widget
1 parent 5e7dadd commit fe8b751

6 files changed

+142
-96
lines changed

python/gui/symbology/qgssymbollevelsdialog.sip

+39-9
Original file line numberDiff line numberDiff line change
@@ -9,39 +9,69 @@
99

1010

1111

12-
class QgsSymbolLevelsDialog : QDialog
12+
class QgsSymbolLevelsWidget : QgsPanelWidget
1313
{
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
1419

1520
%TypeHeaderCode
1621
#include "qgssymbollevelsdialog.h"
1722
%End
1823
public:
19-
QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent = 0 );
24+
QgsSymbolLevelsWidget( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent /TransferThis/ = 0 );
2025
%Docstring
21-
Constructor for QgsSymbolLevelsDialog
26+
Constructor for QgsSymbolLevelsWidget
2227
%End
2328

24-
~QgsSymbolLevelsDialog();
25-
2629
bool usingLevels() const;
2730
%Docstring
31+
Returns whether the level ordering is enabled
2832
:rtype: bool
2933
%End
3034

3135
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
3240

3341
public slots:
34-
void updateUi();
35-
36-
void renderingPassChanged( int row, int column );
42+
void apply();
43+
%Docstring
44+
Apply button
45+
%End
3746

3847
protected:
3948

4049

4150

4251

4352
private:
44-
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 );
4575

4676
};
4777

src/gui/symbology/qgsrendererwidget.cpp

+12-1
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,18 @@ void QgsRendererWidget::changeSymbolAngle()
251251

252252
void QgsRendererWidget::showSymbolLevelsDialog( QgsFeatureRenderer *r )
253253
{
254-
QgsSymbolLevelsDialog dlg( r, 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+
}
264+
265+
QgsSymbolLevelsDialog dlg( r, r->usingSymbolLevels(), panel );
255266
if ( dlg.exec() )
256267
{
257268
emit widgetChanged();

src/gui/symbology/qgsrulebasedrendererwidget.cpp

+13-1
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,19 @@ void QgsRuleBasedRendererWidget::keyPressEvent( QKeyEvent *event )
396396

397397
void QgsRuleBasedRendererWidget::setRenderingOrder()
398398
{
399-
QgsSymbolLevelsDialog dlg( mRenderer, true, this );
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+
}
410+
411+
QgsSymbolLevelsDialog dlg( mRenderer, true, panel );
400412
dlg.setForceOrderingEnabled( true );
401413
if ( dlg.exec() )
402414
{

src/gui/symbology/qgssymbollevelsdialog.cpp

+30-25
Original file line numberDiff line numberDiff line change
@@ -23,28 +23,23 @@
2323
#include <QTableWidgetItem>
2424
#include <QItemDelegate>
2525
#include <QSpinBox>
26-
26+
#include <QDialogButtonBox>
2727

2828

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

31-
QgsSymbolLevelsDialog::QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent )
32-
: QDialog( parent )
31+
QgsSymbolLevelsWidget::QgsSymbolLevelsWidget( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent )
32+
: QgsPanelWidget( parent )
3333
, mRenderer( renderer )
3434
, mForceOrderingEnabled( false )
3535
{
3636
setupUi( this );
3737

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

4340
chkEnable->setChecked( usingSymbolLevels );
4441

45-
connect( chkEnable, &QAbstractButton::clicked, this, &QgsSymbolLevelsDialog::updateUi );
46-
connect( buttonBox, &QDialogButtonBox::accepted, this, &QgsSymbolLevelsDialog::apply );
47-
connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsSymbolLevelsDialog::showHelp );
42+
connect( chkEnable, &QAbstractButton::clicked, this, &QgsSymbolLevelsWidget::updateUi );
4843

4944
if ( mRenderer )
5045
{
@@ -89,16 +84,10 @@ QgsSymbolLevelsDialog::QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool
8984

9085
populateTable();
9186

92-
connect( tableLevels, &QTableWidget::cellChanged, this, &QgsSymbolLevelsDialog::renderingPassChanged );
93-
}
94-
95-
QgsSymbolLevelsDialog::~QgsSymbolLevelsDialog()
96-
{
97-
QgsSettings settings;
98-
settings.setValue( QStringLiteral( "Windows/symbolLevelsDlg/geometry" ), saveGeometry() );
87+
connect( tableLevels, &QTableWidget::cellChanged, this, &QgsSymbolLevelsWidget::renderingPassChanged );
9988
}
10089

101-
void QgsSymbolLevelsDialog::populateTable()
90+
void QgsSymbolLevelsWidget::populateTable()
10291
{
10392
for ( int row = 0; row < mList.count(); row++ )
10493
{
@@ -128,12 +117,13 @@ void QgsSymbolLevelsDialog::populateTable()
128117

129118
}
130119

131-
void QgsSymbolLevelsDialog::updateUi()
120+
void QgsSymbolLevelsWidget::updateUi()
132121
{
133122
tableLevels->setEnabled( chkEnable->isChecked() );
123+
emit widgetChanged();
134124
}
135125

136-
void QgsSymbolLevelsDialog::apply()
126+
void QgsSymbolLevelsWidget::apply()
137127
{
138128
for ( int i = 0; i < mList.count(); i++ )
139129
{
@@ -147,7 +137,7 @@ void QgsSymbolLevelsDialog::apply()
147137
mRenderer->setUsingSymbolLevels( usingLevels() );
148138
}
149139

150-
void QgsSymbolLevelsDialog::setDefaultLevels()
140+
void QgsSymbolLevelsWidget::setDefaultLevels()
151141
{
152142
for ( int i = 0; i < mList.count(); i++ )
153143
{
@@ -159,22 +149,24 @@ void QgsSymbolLevelsDialog::setDefaultLevels()
159149
}
160150
}
161151

162-
bool QgsSymbolLevelsDialog::usingLevels() const
152+
bool QgsSymbolLevelsWidget::usingLevels() const
163153
{
164154
return chkEnable->isChecked();
165155
}
166156

167-
void QgsSymbolLevelsDialog::renderingPassChanged( int row, int column )
157+
void QgsSymbolLevelsWidget::renderingPassChanged( int row, int column )
168158
{
169159
if ( row < 0 || row >= mList.count() )
170160
return;
171161
QgsSymbol *sym = mList.at( row ).symbol();
172162
if ( column < 0 || column > sym->symbolLayerCount() )
173163
return;
174164
sym->symbolLayer( column - 1 )->setRenderingPass( tableLevels->item( row, column )->text().toInt() );
165+
166+
emit widgetChanged();
175167
}
176168

177-
void QgsSymbolLevelsDialog::setForceOrderingEnabled( bool enabled )
169+
void QgsSymbolLevelsWidget::setForceOrderingEnabled( bool enabled )
178170
{
179171
mForceOrderingEnabled = enabled;
180172
if ( enabled )
@@ -186,11 +178,24 @@ void QgsSymbolLevelsDialog::setForceOrderingEnabled( bool enabled )
186178
chkEnable->show();
187179
}
188180

189-
void QgsSymbolLevelsDialog::showHelp()
181+
QgsSymbolLevelsDialog::QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent )
182+
: QDialog( parent )
190183
{
191-
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 );
192193
}
193194

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

195200
/// @cond PRIVATE
196201

src/gui/symbology/qgssymbollevelsdialog.h

+40-15
Original file line numberDiff line numberDiff line change
@@ -21,38 +21,41 @@
2121
#include <QItemDelegate>
2222

2323
#include "qgshelp.h"
24+
#include "qgspanelwidget.h"
2425
#include "qgsrenderer.h"
2526

2627
#include "ui_qgssymbollevelsdialogbase.h"
2728
#include "qgis_gui.h"
2829

29-
/** \ingroup gui
30-
* \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
3135
*/
32-
class GUI_EXPORT QgsSymbolLevelsDialog : public QDialog, private Ui::QgsSymbolLevelsDialogBase
36+
class GUI_EXPORT QgsSymbolLevelsWidget : public QgsPanelWidget, private Ui::QgsSymbolLevelsDialogBase
3337
{
3438
Q_OBJECT
3539
public:
36-
//! Constructor for QgsSymbolLevelsDialog
37-
QgsSymbolLevelsDialog( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent = nullptr );
38-
39-
~QgsSymbolLevelsDialog();
40+
//! Constructor for QgsSymbolLevelsWidget
41+
QgsSymbolLevelsWidget( QgsFeatureRenderer *renderer, bool usingSymbolLevels, QWidget *parent SIP_TRANSFERTHIS = 0 );
4042

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

43-
// 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+
*/
4449
void setForceOrderingEnabled( bool enabled );
4550

4651
public slots:
47-
void updateUi();
48-
49-
void renderingPassChanged( int row, int column );
50-
51-
private slots:
5252
//! Apply button
5353
void apply();
5454

55-
void showHelp();
55+
private slots:
56+
void updateUi();
57+
58+
void renderingPassChanged( int row, int column );
5659

5760
protected:
5861
//! \note not available in Python bindings
@@ -71,11 +74,33 @@ class GUI_EXPORT QgsSymbolLevelsDialog : public QDialog, private Ui::QgsSymbolLe
7174

7275
private:
7376
#ifdef SIP_RUN
74-
QgsSymbolLevelsDialog();
77+
QgsSymbolLevelsWidget();
7578

7679
#endif
7780
};
7881

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+
79104
#ifndef SIP_RUN
80105
///@cond PRIVATE
81106

0 commit comments

Comments
 (0)