Skip to content

Commit

Permalink
use a current CaptureTechnique in QgsMapToolCapture
Browse files Browse the repository at this point in the history
QgisApp has been adapted to switch between the different techniques
  • Loading branch information
3nids committed Jan 28, 2022
1 parent 864787e commit e2a80d9
Show file tree
Hide file tree
Showing 17 changed files with 319 additions and 105 deletions.
2 changes: 2 additions & 0 deletions images/images.qrc
Expand Up @@ -290,7 +290,9 @@
<file>themes/default/mActionDeleteTable.svg</file>
<file>themes/default/mActionDeselectAll.svg</file>
<file>themes/default/mActionDeselectActiveLayer.svg</file>
<file>themes/default/mActionDigitizeShape.svg</file>
<file>themes/default/mActionDigitizeWithCurve.svg</file>
<file>themes/default/mActionDigitizeWithSegment.svg</file>
<file>themes/default/mActionDuplicateLayer.svg</file>
<file>themes/default/mActionDuplicateComposer.svg</file>
<file>themes/default/mActionEditCopy.svg</file>
Expand Down
52 changes: 52 additions & 0 deletions images/themes/default/mActionDigitizeShape.svg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
67 changes: 67 additions & 0 deletions images/themes/default/mActionDigitizeWithSegment.svg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions python/gui/auto_additions/qgsmaptoolcapture.py
@@ -0,0 +1,2 @@
# The following has been generated automatically from src/gui/qgsmaptoolcapture.h
QgsMapToolCapture.CaptureTechnique.baseClass = QgsMapToolCapture
19 changes: 17 additions & 2 deletions python/gui/auto_generated/qgsmaptoolcapture.sip.in
Expand Up @@ -33,6 +33,7 @@ class QgsMapToolCapture : QgsMapToolAdvancedDigitizing
StraightSegments,
CircularString,
Streaming,
Shape,
};

enum Capability
Expand Down Expand Up @@ -133,16 +134,30 @@ transfers ownership to the caller.
%End

public slots:
void setCircularDigitizingEnabled( bool enable );

void setCircularDigitizingEnabled( bool enable ) /Deprecated/;
%Docstring
Enable the digitizing with curve

.. deprecated:: QGIS 3.24
use :py:func:`~QgsMapToolCapture.setCurrentCaptureTechnique` instead
%End

void setStreamDigitizingEnabled( bool enable );
void setStreamDigitizingEnabled( bool enable ) /Deprecated/;
%Docstring
Toggles the stream digitizing mode.

.. versionadded:: 3.20

.. deprecated:: QGIS 3.24
use :py:func:`~QgsMapToolCapture.setCurrentCaptureTechnique` instead
%End

void setCurrentCaptureTechnique( CaptureTechnique technique );
%Docstring
Sets the current capture if it is supported by the map tool

.. versionadded:: 3.24
%End

protected:
Expand Down
98 changes: 50 additions & 48 deletions src/app/qgisapp.cpp
Expand Up @@ -2730,9 +2730,6 @@ void QgisApp::createActions()
connect( mActionRegularPolygon2Points, &QAction::triggered, this, [ = ] { setMapTool( mMapTools->mapTool( QgsAppMapTools::RegularPolygon2Points ), true ); } );
connect( mActionRegularPolygonCenterPoint, &QAction::triggered, this, [ = ] { setMapTool( mMapTools->mapTool( QgsAppMapTools::RegularPolygonCenterPoint ), true ); } );
connect( mActionRegularPolygonCenterCorner, &QAction::triggered, this, [ = ] { setMapTool( mMapTools->mapTool( QgsAppMapTools::RegularPolygonCenterCorner ), true ); } );
connect( mActionDigitizeWithCurve, &QAction::triggered, this, &QgisApp::enableDigitizeWithCurve );
connect( mActionStreamDigitize, &QAction::triggered, this, &QgisApp::enableStreamDigitizing );
mActionStreamDigitize->setShortcut( tr( "R", "Keyboard shortcut: toggle stream digitizing" ) );

connect( mActionMoveFeature, &QAction::triggered, this, &QgisApp::moveFeature );
connect( mActionMoveFeatureCopy, &QAction::triggered, this, &QgisApp::moveFeatureCopy );
Expand Down Expand Up @@ -3398,21 +3395,34 @@ void QgisApp::createToolBars()
mDigitizeModeToolButton = new QToolButton();
mDigitizeModeToolButton->setPopupMode( QToolButton::MenuButtonPopup );
QMenu *digitizeMenu = new QMenu( mDigitizeModeToolButton );
digitizeMenu->addAction( mActionDigitizeWithSegment );
digitizeMenu->addAction( mActionDigitizeWithCurve );
digitizeMenu->addAction( mActionStreamDigitize );
mActionStreamDigitize->setShortcut( tr( "R", "Keyboard shortcut: toggle stream digitizing" ) );

digitizeMenu->addSeparator();
digitizeMenu->addAction( mMapTools->streamDigitizingSettingsAction() );
mDigitizeModeToolButton->setMenu( digitizeMenu );

switch ( settings.value( QStringLiteral( "UI/digitizeTechnique" ), 0 ).toInt() )
connect( digitizeMenu, &QMenu::triggered, this, &QgisApp::setCaptureTechnique );

const QgsMapToolCapture::CaptureTechnique technique = settings.enumValue( QStringLiteral( "UI/digitizeTechnique" ), QgsMapToolCapture::CaptureTechnique::StraightSegments );
switch ( technique )
{
case 0:
case QgsMapToolCapture::CaptureTechnique::StraightSegments:
mDigitizeModeToolButton->setDefaultAction( mActionDigitizeWithSegment );
break;
case QgsMapToolCapture::CaptureTechnique::CircularString:
mDigitizeModeToolButton->setDefaultAction( mActionDigitizeWithCurve );
break;
case 1:
case QgsMapToolCapture::CaptureTechnique::Streaming:
mDigitizeModeToolButton->setDefaultAction( mActionStreamDigitize );
break;
case QgsMapToolCapture::CaptureTechnique::Shape:
mDigitizeModeToolButton->setDefaultAction( mActionDigitizeShape );
break;
}

mAdvancedDigitizeToolBar->insertWidget( mAdvancedDigitizeToolBar->actions().at( 0 ), mDigitizeModeToolButton );

QList<QAction *> toolbarMenuActions;
Expand Down Expand Up @@ -10619,54 +10629,40 @@ void QgisApp::snappingOptions()
mSnappingDialogContainer->show();
}

void QgisApp::enableDigitizeWithCurve( bool enable )
void QgisApp::setCaptureTechnique( QAction *captureTechniqueActionTriggered )
{
if ( enable && mActionStreamDigitize->isChecked() )
{
mActionStreamDigitize->setChecked( false );
enableStreamDigitizing( false );
}

if ( enable )
QgsMapToolCapture::CaptureTechnique technique = QgsMapToolCapture::CaptureTechnique::StraightSegments;
if ( captureTechniqueActionTriggered == mActionDigitizeWithCurve )
{
technique = QgsMapToolCapture::CaptureTechnique::CircularString;
mDigitizeModeToolButton->setDefaultAction( mActionDigitizeWithCurve );
QgsSettings().setValue( QStringLiteral( "UI/digitizeTechnique" ), 0 );
}

const QList< QgsMapToolCapture * > tools = captureTools();
for ( QgsMapToolCapture *tool : tools )
else if ( captureTechniqueActionTriggered == mActionStreamDigitize )
{
if ( tool->supportsTechnique( QgsMapToolCapture::CircularString ) )
tool->setCircularDigitizingEnabled( enable );
technique = QgsMapToolCapture::CaptureTechnique::Streaming;
mDigitizeModeToolButton->setDefaultAction( mActionStreamDigitize );
}
QgsSettings settings;
settings.setValue( QStringLiteral( "UI/digitizeWithCurve" ), enable ? 1 : 0 );
}

void QgisApp::enableStreamDigitizing( bool enable )
{
if ( enable && mActionDigitizeWithCurve->isChecked() )
else if ( captureTechniqueActionTriggered == mActionDigitizeShape )
{
mActionDigitizeWithCurve->setChecked( false );
enableDigitizeWithCurve( false );
technique = QgsMapToolCapture::CaptureTechnique::Shape;
mDigitizeModeToolButton->setDefaultAction( mActionDigitizeShape );
}

if ( enable )
else
{
mDigitizeModeToolButton->setDefaultAction( mActionStreamDigitize );
QgsSettings().setValue( QStringLiteral( "UI/digitizeTechnique" ), 1 );
mDigitizeModeToolButton->setDefaultAction( mActionDigitizeWithSegment );
}

const QList< QgsMapToolCapture * > tools = captureTools();
for ( QgsMapToolCapture *tool : tools )
{
if ( tool->supportsTechnique( QgsMapToolCapture::Streaming ) )
tool->setStreamDigitizingEnabled( enable );
if ( tool->supportsTechnique( technique ) )
tool->setCurrentCaptureTechnique( technique );
}
QgsSettings settings;
settings.setValue( QStringLiteral( "UI/digitizeWithStream" ), enable ? 1 : 0 );

QgsSettings().setEnumValue( QStringLiteral( "UI/digitizeTechnique" ), technique );
}


void QgisApp::enableDigitizeTechniqueActions( bool enable, QAction *triggeredFromToolAction )
{
if ( !mMapTools )
Expand All @@ -10681,7 +10677,7 @@ void QgisApp::enableDigitizeTechniqueActions( bool enable, QAction *triggeredFro
{
if ( triggeredFromToolAction == tool->action() || ( !triggeredFromToolAction && mMapCanvas->mapTool() == tool ) )
{
for ( QgsMapToolCapture::CaptureTechnique technique : { QgsMapToolCapture::CircularString, QgsMapToolCapture::Streaming } )
for ( QgsMapToolCapture::CaptureTechnique technique : { QgsMapToolCapture::CaptureTechnique::StraightSegments, QgsMapToolCapture::CaptureTechnique::CircularString, QgsMapToolCapture::CaptureTechnique::Streaming, QgsMapToolCapture::CaptureTechnique::Shape } )
{
if ( tool->supportsTechnique( technique ) )
supportedTechniques.insert( technique );
Expand All @@ -10690,20 +10686,26 @@ void QgisApp::enableDigitizeTechniqueActions( bool enable, QAction *triggeredFro
}
}

mActionDigitizeWithCurve->setEnabled( enable && supportedTechniques.contains( QgsMapToolCapture::CircularString ) );
const bool curveIsChecked = settings.value( QStringLiteral( "UI/digitizeWithCurve" ) ).toInt();
mActionDigitizeWithCurve->setChecked( curveIsChecked && mActionDigitizeWithCurve->isEnabled() );
const QgsMapToolCapture::CaptureTechnique technique = settings.enumValue( QStringLiteral( "UI/digitizeTechnique" ), QgsMapToolCapture::CaptureTechnique::StraightSegments );

mActionStreamDigitize->setEnabled( enable && supportedTechniques.contains( QgsMapToolCapture::Streaming ) );
const bool streamIsChecked = settings.value( QStringLiteral( "UI/digitizeWithStream" ) ).toInt();
mActionStreamDigitize->setChecked( streamIsChecked && mActionStreamDigitize->isEnabled() );
QList<std::pair<QgsMapToolCapture::CaptureTechnique, QAction *>> techniqueActions
{
{ QgsMapToolCapture::CaptureTechnique::StraightSegments, mActionDigitizeWithSegment},
{QgsMapToolCapture::CaptureTechnique::CircularString, mActionDigitizeWithCurve},
{QgsMapToolCapture::CaptureTechnique::Streaming, mActionStreamDigitize},
{QgsMapToolCapture::CaptureTechnique::Shape, mActionDigitizeShape}
};

for ( const auto &techniqueAction : techniqueActions )
{
techniqueAction.second->setEnabled( enable && supportedTechniques.contains( techniqueAction.first ) );
techniqueAction.second->setChecked( technique == techniqueAction.first && techniqueAction.second->isEnabled() );
}

for ( QgsMapToolCapture *tool : tools )
{
if ( tool->supportsTechnique( QgsMapToolCapture::CircularString ) )
tool->setCircularDigitizingEnabled( mActionDigitizeWithCurve->isChecked() );
if ( tool->supportsTechnique( QgsMapToolCapture::Streaming ) )
tool->setStreamDigitizingEnabled( mActionStreamDigitize->isChecked() );
if ( tool->supportsTechnique( technique ) )
tool->setCurrentCaptureTechnique( technique );
}
}

Expand Down
11 changes: 3 additions & 8 deletions src/app/qgisapp.h
Expand Up @@ -2039,16 +2039,11 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
void toggleEventTracing();

/**
* Enables or disables digitizing with curve for map tool that support this capabilities
* \since QGIS 3.16
* Sets the capture technique of the current map tool
* \since QGIS 3.24
*/
void enableDigitizeWithCurve( bool enable );
void setCaptureTechnique( QAction *captureTechniqueActionTriggered );

/**
* Enables or disables stream digitizing
* \since QGIS 3.20
*/
void enableStreamDigitizing( bool enable );

/**
* Enables the action that toggles digitizing with curve
Expand Down
7 changes: 4 additions & 3 deletions src/app/qgsmaptooladdpart.cpp
Expand Up @@ -44,11 +44,12 @@ bool QgsMapToolAddPart::supportsTechnique( QgsMapToolCapture::CaptureTechnique t
{
switch ( technique )
{
case QgsMapToolCapture::StraightSegments:
case QgsMapToolCapture::Streaming:
case QgsMapToolCapture::CaptureTechnique::StraightSegments:
case QgsMapToolCapture::CaptureTechnique::Streaming:
return true;

case QgsMapToolCapture::CircularString:
case QgsMapToolCapture::CaptureTechnique::CircularString:
case QgsMapToolCapture::CaptureTechnique::Shape:
return mode() != QgsMapToolCapture::CapturePoint;
}
return false;
Expand Down
7 changes: 4 additions & 3 deletions src/app/qgsmaptooladdring.cpp
Expand Up @@ -37,9 +37,10 @@ bool QgsMapToolAddRing::supportsTechnique( QgsMapToolCapture::CaptureTechnique t
{
switch ( technique )
{
case QgsMapToolCapture::StraightSegments:
case QgsMapToolCapture::Streaming:
case QgsMapToolCapture::CircularString:
case QgsMapToolCapture::CaptureTechnique::StraightSegments:
case QgsMapToolCapture::CaptureTechnique::Streaming:
case QgsMapToolCapture::CaptureTechnique::CircularString:
case QgsMapToolCapture::CaptureTechnique::Shape:
return true;
}
return false;
Expand Down

0 comments on commit e2a80d9

Please sign in to comment.