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

168 lines
4.7 KiB
C++
Executable File

/**
**
** @RDE_HEADER@
** Implementation of class RubberbandHandleProxy to forward adjust signals from view
** $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 .........:
**
** 10.07.2015, JT : First edition for use with Qt5
**
** -----------------------------------------------------------------------------------------------
*/
#include "rubberband_handle_proxy.h"
#include <MathUtils/math_const.h>
#include <QtCore/QRectF>
#define BUG_iOSQz_000005
namespace SituationMap { namespace RB
{
void RubberbandHandleProxy::init( QWidget * widget )
{
zBufferPlane( ZBufferPlane::Widget );
_widgetsProxy = new QGraphicsProxyWidget();
_widgetsProxy -> setWidget( widget );
_widgetsProxy -> setZValue( _zBufferValue );
#ifdef BUG_iOSQz_000005
// Bug iOSQz-000005 'QGraphicsProxyWidget will crash'
// Adding a widget will let the application crash
// Workaround: 'proxy->setOpacity(0.99);'
_widgetsProxy->setOpacity(0.99);
#endif
_scene->addItem( _widgetsProxy );
} /* RubberbandHandleProxy::init */
RubberbandHandleProxy::RubberbandHandleProxy( QGraphicsView * view, QWidget * widget )
: RubberbandHandle(view)
, _coordinate()
, _sceneOffset(0, 0)
, _rotateSceneOffset(true)
, _restoreView(view)
{
init( widget );
} /* RubberbandHandleProxy::RubberbandHandleProxy */
RubberbandHandleProxy::RubberbandHandleProxy( Esri::ArcGISRuntime::MapGraphicsView * view, QWidget * widget )
: RubberbandHandle(view)
, _coordinate()
, _sceneOffset(0, 0)
, _rotateSceneOffset(true)
, _restoreView(view)
{
init( widget );
} /* RubberbandHandleProxy::RubberbandHandleProxy */
RubberbandHandleProxy::RubberbandHandleProxy( Esri::ArcGISRuntime::MapGraphicsView * view, QGraphicsScene * scene, QWidget * widget )
: RubberbandHandle(view, scene)
, _coordinate()
, _sceneOffset(0, 0)
, _rotateSceneOffset(true)
, _restoreView(view)
{
init( widget );
} /* RubberbandHandleProxy::RubberbandHandleProxy */
RubberbandHandleProxy::~RubberbandHandleProxy()
{
if (_scene)
{
if (_widgetsProxy)
{
_widgetsProxy->setWidget(nullptr);
_scene->removeItem(_widgetsProxy);
delete _widgetsProxy;
}
}
_widgetsProxy = nullptr;
if (_restoreView && _restoreView->viewport())
_restoreView->viewport()->setCursor(_restoreCursor); // workaround Qt bug. remove when fixed
} /* RubberbandHandleProxy::~RubberbandHandleProxy */
QPointF RubberbandHandleProxy::getRotatedSceneOffset() const
{
if ((_mapView) && (_rotateSceneOffset))
{
auto rotate = [](const QPointF & p, qreal sinA, qreal cosA) -> QPointF { return QPointF(p.x()*cosA+p.y()*sinA,p.y()*cosA-p.x()*sinA); };
qreal mapRotatePhi = _mapView->mapRotation() * MathConst::pi / 180.0;
qreal sinMap = sin(mapRotatePhi);
qreal cosMap = cos(mapRotatePhi);
return rotate( _sceneOffset, sinMap, cosMap );
}
else return _sceneOffset;
} /* RubberbandHandleProxy::getRotatedSceneOffset */
void RubberbandHandleProxy::setPos(const QPointF & pos)
{
_coordinate.updateSceneCoordinate( _mapView, pos );
if (_widgetsProxy)
{
_widgetsProxy -> setPos(pos+getRotatedSceneOffset());
_widgetsProxy -> setZValue( _zBufferValue );
}
} /* RubberbandHandleProxy::setPos */
bool RubberbandHandleProxy::isPositionInside( const QPointF & scenePosition ) const
{
const QRectF & bbox = _widgetsProxy->windowFrameGeometry();
return bbox.contains(scenePosition);
} /* RubberbandHandleProxy::isPositionInside */
void RubberbandHandleProxy::adjustCoordinates()
{
const QPointF & scenePosition = _coordinate.mapToScene(_mapView);
if (_widgetsProxy)
{
_widgetsProxy -> setZValue( _zBufferValue );
_widgetsProxy -> setPos(scenePosition+getRotatedSceneOffset());
}
emit adjusted();
} /* RubberbandHandleProxy::adjustCoordinates */
void RubberbandHandleProxy::adjustWindow( const QRectF & )
{
onDo_adjustCoordinates();
} /* RubberbandHandleProxy::adjustWindow */
} } /* namespace SituationMap::RB */