/* * RadialMenu.h, part of VCMI engine * * Authors: listed in file AUTHORS in main folder * * License: GNU General Public License v2.0 or later * Full text of license available in license.txt file, in main folder * */ #pragma once #include "../gui/CIntObject.h" class IImage; class CGarrisonInt; class CGarrisonSlot; class CGStatusBar; struct RadialMenuConfig { static constexpr Point ITEM_NW = Point(-40, -70); static constexpr Point ITEM_NE = Point(+40, -70); static constexpr Point ITEM_WW = Point(-80, 0); static constexpr Point ITEM_EE = Point(+80, 0); static constexpr Point ITEM_SW = Point(-40, +70); static constexpr Point ITEM_SE = Point(+40, +70); static constexpr Point ITEM_ALT_NN = Point(0, -80); static constexpr Point ITEM_ALT_SS = Point(0, +80); static constexpr Point ITEM_ALT_NW = Point(-70, -40); static constexpr Point ITEM_ALT_SW = Point(-70, +40); static constexpr Point ITEM_ALT_NE = Point(+70, -40); static constexpr Point ITEM_ALT_SE = Point(+70, +40); Point itemPosition; bool enabled; std::string imageName; std::string hoverText; std::function callback; }; class RadialMenuItem : public CIntObject { friend class RadialMenu; std::shared_ptr iconImage; std::shared_ptr selectedImage; std::shared_ptr inactiveImage; std::function callback; std::string hoverText; public: RadialMenuItem(const std::string & imageName, const std::string & hoverText, const std::function & callback, bool alternativeLayout); void setSelected(bool selected); }; class RadialMenu : public CIntObject { std::vector> items; std::shared_ptr statusBar; std::shared_ptr selectedItem; Point centerPosition; void addItem(const Point & offset, bool enabled, const std::string & path, const std::string & hoverText, const std::function & callback); std::shared_ptr findNearestItem(const Point & cursorPosition) const; bool alternativeLayout; public: RadialMenu(const Point & positionToCenter, const std::vector & menuConfig, bool alternativeLayout = false); void gesturePanning(const Point & initialPosition, const Point & currentPosition, const Point & lastUpdateDistance) override; void gesture(bool on, const Point & initialPosition, const Point & finalPosition) override; };