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

147 lines
4.5 KiB
Objective-C
Executable File

/**
**
** @RDE_HEADER@
** Simple DropEventManager to manage drop events in SituationMap Map Widget
** $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
#include <Common/referenced.h>
#include <QtCore/QPoint>
class QMimeData;
namespace SituationMap
{
/**
@class DropEventManager drop_event_manager.h
@brief Drop event manager interface class.
@see SituationMap::Map, PBase::PDropHandler
To process drop events the map window has to decide accepting a drop when it gets a drag enter event or not, depending on the type of mime data. Later
when receiving a drop event the dropped data has to be processed. The DropEventManager class provides information of mime data type to decide handling
the type of drop event or not. The function mimeFormatString() should return a uniquely defined string. To handle a special drop event the map will call
the manageDrop function. Both functions have to be implemented in the derived class.
Following example shows how to implement a drop event mamager.
@code
#include <Map/drop_event_manager.h>
class DropEventManager : public SituationMap::DropEventManager
{
public:
DropEventManager() = default;
virtual ~DropEventManager()
{
// delete all dropHandler
for (auto key : m_dropHandlerMap.keys())
{
delete m_dropHandlerMap[key];
m_dropHandlerMap[key] = nullptr;
}
} // ~DropEventManager()
QString mimeFormatString() const { return QLatin1String("DropHandlerPtr"); }
void manageDrop( QPoint windowPos, const QMimeData * mimeData ) override
{
bool ok = false;
qulonglong dropHandlerKey = mimeData->data(mimeFormatString()).toULongLong(&ok);
if (ok)
{
QMap<qulonglong,PBase::PDropHandler*>::iterator dropHandler;
dropHandler = m_dropHandlerMap.find( dropHandlerKey );
if (dropHandler != m_dropHandlerMap.end())
{
(*dropHandler)->doDrop( windowPos.x(), windowPos.y(), mimeData );
}
}
} // manageDrop( const QMimeData * mimeData )
qulonglong add( PBase::PDropHandler * dropHandler )
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// DropEvewntManager get ownership of dropHandler and delete them in dtor.
// See dtor above.
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
qulonglong key = qulonglong(dropHandler);
if (dropHandler)
{
m_dropHandlerMap[key] = dropHandler;
}
return key;
} // add(PBase::PDropHandler * dropHandler)
protected:
QMap<qulonglong,PBase::PDropHandler*> m_dropHandlerMap;
}; // DropEventManager
void installDropEventManager()
{
m_dropEventManager = new DropEventManager();
m_map -> installDropEventManager( m_dropEventManager );
}
@endcode
*/
class DropEventManager : public Referenced
{
public:
DropEventManager() = default;
~DropEventManager() = default;
DropEventManager(const DropEventManager *) = delete;
/*
The function \c mimeFormatString() returns a uniquely defined string to identify type of mime data. The string will be used to call \c QMimeData::hasFormat()
@see QMimeData
*/
virtual QString mimeFormatString() const = 0;
/*
The function \c manageDrop() will be called to process drop events
@param windowPos Mouse cursor from drop event
@param mimeData Data of drop event to process.
*/
virtual void manageDrop(QPoint windowPos, const QMimeData *mimeData) = 0;
}; // DropEventManager
} // namespace SituationMap