Files
qt5-legatus-legacy/Lts/Viewer/SituationMap/Rubberbands/event_mouse_navigator.h
T
2026-08-13 18:33:10 +02:00

226 lines
7.7 KiB
Objective-C
Executable File

/**
**
** @RDE_HEADER@
** Event Dispatcher for Qt5 to handle mouse events navigate on map
** $Id$
** $HeadURL$
** $Author$
**
** -----------------------------------------------------------------------------------------------
**
** Hardware-Environment: Intel-PC
** Software-Environment: Windows 7, Qt 5.4. ArcGIS 10.2.5
**
** Language ........: C++ 11
**
** -----------------------------------------------------------------------------------------------
**
** Author ...........: Jörg Turla, SPD G, Tel. 3132
**
** -----------------------------------------------------------------------------------------------
**
** Notes .........:
**
** 24.04.2015, JT : first edition
**
** -----------------------------------------------------------------------------------------------
*/
#pragma once
// Own
#include <Map/situation_map_types.h>
#include "abstract_event_dispatcher.h"
//Esri
#include <arcgis/TaskWatcher.h>
// Qt
#include <QtCore/QList>
// #define SITUATIONMAP_OWN_WHEEL_HANDLING
// Forward:
namespace Esri {
namespace ArcGISRuntime {
class Map;
class IdentifyGraphicsOverlayResult;
} }
namespace SituationMap {
class MapImpl;
}
namespace SituationMap { namespace RB
{
/**
@class EventMouseNavigator event_mouse_navigator.h
@brief Event filter that handles mouse events for general map operation like selecting object, zooming and paning the map window
Implements class \c AbstractEventDispatcher to manage event handling for general map operation like selecting object, zooming and
panning the map window. Monitoring the mouse position can be realized by connecting the \c mouseMovedEvent signal. If the user has
clicked to map objects the signal \c selectionRequest is emitted.
Following events are handled:
| Input-Event | Interface Function | Description |
| :--------------------------------------------- | : ----------------- | : --------------------------------------------------------------------------- |
| Mouse enter | | To show/hide some widgets |
| Mouse leave | | To show/hide some widgets |
| Mouse move without any modifier | | Move Cursor. |
| Mouse move with pressed left button | | Panning of map if more then 3 pixels moved. |
| Mouse move with pressed middle button | | Panning of map. |
| Mouse wheel | | Redirect to \c Esri map for zooming. |
| Left mouse button release | | Emits signal \c selectionRequest with list of map objects at cursor position. |
@see AbstractEventDispatcher, EventDelegater, EventDispatcher
*/
class EventMouseNavigator : public AbstractEventDispatcher
{
Q_OBJECT
public:
/**
@name Construction & Destruction
@{
*/
EventMouseNavigator(const EventMouseNavigator &) = delete;
EventMouseNavigator & operator = (const EventMouseNavigator &) = delete;
EventMouseNavigator( QWidget * getEventsFrom, SituationMap::MapImpl *sitMap );
virtual ~EventMouseNavigator() = default;
/** @} */
inline static void setPickTolerance( int value = 5 ) { _pickTolerance = value; }
inline static int pickTolerance() { return _pickTolerance; }
inline static void setZoomFactorBase(qreal value = 1.002) { if ((value > 1) && (value <= 1.1))_zoomFactorBase = value; }
inline static qreal zoomFactorBase() { return _zoomFactorBase; }
signals:
/**
Will be emitted if the mouse enters the widget.
*/
void enterEvent();
/**
Will be emitted if the mouse leaves the widget.
*/
void leaveEvent();
/**
Will be emitted if the user clicks to map objects with the left mouse button.
*/
void selectionRequest( const QList< SituationMap::UniqueMapId > & idList, const QPointF &viewPortPos );
/**
Will be emitted if the user clicks to the map with the rigth mouse button.
*/
void contextMenuRequest( const QList< SituationMap::UniqueMapId > & idList, const QPointF &viewPortPos );
/**
Signal will be emitted if a mouse move is done.
*/
void mouseMovedEvent( int x, int y );
#ifdef SITUATIONMAP_OWN_WHEEL_HANDLING
/**
Signal will be emitted if the mouse wheel has been rotated
*/
void mouseWheelEvent(qreal factor, const QPointF &cursorPositionMap);
#endif
protected slots:
void onGetPickingResult(const QUuid &taskId, const QList<Esri::ArcGISRuntime::IdentifyGraphicsOverlayResult *> &identifyResults );
protected:
QList<UniqueMapId> mapToUniqueMapId( const QList<Esri::ArcGISRuntime::IdentifyGraphicsOverlayResult*> & identifyResults);
bool eventFilter(QObject*, QEvent*) override;
enum class RequestType
{
None,
Selection,
Picking
}; // RequestType
enum SelectionMode
{
NoSelection = 0x00,
SingleSelection = 0x01,
MultiSelection = 0x02,
FrameSelection = 0x04
}; // SelectionMode
Q_DECLARE_FLAGS(SelectionModes,SelectionMode)
SituationMap::MapImpl *_sitMap;
QPoint _mouseMoveRefPos;
QCursor _restoreMouseCursor;
bool _cursorChanged;
static int _pickTolerance;
QPointF _viewPortPos;
SelectionModes _selectionMode;
RequestType _pendingRequest;
bool _mousePanningActive;
bool _mousePanningActiveForCenterMapMidButton;
#ifdef SITUATIONMAP_OWN_WHEEL_HANDLING
Esri::ArcGISRuntime::TaskWatcher _mouseZoomTaskWatcher;
#endif
Qt::MouseButton _pressedMouseButton;
static qreal _zoomFactorBase; // Base value to calculate zoom factor values from QWheelEvent
Esri::ArcGISRuntime::TaskWatcher _pickingTask;
/**
test for already running picking task.
*/
bool checkRunningPickingTask();
/**
Find out which map objects are at given mouse position and emits the signal selectionRequest
*/
void selectionRequested(const QPointF & );
/**
Find out which map objects are at given mouse position and emits the signal contextMenuRequest
*/
void pickRequested( const QPointF & );
/**
Helper function to get all map objects at a given position of all GraphicsOverlays
@param pos position in window coordinates
*/
void requestPicking(const QPointF &pos);
}; /* EventMouseNavigator */
} } /* namespace SituationMap::RB */