diff --git a/Mods/vcmi/Data/radialMenu/heroMove.png b/Mods/vcmi/Data/radialMenu/heroMove.png index 30fa00ce0..eca9a22e8 100644 Binary files a/Mods/vcmi/Data/radialMenu/heroMove.png and b/Mods/vcmi/Data/radialMenu/heroMove.png differ diff --git a/Mods/vcmi/Data/radialMenu/heroSwap.png b/Mods/vcmi/Data/radialMenu/heroSwap.png index 5536b94ab..e1fc20bf0 100644 Binary files a/Mods/vcmi/Data/radialMenu/heroSwap.png and b/Mods/vcmi/Data/radialMenu/heroSwap.png differ diff --git a/Mods/vcmi/Data/radialMenu/itemEmpty.png b/Mods/vcmi/Data/radialMenu/itemEmpty.png index 9d3ee0870..731660f73 100644 Binary files a/Mods/vcmi/Data/radialMenu/itemEmpty.png and b/Mods/vcmi/Data/radialMenu/itemEmpty.png differ diff --git a/Mods/vcmi/Data/radialMenu/itemInactive.png b/Mods/vcmi/Data/radialMenu/itemInactive.png new file mode 100644 index 000000000..90dbde569 Binary files /dev/null and b/Mods/vcmi/Data/radialMenu/itemInactive.png differ diff --git a/Mods/vcmi/Data/radialMenu/stackInfo.png b/Mods/vcmi/Data/radialMenu/stackInfo.png index 32396d314..9a7a72620 100644 Binary files a/Mods/vcmi/Data/radialMenu/stackInfo.png and b/Mods/vcmi/Data/radialMenu/stackInfo.png differ diff --git a/Mods/vcmi/Data/radialMenu/stackMerge.png b/Mods/vcmi/Data/radialMenu/stackMerge.png index 795e73e65..b14628f4f 100644 Binary files a/Mods/vcmi/Data/radialMenu/stackMerge.png and b/Mods/vcmi/Data/radialMenu/stackMerge.png differ diff --git a/Mods/vcmi/Data/radialMenu/stackSplitDialog.png b/Mods/vcmi/Data/radialMenu/stackSplitDialog.png index 139e1fc2b..01667f687 100644 Binary files a/Mods/vcmi/Data/radialMenu/stackSplitDialog.png and b/Mods/vcmi/Data/radialMenu/stackSplitDialog.png differ diff --git a/Mods/vcmi/Data/radialMenu/stackSplitEqual.png b/Mods/vcmi/Data/radialMenu/stackSplitEqual.png index 7cde04a11..b9582f549 100644 Binary files a/Mods/vcmi/Data/radialMenu/stackSplitEqual.png and b/Mods/vcmi/Data/radialMenu/stackSplitEqual.png differ diff --git a/Mods/vcmi/Data/radialMenu/stackSplitOne.png b/Mods/vcmi/Data/radialMenu/stackSplitOne.png index dbcfe1390..a1945631a 100644 Binary files a/Mods/vcmi/Data/radialMenu/stackSplitOne.png and b/Mods/vcmi/Data/radialMenu/stackSplitOne.png differ diff --git a/client/widgets/RadialMenu.cpp b/client/widgets/RadialMenu.cpp index 217e523ea..04f798a56 100644 --- a/client/widgets/RadialMenu.cpp +++ b/client/widgets/RadialMenu.cpp @@ -23,9 +23,19 @@ RadialMenuItem::RadialMenuItem(const std::string & imageName, const std::string { OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; - image = IImage::createFromFile("radialMenu/" + imageName, EImageBlitMode::COLORKEY); - picture = std::make_shared(image, Point(0, 0)); - pos = picture->pos; + inactiveImage = std::make_shared("radialMenu/itemInactive", Point(0, 0)); + selectedImage = std::make_shared("radialMenu/itemEmpty", Point(0, 0)); + + iconImage = std::make_shared("radialMenu/" + imageName, Point(0, 0)); + + pos = selectedImage->pos; + selectedImage->setEnabled(false); +} + +void RadialMenuItem::setSelected(bool selected) +{ + selectedImage->setEnabled(selected); + inactiveImage->setEnabled(!selected); } RadialMenu::RadialMenu(const Point & positionToCenter, const std::vector & menuConfig) @@ -33,10 +43,10 @@ RadialMenu::RadialMenu(const Point & positionToCenter, const std::vectorpos.dimensions(); + Point itemSize = Point(70, 80); moveBy(-itemSize / 2); + pos.w = itemSize.x; + pos.h = itemSize.y; for (auto const & item : menuConfig) addItem(item.itemPosition, item.enabled, item.imageName, item.hoverText, item.callback); @@ -87,6 +97,17 @@ void RadialMenu::gesturePanning(const Point & initialPosition, const Point & cur { auto item = findNearestItem(currentPosition); GH.statusbar()->write(item->hoverText); + + if (item != selectedItem) + { + if (selectedItem) + selectedItem->setSelected(false); + + item->setSelected(true); + selectedItem = item; + + GH.windows().totalRedraw(); + } } void RadialMenu::gesture(bool on, const Point & initialPosition, const Point & finalPosition) diff --git a/client/widgets/RadialMenu.h b/client/widgets/RadialMenu.h index f7ce5ad07..a3c648367 100644 --- a/client/widgets/RadialMenu.h +++ b/client/widgets/RadialMenu.h @@ -37,13 +37,16 @@ class RadialMenuItem : public CIntObject { friend class RadialMenu; - std::shared_ptr image; - std::shared_ptr picture; + 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); + + void setSelected(bool selected); }; class RadialMenu : public CIntObject @@ -52,6 +55,8 @@ class RadialMenu : public CIntObject std::shared_ptr statusBar; + std::shared_ptr selectedItem; + 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;