Skip to content

Commit 284ad06

Browse files
committed
[simplify] user input widget instead of dialog
1 parent 3235fec commit 284ad06

File tree

3 files changed

+117
-121
lines changed

3 files changed

+117
-121
lines changed

src/app/qgsmaptoolsimplify.cpp

Lines changed: 64 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
* *
1414
***************************************************************************/
1515

16+
#include <QPushButton>
17+
1618
#include "qgsmaptoolsimplify.h"
1719

1820
#include "qgsfeatureiterator.h"
@@ -29,9 +31,8 @@
2931
#include <cmath>
3032
#include <cfloat>
3133

32-
QgsSimplifyDialog::QgsSimplifyDialog( QgsMapToolSimplify *tool, QWidget *parent )
33-
: QDialog( parent )
34-
, mTool( tool )
34+
QgsSimplifyUserInputWidget::QgsSimplifyUserInputWidget( QWidget *parent )
35+
: QWidget( parent )
3536
{
3637
setupUi( this );
3738

@@ -40,55 +41,62 @@ QgsSimplifyDialog::QgsSimplifyDialog( QgsMapToolSimplify *tool, QWidget *parent
4041
mMethodComboBox->addItem( tr( "Simplify by area (Visvalingam)" ), QgsMapToolSimplify::SimplifyVisvalingam );
4142
mMethodComboBox->addItem( tr( "Smooth" ), QgsMapToolSimplify::Smooth );
4243

43-
spinTolerance->setValue( mTool->tolerance() );
44-
spinTolerance->setShowClearButton( false );
45-
cboToleranceUnits->setCurrentIndex( ( int ) mTool->toleranceUnits() );
44+
mToleranceUnitsComboBox->addItem( tr( "Layer units" ), QgsTolerance::LayerUnits );
45+
mToleranceUnitsComboBox->addItem( tr( "Pixels" ), QgsTolerance::Pixels );
46+
mToleranceUnitsComboBox->addItem( tr( "Map units" ), QgsTolerance::ProjectUnits );
47+
48+
mSpinToleranceSpinBox->setShowClearButton( false );
4649

4750
mOffsetSpin->setClearValue( 25 );
48-
mOffsetSpin->setValue( mTool->smoothOffset() * 100 );
4951
mIterationsSpin->setClearValue( 1 );
50-
mIterationsSpin->setValue( mTool->smoothIterations() );
51-
52-
mMethodComboBox->setCurrentIndex( mMethodComboBox->findData( mTool->method() ) );
5352
if ( mMethodComboBox->currentData().toInt() != QgsMapToolSimplify::Smooth )
5453
mOptionsStackedWidget->setCurrentIndex( 0 );
5554
else
5655
mOptionsStackedWidget->setCurrentIndex( 1 );
5756

5857
// communication with map tool
59-
connect( spinTolerance, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), mTool, &QgsMapToolSimplify::setTolerance );
60-
connect( cboToleranceUnits, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), mTool, &QgsMapToolSimplify::setToleranceUnits );
61-
connect( mMethodComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), mTool, [ = ]
58+
connect( mSpinToleranceSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsSimplifyUserInputWidget::toleranceChanged );
59+
connect( mToleranceUnitsComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, [ = ]( const int index ) {emit toleranceUnitsChanged( ( QgsTolerance::UnitType )index );} );
60+
connect( mMethodComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, [ = ]( const int method ) {emit methodChanged( ( QgsMapToolSimplify::Method )method );} );
61+
connect( mMethodComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, [ = ]
6262
{
63-
mTool->setMethod( static_cast< QgsMapToolSimplify::Method >( mMethodComboBox->currentData().toInt() ) );
6463
if ( mMethodComboBox->currentData().toInt() != QgsMapToolSimplify::Smooth )
6564
mOptionsStackedWidget->setCurrentIndex( 0 );
6665
else
6766
mOptionsStackedWidget->setCurrentIndex( 1 );
6867
} );
6968

70-
connect( mOffsetSpin, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), mTool, [ = ]( int value ) { mTool->setSmoothOffset( value / 100.0 ); } );
71-
connect( mIterationsSpin, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), mTool, [ = ]( int value ) { mTool->setSmoothIterations( value ); } );
72-
connect( okButton, &QAbstractButton::clicked, mTool, &QgsMapToolSimplify::storeSimplified );
69+
connect( mOffsetSpin, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, [ = ]( const int offset ) {emit smoothOffsetChanged( offset / 100.0 );} );
70+
connect( mIterationsSpin, static_cast < void ( QSpinBox::* )( int ) > ( &QSpinBox::valueChanged ), this, &QgsSimplifyUserInputWidget::smoothIterationsChanged );
71+
72+
connect( mButtonBox, &QDialogButtonBox::accepted, this, &QgsSimplifyUserInputWidget::accepted );
73+
connect( mButtonBox, &QDialogButtonBox::rejected, this, &QgsSimplifyUserInputWidget::rejected );
7374
}
7475

75-
void QgsSimplifyDialog::updateStatusText()
76+
void QgsSimplifyUserInputWidget::setConfig( const QgsMapToolSimplify::Method &method,
77+
const double &tolerance,
78+
const QgsTolerance::UnitType &units,
79+
const double &smoothOffset,
80+
const int &smoothIterations )
7681
{
77-
labelStatus->setText( mTool->statusText() );
82+
mMethodComboBox->setCurrentIndex( mMethodComboBox->findData( method ) );
83+
84+
mSpinToleranceSpinBox->setValue( tolerance );
85+
mToleranceUnitsComboBox->setCurrentIndex( mToleranceUnitsComboBox->findData( units ) );
86+
mOffsetSpin->setValue( 100 * smoothOffset );
87+
mIterationsSpin->setValue( smoothIterations );
7888
}
7989

80-
void QgsSimplifyDialog::enableOkButton( bool enabled )
90+
void QgsSimplifyUserInputWidget::updateStatusText( const QString &text )
8191
{
82-
okButton->setEnabled( enabled );
92+
labelStatus->setText( text );
8393
}
8494

85-
void QgsSimplifyDialog::closeEvent( QCloseEvent *e )
95+
void QgsSimplifyUserInputWidget::enableOkButton( bool enabled )
8696
{
87-
QDialog::closeEvent( e );
88-
mTool->clearSelection();
97+
mButtonBox->button( QDialogButtonBox::Ok )->setEnabled( enabled );
8998
}
9099

91-
92100
////////////////////////////////////////////////////////////////////////////
93101

94102

@@ -101,14 +109,11 @@ QgsMapToolSimplify::QgsMapToolSimplify( QgsMapCanvas *canvas )
101109
mMethod = static_cast< QgsMapToolSimplify::Method >( settings.value( QStringLiteral( "digitizing/simplify_method" ), 0 ).toInt() );
102110
mSmoothIterations = settings.value( QStringLiteral( "digitizing/smooth_iterations" ), 1 ).toInt();
103111
mSmoothOffset = settings.value( QStringLiteral( "digitizing/smooth_offset" ), 0.25 ).toDouble();
104-
105-
mSimplifyDialog = new QgsSimplifyDialog( this, canvas->topLevelWidget() );
106112
}
107113

108114
QgsMapToolSimplify::~QgsMapToolSimplify()
109115
{
110116
clearSelection();
111-
delete mSimplifyDialog;
112117
}
113118

114119

@@ -123,10 +128,8 @@ void QgsMapToolSimplify::setTolerance( double tolerance )
123128
updateSimplificationPreview();
124129
}
125130

126-
void QgsMapToolSimplify::setToleranceUnits( int units )
131+
void QgsMapToolSimplify::setToleranceUnits( const QgsTolerance::UnitType &units )
127132
{
128-
mToleranceUnits = ( QgsTolerance::UnitType ) units;
129-
130133
QgsSettings settings;
131134
settings.setValue( QStringLiteral( "digitizing/simplify_tolerance_units" ), units );
132135

@@ -156,8 +159,28 @@ void QgsMapToolSimplify::updateSimplificationPreview()
156159
++i;
157160
}
158161

159-
mSimplifyDialog->updateStatusText();
160-
mSimplifyDialog->enableOkButton( !mReducedHasErrors );
162+
if ( mSimplifyUserWidget )
163+
{
164+
mSimplifyUserWidget->updateStatusText( statusText() );
165+
mSimplifyUserWidget->enableOkButton( !mReducedHasErrors );
166+
}
167+
}
168+
169+
void QgsMapToolSimplify::createUserInputWidget()
170+
{
171+
mSimplifyUserWidget = new QgsSimplifyUserInputWidget( );
172+
mSimplifyUserWidget->setConfig( method(), tolerance(), toleranceUnits(), smoothOffset(), smoothIterations() );
173+
174+
connect( mSimplifyUserWidget, &QgsSimplifyUserInputWidget::methodChanged, this, &QgsMapToolSimplify::setMethod );
175+
connect( mSimplifyUserWidget, &QgsSimplifyUserInputWidget::toleranceChanged, this, &QgsMapToolSimplify::setTolerance );
176+
connect( mSimplifyUserWidget, &QgsSimplifyUserInputWidget::toleranceUnitsChanged, this, &QgsMapToolSimplify::setToleranceUnits );
177+
connect( mSimplifyUserWidget, &QgsSimplifyUserInputWidget::smoothOffsetChanged, this, &QgsMapToolSimplify::setSmoothOffset );
178+
connect( mSimplifyUserWidget, &QgsSimplifyUserInputWidget::smoothIterationsChanged, this, &QgsMapToolSimplify::setSmoothIterations );
179+
connect( mSimplifyUserWidget, &QgsSimplifyUserInputWidget::accepted, this, &QgsMapToolSimplify::storeSimplified );
180+
connect( mSimplifyUserWidget, &QgsSimplifyUserInputWidget::rejected, this, &QgsMapToolSimplify::clearSelection );
181+
182+
QgisApp::instance()->addUserInputWidget( mSimplifyUserWidget );
183+
mSimplifyUserWidget->setFocus( Qt::TabFocusReason );
161184
}
162185

163186
QgsGeometry QgsMapToolSimplify::processGeometry( const QgsGeometry &geometry, double tolerance ) const
@@ -295,10 +318,13 @@ void QgsMapToolSimplify::canvasMoveEvent( QgsMapMouseEvent *e )
295318

296319
void QgsMapToolSimplify::canvasReleaseEvent( QgsMapMouseEvent *e )
297320
{
298-
if ( e->button() != Qt::LeftButton )
321+
if ( e->button() == Qt::RightButton )
322+
{
323+
clearSelection();
299324
return;
325+
}
300326

301-
if ( !currentVectorLayer() )
327+
if ( e->button() != Qt::LeftButton || !currentVectorLayer() )
302328
return;
303329

304330
delete mSelectionRubberBand;
@@ -340,10 +366,8 @@ void QgsMapToolSimplify::canvasReleaseEvent( QgsMapMouseEvent *e )
340366
rb->show();
341367
mRubberBands << rb;
342368
}
369+
createUserInputWidget();
343370
updateSimplificationPreview();
344-
345-
// show dialog as a non-modal window
346-
mSimplifyDialog->show();
347371
}
348372

349373

@@ -399,7 +423,8 @@ void QgsMapToolSimplify::selectFeaturesInRect()
399423
void QgsMapToolSimplify::clearSelection()
400424
{
401425
mSelectedFeatures.clear();
402-
426+
delete mSimplifyUserWidget;
427+
mSimplifyUserWidget = nullptr;
403428
qDeleteAll( mRubberBands );
404429
mRubberBands.clear();
405430
}
@@ -408,9 +433,6 @@ void QgsMapToolSimplify::deactivate()
408433
{
409434
delete mSelectionRubberBand;
410435
mSelectionRubberBand = nullptr;
411-
412-
if ( mSimplifyDialog->isVisible() )
413-
mSimplifyDialog->close();
414436
clearSelection();
415437
QgsMapTool::deactivate();
416438
}

src/app/qgsmaptoolsimplify.h

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,27 +27,7 @@
2727
class QgsRubberBand;
2828
class QgsMapToolSimplify;
2929
class QgsCoordinateTransform;
30-
31-
class APP_EXPORT QgsSimplifyDialog : public QDialog, private Ui::SimplifyLineDialog
32-
{
33-
Q_OBJECT
34-
35-
public:
36-
37-
QgsSimplifyDialog( QgsMapToolSimplify *tool, QWidget *parent = nullptr );
38-
39-
void updateStatusText();
40-
void enableOkButton( bool enabled );
41-
42-
protected:
43-
44-
//! Also cancels pending simplification
45-
void closeEvent( QCloseEvent *e ) override;
46-
47-
private:
48-
QgsMapToolSimplify *mTool = nullptr;
49-
50-
};
30+
class QgsSimplifyUserInputWidget;
5131

5232

5333
//! Map tool to simplify line/polygon features
@@ -82,8 +62,6 @@ class APP_EXPORT QgsMapToolSimplify: public QgsMapToolEdit
8262

8363
Method method() const;
8464

85-
void setMethod( Method method );
86-
8765
int smoothIterations() const;
8866
void setSmoothIterations( int smoothIterations );
8967

@@ -94,20 +72,24 @@ class APP_EXPORT QgsMapToolSimplify: public QgsMapToolEdit
9472
//! Slot to change display when slidebar is moved
9573
void setTolerance( double tolerance );
9674

97-
void setToleranceUnits( int units );
75+
void setToleranceUnits( const QgsTolerance::UnitType &units );
9876

9977
//! Slot to store feature after simplification
10078
void storeSimplified();
10179

10280
void clearSelection();
10381

82+
void setMethod( Method method );
83+
10484
private:
10585

10686
void selectOneFeature( QPoint canvasPoint );
10787
void selectFeaturesInRect();
10888

10989
void updateSimplificationPreview();
11090

91+
void createUserInputWidget();
92+
11193
/**
11294
* Simplifies a \a geometry to the specified \a tolerance, respecting the preset
11395
* simplification method.
@@ -116,7 +98,7 @@ class APP_EXPORT QgsMapToolSimplify: public QgsMapToolEdit
11698

11799
// data
118100
//! Dialog with slider to set correct tolerance value
119-
QgsSimplifyDialog *mSimplifyDialog = nullptr;
101+
QgsSimplifyUserInputWidget *mSimplifyUserWidget = nullptr;
120102

121103
//! Rubber bands to draw current state of simplification
122104
QList<QgsRubberBand *> mRubberBands;
@@ -143,6 +125,32 @@ class APP_EXPORT QgsMapToolSimplify: public QgsMapToolEdit
143125

144126
int mSmoothIterations = 1;
145127
double mSmoothOffset = 0.25;
128+
};
129+
130+
131+
class APP_EXPORT QgsSimplifyUserInputWidget : public QWidget, private Ui::SimplifyUserInputWidgetBase
132+
{
133+
Q_OBJECT
134+
135+
public:
136+
137+
QgsSimplifyUserInputWidget( QWidget *parent = nullptr );
138+
139+
void updateStatusText( const QString &text );
140+
void enableOkButton( bool enabled );
141+
142+
void setConfig( const QgsMapToolSimplify::Method &method, const double &tolerance,
143+
const QgsTolerance::UnitType &units, const double &smoothOffset,
144+
const int &smoothIterations );
145+
146+
signals:
147+
void accepted();
148+
void rejected();
149+
void toleranceChanged( double tolerance );
150+
void toleranceUnitsChanged( QgsTolerance::UnitType units );
151+
void methodChanged( QgsMapToolSimplify::Method method );
152+
void smoothOffsetChanged( double offset );
153+
void smoothIterationsChanged( int iterations );
146154

147155
};
148156

0 commit comments

Comments
 (0)