| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- #include "BsDragAndDropManager.h"
- #include "CmPlatform.h"
- #include "CmApplication.h"
- using namespace CamelotFramework;
- namespace BansheeEngine
- {
- DragAndDropManager::DragAndDropManager()
- :mIsDragInProgress(false), mDragTypeId(0), mData(nullptr), mCaptureChanged(false), mCaptureActive(0)
- {
- Platform::onMouseCaptureChanged.connect(boost::bind(&DragAndDropManager::mouseCaptureChanged, this));
- Input::instance().onButtonUp.connect(boost::bind(&DragAndDropManager::mouseUp, this, _1));
- }
- void DragAndDropManager::startDrag(CM::HTexture icon, CM::UINT32 typeId, void* data, std::function<void(bool)> dropCallback)
- {
- mIcon = icon;
- mDragTypeId = typeId;
- mData = data;
- mDropCallback = dropCallback;
- mIsDragInProgress = true;
- mCaptureActive.store(false);
- mCaptureChanged.store(false);
- Platform::captureMouse(*gApplication().getPrimaryWindow());
- }
- void DragAndDropManager::update()
- {
- if(!mIsDragInProgress)
- return;
- // This generally happens when window loses focus and capture is lost (e.g. alt+tab)
- int captureActive = mCaptureActive.load();
- if(!captureActive && mCaptureChanged.load())
- {
- endDrag(false);
- }
- }
- void DragAndDropManager::endDrag(bool processed)
- {
- if(mDropCallback != nullptr)
- mDropCallback(processed);
- mDragTypeId = 0;
- mData = nullptr;
- mDropCallback = nullptr;
- mIsDragInProgress = false;
- }
- void DragAndDropManager::mouseCaptureChanged()
- {
- mCaptureActive.fetch_xor(1); // mCaptureActive = !mCaptureActive;
- mCaptureChanged.store(true);
- }
- void DragAndDropManager::mouseUp(const ButtonEvent& event)
- {
- if(!mIsDragInProgress)
- return;
- if(event.isMouse())
- {
- Platform::releaseMouseCapture();
- if(!onDragEnded.empty())
- {
- bool processed = onDragEnded(event);
- endDrag(processed);
- }
- }
- }
- }
|