Initial commit
This commit is contained in:
commit
b7d90b9afe
16245 files changed
+3396666
No files matched your search
+155
@@ -0,0 +1,155 @@
|
||||
|
||||
/**
|
||||
**
|
||||
** @RDE_HEADER@
|
||||
** Implementation of base class for rubberband handles
|
||||
** $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
|
||||
**
|
||||
** -----------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "rubberband_drawable.h"
|
||||
|
||||
|
||||
// ESRI
|
||||
#include <arcgis/Map.h>
|
||||
|
||||
|
||||
|
||||
namespace SituationMap { namespace RB
|
||||
{
|
||||
|
||||
Esri::ArcGISRuntime::Point convert(const QPointF &point, const Esri::ArcGISRuntime::SpatialReference& spatialReference)
|
||||
{
|
||||
return Esri::ArcGISRuntime::Point(point.x(), point.y(), spatialReference);
|
||||
} // convert
|
||||
|
||||
|
||||
RubberbandDrawable::RubberbandDrawable( QGraphicsView * view )
|
||||
: _scene((view) ? view->scene() : nullptr)
|
||||
, _mapView()
|
||||
, _isVisible(true)
|
||||
, _lineWidth(1)
|
||||
, _zBufferValue((unsigned int) ZBufferPlane::Drawables)
|
||||
, _logger(getLogger("RubberbandDrawable"))
|
||||
|
||||
{
|
||||
doConnecting();
|
||||
} /* RubberbandDrawable::RubberbandDrawable */
|
||||
|
||||
RubberbandDrawable::RubberbandDrawable( Esri::ArcGISRuntime::MapGraphicsView * mapView )
|
||||
: _scene(mapView->scene())
|
||||
, _mapView(mapView)
|
||||
, _isVisible(true)
|
||||
, _lineWidth(1)
|
||||
, _zBufferValue((unsigned int) ZBufferPlane::Drawables)
|
||||
, _logger(getLogger("RubberbandDrawable"))
|
||||
|
||||
{
|
||||
doConnecting();
|
||||
} /* RubberbandDrawable::RubberbandDrawable */
|
||||
|
||||
RubberbandDrawable::RubberbandDrawable( Esri::ArcGISRuntime::MapGraphicsView * mapView, QGraphicsScene * scene)
|
||||
: _scene(scene)
|
||||
, _mapView(mapView)
|
||||
, _isVisible(true)
|
||||
, _lineWidth(1)
|
||||
, _zBufferValue((unsigned int) ZBufferPlane::Drawables)
|
||||
, _logger(getLogger("RubberbandDrawable"))
|
||||
|
||||
{
|
||||
doConnecting();
|
||||
} /* RubberbandDrawable::RubberbandDrawable */
|
||||
|
||||
|
||||
#ifdef ADJUST_COORDINATES_EVERY_PAINT_EVENT
|
||||
bool RubberbandDrawable::eventFilter( QObject*, QEvent * e )
|
||||
{
|
||||
if (e)
|
||||
{
|
||||
if (e->type() == QEvent::Paint)
|
||||
{
|
||||
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
* Sometimes the signals extentChanges and rectChanged of Esri Map Widget are not emitted. In this case
|
||||
* the position update of handles and drawabled fails and they are drawn at wrong positions on map. As
|
||||
* workaround updates coordinates at every paint event.
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
|
||||
DEBUG_LOG(_logger) << LOGFUNCTION << " paint event";
|
||||
onDo_adjustCoordinates();
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} /* RubberbandDrawable::eventFilter */
|
||||
#endif
|
||||
|
||||
void RubberbandDrawable::doConnecting()
|
||||
{
|
||||
if (nullptr == _mapView) return;
|
||||
|
||||
#ifdef ADJUST_COORDINATES_EVERY_PAINT_EVENT
|
||||
_view -> installEventFilter( this );
|
||||
#endif
|
||||
|
||||
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
* It is really important to specify the connnection type as following. Because the onDo_adjustCoordinates
|
||||
* should be call as soon as possible to get smooth changes of map. The connection type is DirectConnnection here.
|
||||
* The rectChanged signal is some times emitted, when the calculation of screen coordinates to map coordinates
|
||||
* and vice versa has not been updated to the new map window size. In this case all calculations provides wrong
|
||||
* results. Using the connection type QueuedConnection defers the call of onDo_adjustWindow.
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
|
||||
// Check Quartz
|
||||
connect( _mapView.data(), &Esri::ArcGISRuntime::MapGraphicsView::viewpointChanged,
|
||||
this, &RubberbandDrawable::onDo_adjustCoordinates, Qt::ConnectionType::DirectConnection );
|
||||
connect( _mapView.data(), &Esri::ArcGISRuntime::MapGraphicsView::rectChanged ,
|
||||
this, &RubberbandDrawable::onDo_adjustWindow , Qt::ConnectionType::QueuedConnection );
|
||||
|
||||
} /* RubberbandDrawable::doConnecting */
|
||||
|
||||
|
||||
void RubberbandDrawable::onDo_adjustCoordinates()
|
||||
{
|
||||
adjustCoordinates();
|
||||
forceUpdateViewWidget();
|
||||
} /* RubberbandDrawable::onDo_adjustCoordinates */
|
||||
|
||||
|
||||
void RubberbandDrawable::onDo_adjustWindow( const QRectF &r )
|
||||
{
|
||||
adjustWindow(r);
|
||||
forceUpdateViewWidget();
|
||||
} /* RubberbandDrawable::onDo_adjustWindow */
|
||||
|
||||
|
||||
void RubberbandDrawable::makeLineStyle( bool dottedLine, QPen & lineStyle )
|
||||
{
|
||||
lineStyle.setColor( _drawColor );
|
||||
lineStyle.setWidth( int(_lineWidth) );
|
||||
|
||||
if (dottedLine) lineStyle.setStyle( Qt::DashDotLine );
|
||||
else lineStyle.setStyle( Qt::SolidLine );
|
||||
} /* DrawablePainterPathItem::makeLineStyle */
|
||||
|
||||
|
||||
RubberbandDrawable::~RubberbandDrawable() { if (_mapView) _mapView->removeEventFilter(this); }
|
||||
|
||||
|
||||
} } /* namespace SituationMap::RB */
|
||||
Reference in new issue
Block a user