Switch to flags for map tool behaviour

This commit is contained in:
Nyall Dawson 2016-05-30 02:42:12 +10:00
parent 71f8e3e4bb
commit 8628f211dd
12 changed files with 69 additions and 39 deletions

View File

@ -30,6 +30,22 @@ class QgsMapTool : QObject
public:
//! Enumeration of flags that adjust the way the map tool operates
//! @note added in QGIS 2.16
enum Flag
{
Transient, /*!< Indicates that this map tool performs a transient (one-off) operation.
If it does, the tool can be operated once and then a previous map
tool automatically restored. */
EditTool, /*!< Map tool is an edit tool, which can only be used when layer is editable*/
};
typedef QFlags<QgsMapTool::Flag> Flags;
/** Returns the flags for the map tool.
* @note added in QGIS 2.16
*/
virtual Flags flags() const;
//! virtual destructor
virtual ~QgsMapTool();
@ -85,13 +101,16 @@ class QgsMapTool : QObject
/** Check whether this MapTool performs a zoom or pan operation.
* If it does, we will be able to perform the zoom and then
* resume operations with the original / previously used tool.*/
virtual bool isTransient();
* resume operations with the original / previously used tool.
* @deprecated use flags() instead
*/
virtual bool isTransient() const /Deprecated/;
/** Check whether this MapTool performs an edit operation.
* If it does, we will deactivate it when editing is turned off
* If it does, we will deactivate it when editing is turned off.
* @deprecated use flags() instead
*/
virtual bool isEditTool();
virtual bool isEditTool() const /Deprecated/;
//! called when set as currently active map tool
virtual void activate();

View File

@ -25,11 +25,7 @@ class QgsMapToolEdit: QgsMapTool
QgsMapToolEdit( QgsMapCanvas* canvas );
virtual ~QgsMapToolEdit();
/**
* Is this an edit tool?
* @return Of course it is or you would not be inheriting from it.
*/
virtual bool isEditTool();
virtual Flags flags() const;
protected:

View File

@ -9,6 +9,8 @@ class QgsMapToolPan : QgsMapTool
//! constructor
QgsMapToolPan( QgsMapCanvas* canvas );
virtual Flags flags() const;
//! Mouse press event
virtual void canvasPressEvent( QgsMapMouseEvent* e );
@ -18,6 +20,5 @@ class QgsMapToolPan : QgsMapTool
//! Overridden mouse release event
virtual void canvasReleaseEvent( QgsMapMouseEvent* e );
virtual bool isTransient();
};

View File

@ -11,6 +11,8 @@ class QgsMapToolZoom : QgsMapTool
~QgsMapToolZoom();
virtual Flags flags() const;
//! Overridden mouse move event
virtual void canvasMoveEvent( QgsMapMouseEvent* e );
@ -20,9 +22,6 @@ class QgsMapToolZoom : QgsMapTool
//! Overridden mouse release event
virtual void canvasReleaseEvent( QgsMapMouseEvent* e );
//! indicates whether we're zooming in or out
virtual bool isTransient();
//! Flag to indicate a map canvas drag operation is taking place
virtual void deactivate();
};

View File

@ -9763,7 +9763,7 @@ void QgisApp::mapToolChanged( QgsMapTool *newTool, QgsMapTool *oldTool )
if ( newTool )
{
if ( !newTool->isEditTool() )
if ( !( newTool->flags() & QgsMapTool::EditTool ) )
{
mNonEditMapTool = newTool;
}
@ -10205,7 +10205,7 @@ void QgisApp::activateDeactivateLayerRelatedActions( QgsMapLayer* layer )
mActionFeatureAction->setEnabled( layerHasActions );
if ( !isEditable && mMapCanvas && mMapCanvas->mapTool()
&& mMapCanvas->mapTool()->isEditTool() && !mSaveRollbackInProgress )
&& ( mMapCanvas->mapTool()->flags() & QgsMapTool::EditTool ) && !mSaveRollbackInProgress )
{
mMapCanvas->setMapTool( mNonEditMapTool );
}

View File

@ -34,8 +34,9 @@ class APP_EXPORT QgsMapToolPointSymbol: public QgsMapToolEdit
public:
QgsMapToolPointSymbol( QgsMapCanvas* canvas );
virtual Flags flags() const { return QgsMapTool::EditTool; }
void canvasPressEvent( QgsMapMouseEvent* e ) override;
bool isEditTool() override { return true; }
protected:
QgsVectorLayer* mActiveLayer;

View File

@ -1386,7 +1386,7 @@ void QgsMapCanvas::mouseReleaseEvent( QMouseEvent* e )
if ( mMapTool )
{
// right button was pressed in zoom tool? return to previous non zoom tool
if ( e->button() == Qt::RightButton && mMapTool->isTransient() )
if ( e->button() == Qt::RightButton && mMapTool->flags() & QgsMapTool::Transient )
{
QgsDebugMsg( "Right click in map tool zoom or pan, last tool is " +
QString( mLastNonZoomMapTool ? "not null." : "null." ) );
@ -1395,7 +1395,8 @@ void QgsMapCanvas::mouseReleaseEvent( QMouseEvent* e )
// change to older non-zoom tool
if ( mLastNonZoomMapTool
&& ( !mLastNonZoomMapTool->isEditTool() || ( vlayer && vlayer->isEditable() ) ) )
&& ( !( mLastNonZoomMapTool->flags() & QgsMapTool::EditTool )
|| ( vlayer && vlayer->isEditable() ) ) )
{
QgsMapTool* t = mLastNonZoomMapTool;
mLastNonZoomMapTool = nullptr;
@ -1601,7 +1602,8 @@ void QgsMapCanvas::setMapTool( QgsMapTool* tool )
mMapTool->deactivate();
}
if ( tool->isTransient() && mMapTool && !mMapTool->isTransient() )
if (( tool->flags() & QgsMapTool::Transient )
&& mMapTool && !( mMapTool->flags() & QgsMapTool::Transient ) )
{
// if zoom or pan tool will be active, save old tool
// to bring it back on right click

View File

@ -189,14 +189,14 @@ void QgsMapTool::renderComplete()
{
}
bool QgsMapTool::isTransient()
bool QgsMapTool::isTransient() const
{
return false;
return flags() & Transient;
}
bool QgsMapTool::isEditTool()
bool QgsMapTool::isEditTool() const
{
return false;
return flags() & EditTool;
}
QgsMapCanvas* QgsMapTool::canvas()

View File

@ -54,6 +54,22 @@ class GUI_EXPORT QgsMapTool : public QObject
public:
//! Enumeration of flags that adjust the way the map tool operates
//! @note added in QGIS 2.16
enum Flag
{
Transient = 1 << 1, /*!< Indicates that this map tool performs a transient (one-off) operation.
If it does, the tool can be operated once and then a previous map
tool automatically restored. */
EditTool = 1 << 2, /*!< Map tool is an edit tool, which can only be used when layer is editable*/
};
Q_DECLARE_FLAGS( Flags, Flag )
/** Returns the flags for the map tool.
* @note added in QGIS 2.16
*/
virtual Flags flags() const { return Flags(); }
//! virtual destructor
virtual ~QgsMapTool();
@ -87,7 +103,6 @@ class GUI_EXPORT QgsMapTool : public QObject
//! @deprecated since 2.4 - not called anymore - map tools must not directly depend on rendering progress
Q_DECL_DEPRECATED virtual void renderComplete();
/** Use this to associate a QAction to this maptool. Then when the setMapTool
* method of mapcanvas is called the action state will be set to on.
* Usually this will cause e.g. a toolbutton to appear pressed in and
@ -109,13 +124,16 @@ class GUI_EXPORT QgsMapTool : public QObject
/** Check whether this MapTool performs a zoom or pan operation.
* If it does, we will be able to perform the zoom and then
* resume operations with the original / previously used tool.*/
virtual bool isTransient();
* resume operations with the original / previously used tool.
* @deprecated use flags() instead
*/
Q_DECL_DEPRECATED virtual bool isTransient() const;
/** Check whether this MapTool performs an edit operation.
* If it does, we will deactivate it when editing is turned off
* If it does, we will deactivate it when editing is turned off.
* @deprecated use flags() instead
*/
virtual bool isEditTool();
Q_DECL_DEPRECATED virtual bool isEditTool() const;
//! called when set as currently active map tool
virtual void activate();

View File

@ -33,11 +33,7 @@ class GUI_EXPORT QgsMapToolEdit: public QgsMapTool
QgsMapToolEdit( QgsMapCanvas* canvas );
virtual ~QgsMapToolEdit();
/**
* Is this an edit tool?
* @return Of course it is or you would not be inheriting from it.
*/
virtual bool isEditTool() override { return true; }
virtual Flags flags() const { return QgsMapTool::EditTool; }
protected:

View File

@ -32,6 +32,8 @@ class GUI_EXPORT QgsMapToolPan : public QgsMapTool
//! constructor
QgsMapToolPan( QgsMapCanvas* canvas );
virtual Flags flags() const { return QgsMapTool::Transient; }
//! Mouse press event
virtual void canvasPressEvent( QgsMapMouseEvent* e ) override;
@ -41,8 +43,6 @@ class GUI_EXPORT QgsMapToolPan : public QgsMapTool
//! Overridden mouse release event
virtual void canvasReleaseEvent( QgsMapMouseEvent* e ) override;
virtual bool isTransient() override { return true; }
private:
//! Flag to indicate a map canvas drag operation is taking place

View File

@ -35,6 +35,8 @@ class GUI_EXPORT QgsMapToolZoom : public QgsMapTool
~QgsMapToolZoom();
virtual Flags flags() const { return QgsMapTool::Transient; }
//! Overridden mouse move event
virtual void canvasMoveEvent( QgsMapMouseEvent* e ) override;
@ -44,10 +46,6 @@ class GUI_EXPORT QgsMapToolZoom : public QgsMapTool
//! Overridden mouse release event
virtual void canvasReleaseEvent( QgsMapMouseEvent* e ) override;
//! indicates whether we're zooming in or out
virtual bool isTransient() override { return true; }
//! Flag to indicate a map canvas drag operation is taking place
virtual void deactivate() override;
protected: