void QgsMapToolAdvancedDigitizing::canvasReleaseEvent( QgsMapMouseEvent *e )
{
  if ( isAdvancedDigitizingAllowed() && mCadDockWidget->cadEnabled() )
  {
    if ( e->button() == Qt::RightButton )
    {
      mCadDockWidget->clear();
    }
    else
    {
      mCadDockWidget->applyConstraints( e );  // updates event's map point

      if ( mCadDockWidget->alignToSegment( e ) )
      {
        // Parallel or perpendicular mode and snapped to segment: do not pass the event to map tool
        return;
      }

      mCadDockWidget->addPoint( e->mapPoint() );

      mCadDockWidget->releaseLocks( false );

      if ( mCadDockWidget->constructionMode() )
        return;  // decided to eat the event and not pass it to the map tool (construction mode)
    }
  }
  else if ( isAutoSnapEnabled() )
  {
    e->snapPoint();
  }

  cadCanvasReleaseEvent( e );
}
void QgsMapToolAdvancedDigitizing::canvasReleaseEvent( QgsMapMouseEvent* e )
{
  snap( e );

  QgsAdvancedDigitizingDockWidget::AdvancedDigitizingMode dockMode;
  switch ( mCaptureMode )
  {
    case CaptureLine:
    case CapturePolygon:
      dockMode = QgsAdvancedDigitizingDockWidget::ManyPoints;
      break;
    case CaptureSegment:
      dockMode = QgsAdvancedDigitizingDockWidget::TwoPoints;
      break;
    default:
      dockMode = QgsAdvancedDigitizingDockWidget::SinglePoint;
      break;
  }

  if ( !mCadDockWidget->canvasReleaseEvent( e, dockMode ) )
    cadCanvasReleaseEvent( e );
}
void QgsMapToolAdvancedDigitizing::canvasReleaseEvent( QgsMapMouseEvent* e )
{
    if ( !mCadDockWidget->canvasReleaseEvent( e, mCaptureMode == CaptureLine || mCaptureMode == CapturePolygon ) )
        cadCanvasReleaseEvent( e );
}