Files
qt5-legatus-legacy/Lts/Common/LtsWidgets/lts_drop_handler.h
T
2026-08-13 18:33:10 +02:00

142 lines
4.9 KiB
Objective-C
Executable File

/**
**
** @RDE_HEADER@
** Virtual base class of a simple drop handler.
** $Id$
** $HeadURL$
** $Author$
**
** -----------------------------------------------------------------------------------------------
**
** Hardware-Environment: Intel-PC
** Software-Environment: Windows 7, Linux, Qt 5.4. ArcGIS 10.2.5
**
** Language ........: C++ 11
**
** -----------------------------------------------------------------------------------------------
**
** Author ...........: Jörg Turla, SPD G, Tel. 3132
**
** -----------------------------------------------------------------------------------------------
**
** Notes .........:
**
** 18.12.2015, JT : First edition for use with Qt5
**
** -----------------------------------------------------------------------------------------------
*/
#pragma once
class QMimeData;
namespace LtsWidgets
{
/**
@class LtsDropHandler pdrophandler.h
@brief Interface class to handle drop events of special mime data type.
@see SituationMap::Map, SituationMap::DropEventManager
The LtsDropHandler class is an interface class to handle drop event for one type of mime data. It is used from DropEventManager to process drop events.
The DropEventManager will call the doDrop function to process events. The doDrop fuction has to be implemented in derived class.
Following example shows how to implement a drop handler.
@code
#include <pwidgets/pdrophandler.h>
class DropCreatePolyLine : public LtsWidgets::LtsDropHandler
{
PlanEditor * m_planEditor;
PlanEditor::InternalData * m_planEditorInternal;
bool m_smooth;
public:
DropCreatePolyLine( PlanEditor * planEditor
, PlanEditor::InternalData * planEditorInternal
, bool smooth = false )
: LtsWidgets::LtsDropHandler()
, m_planEditor(planEditor)
, m_planEditorInternal(planEditorInternal)
, m_smooth(smooth) {;}
virtual ~DropCreatePolyLine() = default;
void doDrop( int x, int y, const QMimeData * mimeData = nullptr) const override;
}; // DropCreatePolyLine
void PlanEditor::installLineDropHandler( LtsWidgets::LtsDragIcon * dragIcon )
{
qulonglong key = m_dropEventManager->add(new DropCreatePolyLine(this,m_internal));
dragIcon->setDropHandlerKey( key );
} // PlanEditor::installLineDropHandler( LtsWidgets::LtsDragIcon * dragIcon )
void DropCreatePolyLine::doDrop( int x, int y, const QMimeData * mimeData ) const
{
SituationMap::Map * map;
SituationMap::RB::RubberbandMultiPointFeature * rubberband;
SituationMap::RB::RubberbandFactory & rbFactory;
map = m_planEditorInternal->m_map;
rbFactory = map->rubberbandFactory();
if (m_smooth) rubberband = rbFactory.create<SituationMap::RB::RubberbandSmoothLine>();
else rubberband = rbFactory.create<SituationMap::RB::RubberbandMultiPointFeature>();
if (rubberband != nullptr)
{
rubberband -> setAutoDelete( true );
rubberband -> enableClosed( false );
uint dx = map->width() * 0.25;
uint dy = map->height() * 0.25;
QVector<QPointF> lineCoordinates;
lineCoordinates += map->viewPortWindowPointToGeoCoordinate(QPoint(x-dx,y-dy));
lineCoordinates += map->viewPortWindowPointToGeoCoordinate(QPoint(x+dx,y+dy));
rubberband->setCoordinateVector( lineCoordinates );
QObject::connect( rubberband , &SituationMap::RB::Rubberband::apply
, m_planEditor, &PlanEditor::onPolylineCreate );
QObject::connect( rubberband , &SituationMap::RB::Rubberband::abort
, m_planEditor, &PlanEditor::onRubberbandAbort );
} // DropCreatePolyLine::doDrop( int x, int y )
} // DropCreatePolyLine::doDrop( int x, int y ) const
@endcode
*/
class LtsDropHandler
{
public:
LtsDropHandler() = default;
virtual ~LtsDropHandler() = default;
LtsDropHandler( const LtsDropHandler & ) = delete;
LtsDropHandler & operator = ( const LtsDropHandler & ) = delete;
/**
Function to process drop events.
@param x x coordinate of cursor position referred to widget pixel coordinates.
@param y y coordinate of cursor position referred to widget pixel coordinates.
@param mimeData Pointer to data to be dropped.
*/
virtual void doDrop( int x, int y, const QMimeData * mimeData ) const = 0;
}; // class LtsDropHandler
} // namespace LtsWidgets