Skip to content

Commit

Permalink
[advanced digitizing] Additional tweaks to the 2-circle intersection …
Browse files Browse the repository at this point in the history
…tools (#58289)
  • Loading branch information
nirvn authored Aug 2, 2024
1 parent fa961c7 commit 9bece25
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 54 deletions.
80 changes: 55 additions & 25 deletions src/gui/qgsadvanceddigitizingdockwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1583,44 +1583,60 @@ void QgsAdvancedDigitizingDockWidget::processCanvasMoveEvent( QgsMapMouseEvent *

void QgsAdvancedDigitizingDockWidget::processCanvasReleaseEvent( QgsMapMouseEvent *event )
{
if ( alignToSegment( event ) )
if ( event->button() == Qt::RightButton )
{
event->setAccepted( false );
return;
if ( mCurrentTool )
{
mCurrentTool->canvasReleaseEvent( event );
if ( !event->isAccepted() )
{
return;
}
}
clear();
}

if ( mCurrentTool )
else
{
mCurrentTool->canvasReleaseEvent( event );
if ( !event->isAccepted() )
applyConstraints( event ); // updates event's map point
if ( alignToSegment( event ) )
{
event->setAccepted( false );
return;
}
else
{
// update the point list
QgsPoint point( event->mapPoint() );
point.setZ( QgsMapToolEdit::defaultZValue() );
point.setM( QgsMapToolEdit::defaultMValue() );

if ( mLockZButton->isChecked() )
if ( mCurrentTool )
{
mCurrentTool->canvasReleaseEvent( event );
if ( !event->isAccepted() )
{
point.setZ( QLocale().toDouble( mZLineEdit->text() ) );
return;
}
if ( mLockMButton->isChecked() )
else
{
point.setM( QLocale().toDouble( mMLineEdit->text() ) );
// update the point list
QgsPoint point( event->mapPoint() );
point.setZ( QgsMapToolEdit::defaultZValue() );
point.setM( QgsMapToolEdit::defaultMValue() );

if ( mLockZButton->isChecked() )
{
point.setZ( QLocale().toDouble( mZLineEdit->text() ) );
}
if ( mLockMButton->isChecked() )
{
point.setM( QLocale().toDouble( mMLineEdit->text() ) );
}
updateCurrentPoint( point );
}
updateCurrentPoint( point );
}
}

addPoint( event->mapPoint() );
releaseLocks( false );
addPoint( event->mapPoint() );
releaseLocks( false );

if ( constructionMode() )
{
event->setAccepted( false );
if ( constructionMode() )
{
event->setAccepted( false );
}
}
}

Expand Down Expand Up @@ -1698,6 +1714,11 @@ bool QgsAdvancedDigitizingDockWidget::canvasKeyPressEventFilter( QKeyEvent *e )

void QgsAdvancedDigitizingDockWidget::clear()
{
if ( mCurrentTool )
{
mCurrentTool->deleteLater();
}

if ( !mConstructionGuideLine.isEmpty() )
{
mConstructionGuideLine.clear();
Expand Down Expand Up @@ -1733,6 +1754,11 @@ void QgsAdvancedDigitizingDockWidget::keyPressEvent( QKeyEvent *e )
mConstructionGuideLine.clear();
}

if ( mCurrentTool )
{
mCurrentTool->deleteLater();
}

break;
}
default:
Expand Down Expand Up @@ -1793,7 +1819,11 @@ bool QgsAdvancedDigitizingDockWidget::filterKeyPress( QKeyEvent *e )
{
case Qt::Key_Escape:
{
if ( type == QEvent::KeyPress && mConstructionMode && mConstructionGuideLine.numPoints() >= 2 )
if ( type == QEvent::KeyPress && mCurrentTool )
{
mCurrentTool->deleteLater();
}
else if ( type == QEvent::KeyPress && mConstructionMode && mConstructionGuideLine.numPoints() >= 2 )
{
mConstructionGuidesLayer->dataProvider()->deleteFeatures( QgsFeatureIds() << mConstructionGuideId );
mConstructionGuideLine.clear();
Expand Down
72 changes: 54 additions & 18 deletions src/gui/qgsadvanceddigitizingtools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ QWidget *QgsAdvancedDigitizingCirclesIntersectionTool::createWidget()
layout->setContentsMargins( 0, 0, 0, 0 );
toolWidget->setLayout( layout );

QLabel *label = new QLabel( QStringLiteral( "Circle #1" ), toolWidget );
QLabel *label = new QLabel( tr( "Circle #1" ), toolWidget );
layout->addWidget( label, 0, 0, 1, 3 );

mCircle1Digitize = new QToolButton( toolWidget );
Expand All @@ -66,34 +66,39 @@ QWidget *QgsAdvancedDigitizingCirclesIntersectionTool::createWidget()
} );
layout->addWidget( mCircle1Digitize, 1, 2, 2, 1 );

label = new QLabel( QStringLiteral( "X" ), toolWidget );
label = new QLabel( QStringLiteral( "x" ), toolWidget );
layout->addWidget( label, 1, 0 );

mCircle1X = new QgsDoubleSpinBox( toolWidget );
mCircle1X->setMinimum( std::numeric_limits<double>::min() );
mCircle1X->setToolTip( tr( "X coordinate" ) );
mCircle1X->setMinimum( std::numeric_limits<double>::lowest() );
mCircle1X->setMaximum( std::numeric_limits<double>::max() );
mCircle1X->setClearValue( 0.0 );
connect( mCircle1X, &QgsDoubleSpinBox::textEdited, this, [ = ]() { mCircle1Digitize->setChecked( false ); } );
layout->addWidget( mCircle1X, 1, 1 );

label = new QLabel( QStringLiteral( "Y" ), toolWidget );
label = new QLabel( QStringLiteral( "y" ), toolWidget );
layout->addWidget( label, 2, 0 );

mCircle1Y = new QgsDoubleSpinBox( toolWidget );
mCircle1Y->setMinimum( std::numeric_limits<double>::min() );
mCircle1Y->setToolTip( tr( "Y coordinate" ) );
mCircle1Y->setMinimum( std::numeric_limits<double>::lowest() );
mCircle1Y->setMaximum( std::numeric_limits<double>::max() );
mCircle1Y->setClearValue( 0.0 );
connect( mCircle1Y, &QgsDoubleSpinBox::textEdited, this, [ = ]() { mCircle1Digitize->setChecked( false ); } );
layout->addWidget( mCircle1Y, 2, 1 );

label = new QLabel( QStringLiteral( "Distance" ), toolWidget );
label = new QLabel( QStringLiteral( "d" ), toolWidget );
layout->addWidget( label, 3, 0 );

mCircle1Distance = new QgsDoubleSpinBox( toolWidget );
mCircle1Distance->setToolTip( tr( "Distance" ) );
mCircle1Distance->setMinimum( 0 );
mCircle1Distance->setMaximum( std::numeric_limits<double>::max() );
connect( mCircle1Distance, &QgsDoubleSpinBox::returnPressed, this, [ = ]() { mCircle2Digitize->setChecked( true ); } );
layout->addWidget( mCircle1Distance, 3, 1 );

label = new QLabel( QStringLiteral( "Circle #2" ), toolWidget );
label = new QLabel( tr( "Circle #2" ), toolWidget );
layout->addWidget( label, 4, 0, 1, 3 );

mCircle2Digitize = new QToolButton( toolWidget );
Expand All @@ -109,28 +114,33 @@ QWidget *QgsAdvancedDigitizingCirclesIntersectionTool::createWidget()
} );
layout->addWidget( mCircle2Digitize, 5, 2, 2, 1 );

label = new QLabel( QStringLiteral( "X" ), toolWidget );
label = new QLabel( QStringLiteral( "x" ), toolWidget );
layout->addWidget( label, 5, 0 );

mCircle2X = new QgsDoubleSpinBox( toolWidget );
mCircle2X->setMinimum( std::numeric_limits<double>::min() );
mCircle2X->setToolTip( tr( "X coordinate" ) );
mCircle2X->setMinimum( std::numeric_limits<double>::lowest() );
mCircle2X->setMaximum( std::numeric_limits<double>::max() );
mCircle2X->setClearValue( 0.0 );
connect( mCircle2X, &QgsDoubleSpinBox::textEdited, this, [ = ]() { mCircle2Digitize->setChecked( false ); } );
layout->addWidget( mCircle2X, 5, 1 );

label = new QLabel( QStringLiteral( "Y" ), toolWidget );
label = new QLabel( QStringLiteral( "y" ), toolWidget );
layout->addWidget( label, 6, 0 );

mCircle2Y = new QgsDoubleSpinBox( toolWidget );
mCircle2Y->setMinimum( std::numeric_limits<double>::min() );
mCircle2Y->setToolTip( tr( "Y coordinate" ) );
mCircle2Y->setMinimum( std::numeric_limits<double>::lowest() );
mCircle2Y->setMaximum( std::numeric_limits<double>::max() );
mCircle2Y->setClearValue( 0.0 );
connect( mCircle2Y, &QgsDoubleSpinBox::textEdited, this, [ = ]() { mCircle2Digitize->setChecked( false ); } );
layout->addWidget( mCircle2Y, 6, 1 );

label = new QLabel( QStringLiteral( "Distance" ), toolWidget );
label = new QLabel( QStringLiteral( "d" ), toolWidget );
layout->addWidget( label, 7, 0 );

mCircle2Distance = new QgsDoubleSpinBox( toolWidget );
mCircle1Distance->setToolTip( tr( "Distance" ) );
mCircle2Distance->setMinimum( 0 );
mCircle2Distance->setMaximum( std::numeric_limits<double>::max() );
layout->addWidget( mCircle2Distance, 7, 1 );
Expand Down Expand Up @@ -171,6 +181,8 @@ QWidget *QgsAdvancedDigitizingCirclesIntersectionTool::createWidget()
mCircle1Digitize->setChecked( true );
}

toolWidget->installEventFilter( this );

mToolWidget = toolWidget;
return toolWidget;
}
Expand Down Expand Up @@ -201,13 +213,24 @@ void QgsAdvancedDigitizingCirclesIntersectionTool::canvasMoveEvent( QgsMapMouseE
if ( !mP1.isEmpty() )
{
mP1Closest = QgsGeometryUtils::distance2D( QgsPoint( mP1 ), QgsPoint( event->mapPoint() ) ) < QgsGeometryUtils::distance2D( QgsPoint( mP2 ), QgsPoint( event->mapPoint() ) );
event->setMapPoint( mP1Closest ? mP1 : mP2 );
}
else
{
event->setAccepted( false );
}

event->setAccepted( false );
}

void QgsAdvancedDigitizingCirclesIntersectionTool::canvasReleaseEvent( QgsMapMouseEvent *event )
{
if ( event->button() == Qt::RightButton )
{
deleteLater();
mCadDockWidget->updateCadPaintItem();
event->setAccepted( false );
return;
}

if ( mCircle1Digitize->isChecked() )
{
mCircle1X->setValue( event->mapPoint().x() );
Expand All @@ -233,10 +256,6 @@ void QgsAdvancedDigitizingCirclesIntersectionTool::canvasReleaseEvent( QgsMapMou
{
mP1Closest = QgsGeometryUtils::distance2D( QgsPoint( mP1 ), QgsPoint( event->mapPoint() ) ) < QgsGeometryUtils::distance2D( QgsPoint( mP2 ), QgsPoint( event->mapPoint() ) );
event->setMapPoint( mP1Closest ? mP1 : mP2 );
if ( mToolWidget )
{
mToolWidget->deleteLater();
}
deleteLater();
return;
}
Expand Down Expand Up @@ -297,3 +316,20 @@ void QgsAdvancedDigitizingCirclesIntersectionTool::paint( QPainter *painter )

painter->restore();
}

bool QgsAdvancedDigitizingCirclesIntersectionTool::eventFilter( QObject *obj, QEvent *event )
{
if ( event->type() == QEvent::ShortcutOverride || event->type() == QEvent::KeyPress )
{
if ( QKeyEvent *keyEvent = dynamic_cast<QKeyEvent *>( event ) )
{
if ( keyEvent->key() == Qt::Key_Escape )
{
deleteLater();
mCadDockWidget->updateCadPaintItem();
}
}
}

return QObject::eventFilter( obj, event );
}
2 changes: 2 additions & 0 deletions src/gui/qgsadvanceddigitizingtools.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,8 @@ class GUI_EXPORT QgsAdvancedDigitizingCirclesIntersectionTool : public QgsAdvanc
void canvasReleaseEvent( QgsMapMouseEvent *event ) override;

private:
bool eventFilter( QObject *obj, QEvent *event ) override;

void processParameters();

void drawCircle( QPainter *painter, double x, double y, double distance );
Expand Down
14 changes: 3 additions & 11 deletions src/gui/qgsmaptooladvanceddigitizing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,18 +60,10 @@ void QgsMapToolAdvancedDigitizing::canvasReleaseEvent( QgsMapMouseEvent *e )
{
if ( isAdvancedDigitizingAllowed() && mCadDockWidget->cadEnabled() )
{
if ( e->button() == Qt::RightButton )
{
mCadDockWidget->clear();
}
else
mCadDockWidget->processCanvasReleaseEvent( e );
if ( !e->isAccepted() )
{
mCadDockWidget->applyConstraints( e ); // updates event's map point
mCadDockWidget->processCanvasReleaseEvent( e );
if ( !e->isAccepted() )
{
return; // The dock widget has taken the event
}
return; // The dock widget has taken the event
}
}
else if ( isAutoSnapEnabled() )
Expand Down

0 comments on commit 9bece25

Please sign in to comment.