CAD fix regression with units

Fix #54501
This commit is contained in:
Alessandro Pasotti 2023-09-21 14:03:30 +02:00
parent e5e6a13671
commit 0c9f15ee93
4 changed files with 98 additions and 15 deletions

View File

@ -198,6 +198,14 @@ Sets the map canvas to ``mapCanvas``
.. versionadded:: 3.32 .. versionadded:: 3.32
%End %End
static QString removeSuffix( const QString &text, Qgis::CadConstraintType constraintType );
%Docstring
Removes unit suffix from the constraint text.
.. versionadded:: 3.34
%End
}; };
explicit QgsAdvancedDigitizingDockWidget( QgsMapCanvas *canvas, QWidget *parent = 0 ); explicit QgsAdvancedDigitizingDockWidget( QgsMapCanvas *canvas, QWidget *parent = 0 );

View File

@ -125,8 +125,18 @@ QgsAdvancedDigitizingDockWidget::QgsAdvancedDigitizingDockWidget( QgsMapCanvas *
//also watch for focus out events on these widgets //also watch for focus out events on these widgets
QgsFocusWatcher *angleWatcher = new QgsFocusWatcher( mAngleLineEdit ); QgsFocusWatcher *angleWatcher = new QgsFocusWatcher( mAngleLineEdit );
connect( angleWatcher, &QgsFocusWatcher::focusOut, this, &QgsAdvancedDigitizingDockWidget::constraintFocusOut ); connect( angleWatcher, &QgsFocusWatcher::focusOut, this, &QgsAdvancedDigitizingDockWidget::constraintFocusOut );
connect( angleWatcher, &QgsFocusWatcher::focusIn, this, [ = ]()
{
const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mAngleLineEdit->text(), Qgis::CadConstraintType::Angle ) };
whileBlocking( mAngleLineEdit )->setText( cleanedInputValue );
} );
QgsFocusWatcher *distanceWatcher = new QgsFocusWatcher( mDistanceLineEdit ); QgsFocusWatcher *distanceWatcher = new QgsFocusWatcher( mDistanceLineEdit );
connect( distanceWatcher, &QgsFocusWatcher::focusOut, this, &QgsAdvancedDigitizingDockWidget::constraintFocusOut ); connect( distanceWatcher, &QgsFocusWatcher::focusOut, this, &QgsAdvancedDigitizingDockWidget::constraintFocusOut );
connect( distanceWatcher, &QgsFocusWatcher::focusIn, this, [ = ]()
{
const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mDistanceLineEdit->text(), Qgis::CadConstraintType::Distance ) };
whileBlocking( mDistanceLineEdit )->setText( cleanedInputValue );
} );
QgsFocusWatcher *xWatcher = new QgsFocusWatcher( mXLineEdit ); QgsFocusWatcher *xWatcher = new QgsFocusWatcher( mXLineEdit );
connect( xWatcher, &QgsFocusWatcher::focusOut, this, &QgsAdvancedDigitizingDockWidget::constraintFocusOut ); connect( xWatcher, &QgsFocusWatcher::focusOut, this, &QgsAdvancedDigitizingDockWidget::constraintFocusOut );
QgsFocusWatcher *yWatcher = new QgsFocusWatcher( mYLineEdit ); QgsFocusWatcher *yWatcher = new QgsFocusWatcher( mYLineEdit );
@ -818,17 +828,7 @@ double QgsAdvancedDigitizingDockWidget::parseUserInput( const QString &inputValu
{ {
ok = false; ok = false;
QString cleanedInputValue { inputValue }; const QString cleanedInputValue { CadConstraint::removeSuffix( inputValue, type ) };
// Remove angle suffix
if ( type == Qgis::CadConstraintType::Angle )
cleanedInputValue.remove( tr( "°" ) );
// Remove distance unit suffix
const Qgis::DistanceUnit distanceUnit { QgsProject::instance()->distanceUnits() };
if ( type == Qgis::CadConstraintType::Distance )
cleanedInputValue.remove( QgsUnitTypes::toAbbreviatedString( distanceUnit ) );
double value = qgsPermissiveToDouble( cleanedInputValue, ok ); double value = qgsPermissiveToDouble( cleanedInputValue, ok );
if ( ! ok ) if ( ! ok )
@ -1944,6 +1944,10 @@ void QgsAdvancedDigitizingDockWidget::updateCurrentPoint( const QgsPoint &point
void QgsAdvancedDigitizingDockWidget::CadConstraint::setLockMode( LockMode mode ) void QgsAdvancedDigitizingDockWidget::CadConstraint::setLockMode( LockMode mode )
{ {
if ( mode == mLockMode )
{
return;
}
mLockMode = mode; mLockMode = mode;
mLockerButton->setChecked( mode == HardLock ); mLockerButton->setChecked( mode == HardLock );
if ( mRepeatingLockButton ) if ( mRepeatingLockButton )
@ -2055,6 +2059,37 @@ void QgsAdvancedDigitizingDockWidget::CadConstraint::setMapCanvas( QgsMapCanvas
mMapCanvas = mapCanvas; mMapCanvas = mapCanvas;
} }
QString QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( const QString &text, Qgis::CadConstraintType constraintType )
{
QString value { text.trimmed() };
switch ( constraintType )
{
case Qgis::CadConstraintType::Distance:
{
// Remove distance unit suffix
const QString distanceUnit { QgsUnitTypes::toAbbreviatedString( QgsProject::instance()->distanceUnits() ).prepend( ' ' ) };
if ( value.endsWith( distanceUnit ) )
{
value.remove( distanceUnit );
}
break;
}
case Qgis::CadConstraintType::Angle:
{
// Remove angle suffix
const QString angleUnit { tr( "°" ).prepend( ' ' ) };
if ( value.endsWith( angleUnit ) )
{
value.remove( angleUnit );
}
break;
}
default:
break;
}
return value;
}
QgsPoint QgsAdvancedDigitizingDockWidget::currentPointV2( bool *exist ) const QgsPoint QgsAdvancedDigitizingDockWidget::currentPointV2( bool *exist ) const
{ {
if ( exist ) if ( exist )

View File

@ -225,6 +225,13 @@ class GUI_EXPORT QgsAdvancedDigitizingDockWidget : public QgsDockWidget, private
*/ */
void setMapCanvas( QgsMapCanvas *mapCanvas ); void setMapCanvas( QgsMapCanvas *mapCanvas );
/**
* Removes unit suffix from the constraint text.
* \since QGIS 3.34
*/
static QString removeSuffix( const QString &text, Qgis::CadConstraintType constraintType );
private: private:
QLineEdit *mLineEdit = nullptr; QLineEdit *mLineEdit = nullptr;
QToolButton *mLockerButton = nullptr; QToolButton *mLockerButton = nullptr;

View File

@ -21,6 +21,7 @@
#include "qgsmapcanvas.h" #include "qgsmapcanvas.h"
#include "qgssettings.h" #include "qgssettings.h"
#include "qgsfocuswatcher.h" #include "qgsfocuswatcher.h"
#include "qgsunittypes.h"
QgsAdvancedDigitizingFloater::QgsAdvancedDigitizingFloater( QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDockWidget ) QgsAdvancedDigitizingFloater::QgsAdvancedDigitizingFloater( QgsMapCanvas *canvas, QgsAdvancedDigitizingDockWidget *cadDockWidget )
: QWidget( canvas->viewport() ) : QWidget( canvas->viewport() )
@ -100,8 +101,18 @@ QgsAdvancedDigitizingFloater::QgsAdvancedDigitizingFloater( QgsMapCanvas *canvas
connect( mYLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setY( mYLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } ); connect( mYLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setY( mYLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } );
connect( mZLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setZ( mZLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } ); connect( mZLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setZ( mZLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } );
connect( mMLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setM( mMLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } ); connect( mMLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setM( mMLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } );
connect( mAngleLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setAngle( mAngleLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } ); connect( mAngleLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]()
connect( mDistanceLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]() { cadDockWidget->setDistance( mDistanceLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed ); } ); {
cadDockWidget->setAngle( mAngleLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed );
const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mAngleLineEdit->text(), Qgis::CadConstraintType::Angle ) };
whileBlocking( mAngleLineEdit )->setText( cleanedInputValue );
} );
connect( mDistanceLineEdit, &QLineEdit::returnPressed, cadDockWidget, [ = ]()
{
cadDockWidget->setDistance( mDistanceLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::ReturnPressed );
const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mDistanceLineEdit->text(), Qgis::CadConstraintType::Distance ) };
whileBlocking( mDistanceLineEdit )->setText( cleanedInputValue );
} );
connect( mXLineEdit, &QLineEdit::textEdited, cadDockWidget, [ = ]() { cadDockWidget->setX( mXLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } ); connect( mXLineEdit, &QLineEdit::textEdited, cadDockWidget, [ = ]() { cadDockWidget->setX( mXLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
connect( mYLineEdit, &QLineEdit::textEdited, cadDockWidget, [ = ]() { cadDockWidget->setY( mYLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } ); connect( mYLineEdit, &QLineEdit::textEdited, cadDockWidget, [ = ]() { cadDockWidget->setY( mYLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::TextEdited ); } );
@ -119,9 +130,27 @@ QgsAdvancedDigitizingFloater::QgsAdvancedDigitizingFloater( QgsMapCanvas *canvas
QgsFocusWatcher *mWatcher = new QgsFocusWatcher( mYLineEdit ); QgsFocusWatcher *mWatcher = new QgsFocusWatcher( mYLineEdit );
connect( mWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [ = ]() { cadDockWidget->setM( mMLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } ); connect( mWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [ = ]() { cadDockWidget->setM( mMLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } );
QgsFocusWatcher *angleWatcher = new QgsFocusWatcher( mAngleLineEdit ); QgsFocusWatcher *angleWatcher = new QgsFocusWatcher( mAngleLineEdit );
connect( angleWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [ = ]() { cadDockWidget->setAngle( mAngleLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } ); connect( angleWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [ = ]()
{
cadDockWidget->setAngle( mAngleLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut );
whileBlocking( mAngleLineEdit )->setText( mCadDockWidget->constraintAngle()->displayValue() );
} );
connect( angleWatcher, &QgsFocusWatcher::focusIn, this, [ = ]()
{
const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mAngleLineEdit->text(), Qgis::CadConstraintType::Angle ) };
whileBlocking( mAngleLineEdit )->setText( cleanedInputValue );
} );
QgsFocusWatcher *distanceWatcher = new QgsFocusWatcher( mDistanceLineEdit ); QgsFocusWatcher *distanceWatcher = new QgsFocusWatcher( mDistanceLineEdit );
connect( distanceWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [ = ]() { cadDockWidget->setDistance( mDistanceLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut ); } ); connect( distanceWatcher, &QgsFocusWatcher::focusOut, cadDockWidget, [ = ]()
{
cadDockWidget->setDistance( mDistanceLineEdit->text(), QgsAdvancedDigitizingDockWidget::WidgetSetMode::FocusOut );
whileBlocking( mDistanceLineEdit )->setText( mCadDockWidget->constraintDistance()->displayValue() );
} );
connect( distanceWatcher, &QgsFocusWatcher::focusIn, this, [ = ]()
{
const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mDistanceLineEdit->text(), Qgis::CadConstraintType::Distance ) };
whileBlocking( mDistanceLineEdit )->setText( cleanedInputValue );
} );
changeCommonAngleSnapping( mCadDockWidget->commonAngleConstraint() ); changeCommonAngleSnapping( mCadDockWidget->commonAngleConstraint() );
@ -453,6 +482,8 @@ void QgsAdvancedDigitizingFloater::focusOnDistance()
{ {
if ( mActive ) if ( mActive )
{ {
const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mDistanceLineEdit->text(), Qgis::CadConstraintType::Distance ) };
mDistanceLineEdit->setText( cleanedInputValue );
mDistanceLineEdit->setFocus(); mDistanceLineEdit->setFocus();
mDistanceLineEdit->selectAll(); mDistanceLineEdit->selectAll();
} }
@ -462,6 +493,8 @@ void QgsAdvancedDigitizingFloater::focusOnAngle()
{ {
if ( mActive ) if ( mActive )
{ {
const QString cleanedInputValue { QgsAdvancedDigitizingDockWidget::CadConstraint::removeSuffix( mDistanceLineEdit->text(), Qgis::CadConstraintType::Angle ) };
mAngleLineEdit->setText( cleanedInputValue );
mAngleLineEdit->setFocus(); mAngleLineEdit->setFocus();
mAngleLineEdit->selectAll(); mAngleLineEdit->selectAll();
} }