RadialMenu.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*
  2. * RadialMenu.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "RadialMenu.h"
  12. #include "Images.h"
  13. #include "TextControls.h"
  14. #include "../gui/CGuiHandler.h"
  15. #include "../gui/WindowHandler.h"
  16. #include "../render/IImage.h"
  17. RadialMenuItem::RadialMenuItem(const std::string & imageName, const std::string & hoverText, const std::function<void()> & callback)
  18. : callback(callback)
  19. , hoverText(hoverText)
  20. {
  21. OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
  22. image = IImage::createFromFile("radialMenu/" + imageName, EImageBlitMode::COLORKEY);
  23. picture = std::make_shared<CPicture>(image, Point(0, 0));
  24. pos = picture->pos;
  25. }
  26. bool RadialMenuItem::isInside(const Point & position)
  27. {
  28. Point localPosition = position - pos.topLeft();
  29. return !image->isTransparent(localPosition);
  30. }
  31. RadialMenu::RadialMenu(const Point & positionToCenter, const std::vector<RadialMenuConfig> & menuConfig)
  32. {
  33. OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
  34. pos += positionToCenter;
  35. addItem(Point(0,0), "itemEmpty", "", [](){});
  36. Point itemSize = items.back()->pos.dimensions();
  37. moveBy(-itemSize / 2);
  38. for (auto const & item : menuConfig)
  39. addItem(item.itemPosition, item.imageName, item.hoverText, item.callback);
  40. statusBar = CGStatusBar::create(-80, -100, "radialMenu/statusBar");
  41. for(const auto & item : items)
  42. pos = pos.include(item->pos);
  43. fitToScreen(10);
  44. addUsedEvents(GESTURE);
  45. }
  46. void RadialMenu::addItem(const Point & offset, const std::string & path, const std::string & hoverText, const std::function<void()>& callback )
  47. {
  48. auto item = std::make_shared<RadialMenuItem>(path, hoverText, callback);
  49. item->moveBy(offset);
  50. items.push_back(item);
  51. }
  52. void RadialMenu::gesturePanning(const Point & initialPosition, const Point & currentPosition, const Point & lastUpdateDistance)
  53. {
  54. }
  55. void RadialMenu::gesture(bool on, const Point & initialPosition, const Point & finalPosition)
  56. {
  57. if (!on)
  58. {
  59. // we need to close this window first so if action spawns a new window it won't be closed instead
  60. GH.windows().popWindows(1);
  61. for(const auto & item : items)
  62. {
  63. if (item->isInside(finalPosition))
  64. {
  65. item->callback();
  66. break;
  67. }
  68. }
  69. }
  70. }