axmol/extensions/fairygui/DragDropManager.cpp

85 lines
2.0 KiB
C++

#include "DragDropManager.h"
#include "UIObjectFactory.h"
#include "GRoot.h"
NS_FGUI_BEGIN
USING_NS_AX;
DragDropManager* DragDropManager::_inst = nullptr;
DragDropManager::DragDropManager() :
_agent(nullptr)
{
_agent = (GLoader*)UIObjectFactory::newObject(ObjectType::LOADER);
_agent->retain();
_agent->setTouchable(false);
_agent->setDraggable(true);
_agent->setSize(100, 100);
_agent->setPivot(0.5f, 0.5f, true);
_agent->setAlign(TextHAlignment::CENTER);
_agent->setVerticalAlign(TextVAlignment::CENTER);
_agent->setSortingOrder(INT_MAX);
_agent->addEventListener(UIEventType::DragEnd, CC_CALLBACK_1(DragDropManager::onDragEnd, this));
}
DragDropManager::~DragDropManager()
{
CC_SAFE_RELEASE(_agent);
}
DragDropManager* DragDropManager::getInstance()
{
if (_inst == nullptr)
_inst = new DragDropManager();
return _inst;
}
void DragDropManager::startDrag(const std::string & icon, const Value& sourceData, int touchPointID)
{
if (_agent->getParent() != nullptr)
return;
_sourceData = sourceData;
_agent->setURL(icon);
UIRoot->addChild(_agent);
Vec2 pt = UIRoot->globalToLocal(UIRoot->getTouchPosition(touchPointID));
_agent->setPosition(pt.x, pt.y);
_agent->startDrag(touchPointID);
}
void DragDropManager::cancel()
{
if (_agent->getParent() != nullptr)
{
_agent->stopDrag();
UIRoot->removeChild(_agent);
_sourceData = Value::Null;
}
}
void DragDropManager::onDragEnd(EventContext * context)
{
if (_agent->getParent() == nullptr) //cancelled
return;
UIRoot->removeChild(_agent);
GObject* obj = UIRoot->getTouchTarget();
while (obj != nullptr)
{
if (dynamic_cast<GComponent*>(obj))
{
if (obj->hasEventListener(UIEventType::Drop))
{
//obj->requestFocus();
obj->dispatchEvent(UIEventType::Drop, nullptr, _sourceData);
return;
}
}
obj = obj->getParent();
}
}
NS_FGUI_END