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

213 lines
6.8 KiB
Objective-C
Executable File

/**
**
** @RDE_HEADER@
** Definition of base class for rubberband drawing objects
** $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 .........:
**
** 27.03.2015, JT : First edition for use with Qt5
**
** -----------------------------------------------------------------------------------------------
*/
#pragma once
#include <QtCore/QObject>
#include <QtGui/QColor>
#include <arcgis/MapGraphicsView.h>
#include <arcgis/Point.h>
#include <Common/referenced.h>
#include <Common/situation_map_logging.h>
class QGraphicsScene;
namespace SituationMap { namespace RB
{
Esri::ArcGISRuntime::Point convert(const QPointF &point, const Esri::ArcGISRuntime::SpatialReference& spatialReference);
/**
@class RubberbandDrawable rubberband_drawable.h
@brief Base class of all rubberband drawables and handles for rubberband internal use.
*/
class RubberbandDrawable : public QObject, public SituationMap::Referenced
{
Q_OBJECT
public:
enum class ZBufferPlane
{
FrameHandle = 10,
Drawables = 20,
LineHandle = 30,
ArrowSymbol = 31,
PointHandle = 40,
Widget = 100
}; /* InputMethode */
/**
Manages scene and map coordinates.
*/
struct RubberbandCoordinate
{
QPointF _sceneCoordinate;
Esri::ArcGISRuntime::Point _mapCoordinate;
RubberbandCoordinate()
{}
explicit RubberbandCoordinate( const QPointF & sceneCoordinate)
{
updateSceneCoordinate( sceneCoordinate );
} /* RubberbandCoordinate */
explicit RubberbandCoordinate( Esri::ArcGISRuntime::MapGraphicsView * mapView, const QPointF & sceneCoordinate)
{
updateSceneCoordinate( mapView, sceneCoordinate );
} /* RubberbandCoordinate */
explicit RubberbandCoordinate( Esri::ArcGISRuntime::MapGraphicsView * mapView, const Esri::ArcGISRuntime::Point & mapCoordinate)
: _mapCoordinate(mapCoordinate)
{
mapToScene( mapView );
} /* RubberbandCoordinate */
inline QPointF mapToScene(Esri::ArcGISRuntime::MapGraphicsView * mapView)
{
if (!_mapCoordinate.isValid())
return QPointF();
const QPointF pixelCoordinate = mapView->locationToScreen(_mapCoordinate);
_sceneCoordinate = mapView->mapToScene( pixelCoordinate.x(), pixelCoordinate.y() );
return _sceneCoordinate;
} /* QPointF mapToScene(Esri::ArcGISRuntime::MapGraphicsView * mapView) */
inline void updateSceneCoordinate( Esri::ArcGISRuntime::MapGraphicsView * mapView, const QPointF & sceneCoordinate)
{
if (mapView)
{
_sceneCoordinate = sceneCoordinate;
QPoint pixelCoordinate = mapView->mapFromScene(sceneCoordinate);
_mapCoordinate = mapView->screenToLocation( pixelCoordinate.x(), pixelCoordinate.y() );
}
else updateSceneCoordinate( sceneCoordinate );
} /* void updateSceneCoordinate( Esri::ArcGISRuntime::MapGraphicsView * mapView, const QPointF & sceneCoordinate) */
inline void updateSceneCoordinate( const QPointF & sceneCoordinate )
{
_sceneCoordinate = sceneCoordinate;
_mapCoordinate = Esri::ArcGISRuntime::Point();
} /* void updateSceneCoordinate( const QPointF & sceneCoordinate ) */
bool isNull() const
{
return _sceneCoordinate.isNull();
}
}; /* RubberbandCoordinate */
/**
@name Construction & Destruction
@{
*/
explicit RubberbandDrawable( QGraphicsView *view );
explicit RubberbandDrawable( Esri::ArcGISRuntime::MapGraphicsView * );
explicit RubberbandDrawable( Esri::ArcGISRuntime::MapGraphicsView *, QGraphicsScene * );
~RubberbandDrawable();
/** @} */
inline bool isVisible() const { return _isVisible; }
inline void setVisibility(bool on = true) { _isVisible = on; updateGraphic(); }
inline void setDrawColor (const QColor & col) { _drawColor = col; updateGraphic(); }
inline void setFillColor (const QColor & col) { _fillColor = col; updateGraphic(); }
inline void setLineWidth(unsigned int width) { _lineWidth = width; updateGraphic(); }
inline void zBufferPlane( ZBufferPlane zPlane ) { _zBufferValue = (unsigned int) zPlane; }
inline void setZValue(qreal zValue) { _zValue = zValue; updateGraphic(); }
inline qreal zValue() const { return _zValue; }
protected:
QPointer<QGraphicsScene> _scene;
QPointer<Esri::ArcGISRuntime::MapGraphicsView> _mapView;
bool _isVisible;
QColor _drawColor;
QColor _fillColor;
unsigned int _lineWidth;
qreal _zBufferValue;
qreal _zValue{0}; // combine _zBufferValue and _zValue???
LOGGER_T _logger;
#ifdef ADJUST_COORDINATES_EVERY_PAINT_EVENT
bool eventFilter(QObject*, QEvent*) override;
#endif
virtual void updateGraphic() = 0;
void makeLineStyle( bool dottedLine, QPen & lineStyle );
inline void forceUpdateViewWidget() { _mapView->viewport()->update(); }
virtual void adjustCoordinates() = 0;
virtual void adjustWindow( const QRectF& ) = 0;
QColor transparentFillColor() const
{
QColor fillColor(_fillColor);
if (fillColor.alphaF() > 0.85)
{
fillColor.setAlphaF( fillColor.alphaF()*0.5 );
}
return fillColor;
} // QColor transparentFillColor()
protected slots:
void onDo_adjustCoordinates();
void onDo_adjustWindow(const QRectF & );
private:
void doConnecting();
}; /* RubberbandDrawable */
} } /* namespace SituationMap::RB */