Skip to content

Commit 04d7e2a

Browse files
committedMay 15, 2019
fix behaviour on focusOut and textEdited
it now matches exactly (i think) the dockwidget's behaviour
1 parent d6ac603 commit 04d7e2a

File tree

3 files changed

+92
-25
lines changed

3 files changed

+92
-25
lines changed
 

‎src/gui/qgsadvanceddigitizingdockwidget.cpp

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
***************************************************************************/
1515

1616
#include <QMenu>
17+
#include <QEvent>
18+
#include <QCoreApplication>
1719

1820
#include <cmath>
1921

@@ -160,25 +162,61 @@ QgsAdvancedDigitizingDockWidget::QgsAdvancedDigitizingDockWidget( QgsMapCanvas *
160162
disable();
161163
}
162164

163-
void QgsAdvancedDigitizingDockWidget::setX( const QString &value )
165+
void QgsAdvancedDigitizingDockWidget::setX( const QString &value, WidgetSetMode mode )
164166
{
165167
mXLineEdit->setText( value );
166-
mXLineEdit->returnPressed();
168+
if( mode == WidgetSetMode::ReturnPressed){
169+
mXLineEdit->returnPressed();
170+
}
171+
else if ( mode == WidgetSetMode::FocusOut){
172+
QEvent *e = new QEvent(QEvent::FocusOut);
173+
QCoreApplication::postEvent(mXLineEdit, e);
174+
}
175+
else if ( mode == WidgetSetMode::TextEdited){
176+
mXLineEdit->textEdited(value);
177+
}
167178
}
168-
void QgsAdvancedDigitizingDockWidget::setY( const QString &value )
179+
void QgsAdvancedDigitizingDockWidget::setY( const QString &value, WidgetSetMode mode )
169180
{
170181
mYLineEdit->setText( value );
171-
mYLineEdit->returnPressed();
182+
if( mode == WidgetSetMode::ReturnPressed){
183+
mYLineEdit->returnPressed();
184+
}
185+
else if ( mode == WidgetSetMode::FocusOut){
186+
QEvent *e = new QEvent(QEvent::FocusOut);
187+
QCoreApplication::postEvent(mYLineEdit, e);
188+
}
189+
else if ( mode == WidgetSetMode::TextEdited){
190+
mYLineEdit->textEdited(value);
191+
}
172192
}
173-
void QgsAdvancedDigitizingDockWidget::setAngle( const QString &value )
193+
void QgsAdvancedDigitizingDockWidget::setAngle( const QString &value, WidgetSetMode mode )
174194
{
175195
mAngleLineEdit->setText( value );
176-
mAngleLineEdit->returnPressed();
196+
if( mode == WidgetSetMode::ReturnPressed){
197+
mAngleLineEdit->returnPressed();
198+
}
199+
else if ( mode == WidgetSetMode::FocusOut){
200+
QEvent *e = new QEvent(QEvent::FocusOut);
201+
QCoreApplication::postEvent(mAngleLineEdit, e);
202+
}
203+
else if ( mode == WidgetSetMode::TextEdited){
204+
mAngleLineEdit->textEdited(value);
205+
}
177206
}
178-
void QgsAdvancedDigitizingDockWidget::setDistance( const QString &value )
207+
void QgsAdvancedDigitizingDockWidget::setDistance( const QString &value, WidgetSetMode mode )
179208
{
180209
mDistanceLineEdit->setText( value );
181-
mDistanceLineEdit->returnPressed();
210+
if( mode == WidgetSetMode::ReturnPressed){
211+
mDistanceLineEdit->returnPressed();
212+
}
213+
else if ( mode == WidgetSetMode::FocusOut){
214+
QEvent *e = new QEvent(QEvent::FocusOut);
215+
QCoreApplication::postEvent(mDistanceLineEdit, e);
216+
}
217+
else if ( mode == WidgetSetMode::TextEdited){
218+
mDistanceLineEdit->textEdited(value);
219+
}
182220
}
183221

184222

‎src/gui/qgsadvanceddigitizingdockwidget.h

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,13 @@ class GUI_EXPORT QgsAdvancedDigitizingDockWidget : public QgsDockWidget, private
7474
Parallel //!< Parallel
7575
};
7676

77+
/**
78+
* Type of interaction to simulate when editing values from external widget
79+
*/
80+
enum WidgetSetMode {
81+
ReturnPressed, FocusOut, TextEdited
82+
};
83+
7784

7885
/**
7986
* \ingroup gui
@@ -344,36 +351,42 @@ class GUI_EXPORT QgsAdvancedDigitizingDockWidget : public QgsDockWidget, private
344351
void updateCadPaintItem();
345352

346353
/**
347-
* Set and lock the X \a value.
348-
* Can be used to set constraints.
354+
* Set the X \a value on the widget.
355+
* Can be used to set constraints by external widgets.
356+
* \param mode What type of interaction to emulate
349357
* \note The value is a QString, as it could be an expression.
350358
* \since QGIS 3.8
351359
*/
352-
void setX( const QString &value );
360+
void setX( const QString &value, WidgetSetMode mode );
353361

354362
/**
355-
* Set and lock the Y \a value.
356-
* Can be used to set constraints.
363+
* Set the Y \a value on the widget.
364+
* Can be used to set constraints by external widgets.
365+
* \param mode What type of interaction to emulate
357366
* \note The value is a QString, as it could be an expression.
358367
* \since QGIS 3.8
359368
*/
360-
void setY( const QString &value );
369+
void setY( const QString &value, WidgetSetMode mode );
361370

362371
/**
363-
* Set and lock the angle \a value.
364-
* Can be used to set constraints.
372+
* Set the angle \a value on the widget.
373+
* Can be used to set constraints by external widgets.
374+
* \param mode What type of interaction to emulate
365375
* \note The value is a QString, as it could be an expression.
366376
* \since QGIS 3.8
367377
*/
368-
void setAngle( const QString &value );
378+
void setAngle( const QString &value, WidgetSetMode mode );
369379

370380
/**
371-
* Set and lock the distance \a value.
372-
* Can be used to set constraints.
381+
* Set the distance \a value on the widget.
382+
* Can be used to set constraints by external widgets.
383+
* \param mode What type of interaction to emulate
373384
* \note The value is a QString, as it could be an expression.
374385
* \since QGIS 3.8
375386
*/
376-
void setDistance( const QString &value );
387+
void setDistance( const QString &value, WidgetSetMode mode );
388+
389+
377390

378391
signals:
379392

‎src/gui/qgsadvanceddigitizingfloater.cpp

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "qgsmessagelog.h"
2222
#include "qgsmapcanvas.h"
2323
#include "qgssettings.h"
24+
#include "qgsfocuswatcher.h"
2425

2526
QgsAdvancedDigitizingFloater::QgsAdvancedDigitizingFloater( QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDockWidget )
2627
: QWidget( canvas->viewport() ), mMapCanvas( canvas ), mCadDockWidget( cadDockWidget )
@@ -71,11 +72,26 @@ QgsAdvancedDigitizingFloater::QgsAdvancedDigitizingFloater( QgsMapCanvas *canvas
7172
connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedAngle, this, &QgsAdvancedDigitizingFloater::enabledChangedAngle );
7273
connect( cadDockWidget, &QgsAdvancedDigitizingDockWidget::enabledChangedDistance, this, &QgsAdvancedDigitizingFloater::enabledChangedDistance );
7374

74-
// Connect our line edits signals to update cadDockWidget's state
75-
connect( mXLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setX( mXLineEdit->text() ); } );
76-
connect( mYLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setY( mYLineEdit->text() ); } );
77-
connect( mAngleLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setAngle( mAngleLineEdit->text() ); } );
78-
connect( mDistanceLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setDistance( mDistanceLineEdit->text() ); } );
75+
// Connect our line edits signals to update cadDockWidget's state (implementation copied from QgsAdvancedDigitizingDockWidget)
76+
connect( mXLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setX( mXLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } );
77+
connect( mYLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setY( mYLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } );
78+
connect( mAngleLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setAngle( mAngleLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } );
79+
connect( mDistanceLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setDistance( mDistanceLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } );
80+
81+
connect( mXLineEdit, &QLineEdit::textEdited, cadDockWidget, [ = ]() { cadDockWidget->setX( mXLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
82+
connect( mYLineEdit, &QLineEdit::textEdited, cadDockWidget, [ = ]() { cadDockWidget->setY( mYLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
83+
connect( mAngleLineEdit, &QLineEdit::textEdited, cadDockWidget, [ = ]() { cadDockWidget->setAngle( mAngleLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
84+
connect( mDistanceLineEdit, &QLineEdit::textEdited, cadDockWidget, [ = ]() { cadDockWidget->setDistance( mDistanceLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
85+
86+
QgsFocusWatcher *xWatcher = new QgsFocusWatcher( mXLineEdit );
87+
connect( xWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [=](){ cadDockWidget->setX( mXLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } );
88+
QgsFocusWatcher *yWatcher = new QgsFocusWatcher( mYLineEdit );
89+
connect( yWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [=](){ cadDockWidget->setY( mYLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } );
90+
QgsFocusWatcher *angleWatcher = new QgsFocusWatcher( mAngleLineEdit );
91+
connect( angleWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [=](){ cadDockWidget->setAngle( mAngleLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } );
92+
QgsFocusWatcher *distanceWatcher = new QgsFocusWatcher( mDistanceLineEdit );
93+
connect( distanceWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [=](){ cadDockWidget->setDistance( mDistanceLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } );
94+
7995
}
8096

8197
bool QgsAdvancedDigitizingFloater::eventFilter( QObject *obj, QEvent *event )

0 commit comments

Comments
 (0)
Please sign in to comment.