/** ** ** @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 #include #include #include #include #include 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 _scene; QPointer _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 */