BsDragAndDropManager.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "BsDragAndDropManager.h"
  2. #include "CmPlatform.h"
  3. #include "CmApplication.h"
  4. using namespace CamelotFramework;
  5. namespace BansheeEngine
  6. {
  7. DragAndDropManager::DragAndDropManager()
  8. :mIsDragInProgress(false), mDragTypeId(0), mData(nullptr), mCaptureChanged(false), mCaptureActive(0)
  9. {
  10. Platform::onMouseCaptureChanged.connect(boost::bind(&DragAndDropManager::mouseCaptureChanged, this));
  11. Input::instance().onButtonUp.connect(boost::bind(&DragAndDropManager::mouseUp, this, _1));
  12. }
  13. void DragAndDropManager::startDrag(CM::HTexture icon, CM::UINT32 typeId, void* data, std::function<void(bool)> dropCallback)
  14. {
  15. mIcon = icon;
  16. mDragTypeId = typeId;
  17. mData = data;
  18. mDropCallback = dropCallback;
  19. mIsDragInProgress = true;
  20. mCaptureActive.store(false);
  21. mCaptureChanged.store(false);
  22. Platform::captureMouse(*gApplication().getPrimaryWindow());
  23. }
  24. void DragAndDropManager::update()
  25. {
  26. if(!mIsDragInProgress)
  27. return;
  28. // This generally happens when window loses focus and capture is lost (e.g. alt+tab)
  29. int captureActive = mCaptureActive.load();
  30. if(!captureActive && mCaptureChanged.load())
  31. {
  32. endDrag(false);
  33. }
  34. }
  35. void DragAndDropManager::endDrag(bool processed)
  36. {
  37. if(mDropCallback != nullptr)
  38. mDropCallback(processed);
  39. mDragTypeId = 0;
  40. mData = nullptr;
  41. mDropCallback = nullptr;
  42. mIsDragInProgress = false;
  43. }
  44. void DragAndDropManager::mouseCaptureChanged()
  45. {
  46. mCaptureActive.fetch_xor(1); // mCaptureActive = !mCaptureActive;
  47. mCaptureChanged.store(true);
  48. }
  49. void DragAndDropManager::mouseUp(const ButtonEvent& event)
  50. {
  51. if(!mIsDragInProgress)
  52. return;
  53. if(event.isMouse())
  54. {
  55. Platform::releaseMouseCapture();
  56. if(!onDragEnded.empty())
  57. {
  58. bool processed = onDragEnded(event);
  59. endDrag(processed);
  60. }
  61. }
  62. }
  63. }