BsCursor.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #include "BsCursor.h"
  2. #include "BsPlatform.h"
  3. #include "BsException.h"
  4. #include "BsBuiltinResources.h"
  5. #include "BsDebug.h"
  6. namespace BansheeEngine
  7. {
  8. Cursor::Cursor()
  9. :mActiveCursorId(-1), mNextUniqueId((UINT32)CursorType::Count)
  10. {
  11. for(UINT32 i = 0; i < (UINT32)CursorType::Count; i++)
  12. restoreCursorIcon((CursorType)i);
  13. }
  14. void Cursor::setScreenPosition(const Vector2I& screenPos)
  15. {
  16. Platform::setCursorPosition(screenPos);
  17. }
  18. Vector2I Cursor::getScreenPosition()
  19. {
  20. return Platform::getCursorPosition();
  21. }
  22. void Cursor::hide()
  23. {
  24. Platform::hideCursor();
  25. }
  26. void Cursor::show()
  27. {
  28. Platform::showCursor();
  29. }
  30. void Cursor::clipToWindow(const RenderWindow& window)
  31. {
  32. Platform::clipCursorToWindow(window);
  33. }
  34. void Cursor::clipToRect(const Rect2I& screenRect)
  35. {
  36. Platform::clipCursorToRect(screenRect);
  37. }
  38. void Cursor::clipDisable()
  39. {
  40. Platform::clipCursorDisable();
  41. }
  42. void Cursor::setCursor(CursorType type)
  43. {
  44. UINT32 id = (UINT32)type;
  45. if(mActiveCursorId != id)
  46. {
  47. mActiveCursorId = id;
  48. updateCursorImage();
  49. }
  50. }
  51. void Cursor::setCursor(const String& name)
  52. {
  53. auto iterFind = mCustomIconNameToId.find(name);
  54. if(iterFind == mCustomIconNameToId.end())
  55. {
  56. LOGWRN("Cannot find cursor icon with name: " + name);
  57. return;
  58. }
  59. UINT32 id = iterFind->second;
  60. if(mActiveCursorId != id)
  61. {
  62. mActiveCursorId = id;
  63. updateCursorImage();
  64. }
  65. }
  66. void Cursor::setCursorIcon(const String& name, const PixelData& pixelData, const Vector2I& hotSpot)
  67. {
  68. auto iterFind = mCustomIconNameToId.find(name);
  69. if(iterFind != mCustomIconNameToId.end())
  70. {
  71. UINT32 id = iterFind->second;
  72. mCustomIcons[id] = CustomIcon(pixelData, hotSpot);
  73. if(mActiveCursorId == id)
  74. updateCursorImage(); // Refresh active
  75. }
  76. else
  77. {
  78. UINT32 id = mNextUniqueId++;
  79. mCustomIconNameToId[name] = id;
  80. mCustomIcons[id] = CustomIcon(pixelData, hotSpot);
  81. }
  82. }
  83. void Cursor::setCursorIcon(CursorType type, const PixelData& pixelData, const Vector2I& hotSpot)
  84. {
  85. UINT32 id = (UINT32)type;
  86. mCustomIcons[id].pixelData = pixelData;
  87. mCustomIcons[id].hotSpot = hotSpot;
  88. if(mActiveCursorId == id)
  89. updateCursorImage(); // Refresh active
  90. }
  91. void Cursor::clearCursorIcon(const String& name)
  92. {
  93. auto iterFind = mCustomIconNameToId.find(name);
  94. if(iterFind == mCustomIconNameToId.end())
  95. return;
  96. mCustomIcons.erase(iterFind->second);
  97. mCustomIconNameToId.erase(iterFind);
  98. }
  99. void Cursor::clearCursorIcon(CursorType type)
  100. {
  101. restoreCursorIcon(type);
  102. if(mActiveCursorId == (UINT32)type)
  103. updateCursorImage(); // Refresh active
  104. }
  105. void Cursor::restoreCursorIcon(CursorType type)
  106. {
  107. UINT32 id = (UINT32)type;
  108. mCustomIcons[id] = CustomIcon();
  109. switch (type)
  110. {
  111. case CursorType::Arrow:
  112. mCustomIcons[id].pixelData = BuiltinResources::instance().getCursorArrow(mCustomIcons[id].hotSpot);
  113. return;
  114. case CursorType::Wait:
  115. mCustomIcons[id].pixelData = BuiltinResources::instance().getCursorWait(mCustomIcons[id].hotSpot);
  116. return;
  117. case CursorType::IBeam:
  118. mCustomIcons[id].pixelData = BuiltinResources::instance().getCursorIBeam(mCustomIcons[id].hotSpot);
  119. return;
  120. case CursorType::ArrowDrag:
  121. mCustomIcons[id].pixelData = BuiltinResources::instance().getCursorArrowDrag(mCustomIcons[id].hotSpot);
  122. return;
  123. case CursorType::SizeNESW:
  124. mCustomIcons[id].pixelData = BuiltinResources::instance().getCursorSizeNESW(mCustomIcons[id].hotSpot);
  125. return;
  126. case CursorType::SizeNS:
  127. mCustomIcons[id].pixelData = BuiltinResources::instance().getCursorSizeNS(mCustomIcons[id].hotSpot);
  128. return;
  129. case CursorType::SizeNWSE:
  130. mCustomIcons[id].pixelData = BuiltinResources::instance().getCursorSizeNWSE(mCustomIcons[id].hotSpot);
  131. return;
  132. case CursorType::SizeWE:
  133. mCustomIcons[id].pixelData = BuiltinResources::instance().getCursorSizeWE(mCustomIcons[id].hotSpot);
  134. return;
  135. case CursorType::Deny:
  136. mCustomIcons[id].pixelData = BuiltinResources::instance().getCursorDeny(mCustomIcons[id].hotSpot);
  137. return;
  138. case CursorType::ArrowLeftRight:
  139. mCustomIcons[id].pixelData = BuiltinResources::instance().getCursorMoveLeftRight(mCustomIcons[id].hotSpot);
  140. return;
  141. }
  142. BS_EXCEPT(InvalidParametersException, "Invalid cursor type: " + toString((UINT32)type));
  143. }
  144. void Cursor::updateCursorImage()
  145. {
  146. if (mActiveCursorId < 0)
  147. return;
  148. CustomIcon& customIcon = mCustomIcons[mActiveCursorId];
  149. Platform::setCursor(customIcon.pixelData, customIcon.hotSpot);
  150. }
  151. }