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
%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 );

View File

@ -125,8 +125,18 @@ QgsAdvancedDigitizingDockWidget::QgsAdvancedDigitizingDockWidget( QgsMapCanvas *
//also watch for focus out events on these widgets
QgsFocusWatcher *angleWatcher = new QgsFocusWatcher( mAngleLineEdit );
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 );
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 );
connect( xWatcher, &QgsFocusWatcher::focusOut, this, &QgsAdvancedDigitizingDockWidget::constraintFocusOut );
QgsFocusWatcher *yWatcher = new QgsFocusWatcher( mYLineEdit );
@ -818,17 +828,7 @@ double QgsAdvancedDigitizingDockWidget::parseUserInput( const QString &inputValu
{
ok = false;
QString cleanedInputValue { inputValue };
// 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 ) );
const QString cleanedInputValue { CadConstraint::removeSuffix( inputValue, type ) };
double value = qgsPermissiveToDouble( cleanedInputValue, ok );
if ( ! ok )
@ -1944,6 +1944,10 @@ void QgsAdvancedDigitizingDockWidget::updateCurrentPoint( const QgsPoint &point
void QgsAdvancedDigitizingDockWidget::CadConstraint::setLockMode( LockMode mode )
{
if ( mode == mLockMode )
{
return;
}
mLockMode = mode;
mLockerButton->setChecked( mode == HardLock );
if ( mRepeatingLockButton )
@ -2055,6 +2059,37 @@ void QgsAdvancedDigitizingDockWidget::CadConstraint::setMapCanvas( QgsMapCanvas
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
{
if ( exist )

View File

@ -225,6 +225,13 @@ class GUI_EXPORT QgsAdvancedDigitizingDockWidget : public QgsDockWidget, private
*/
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:
QLineEdit *mLineEdit = nullptr;
QToolButton *mLockerButton = nullptr;

View File

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