Browse Source

Added initial version of selection highlight

Ivan Savenko 2 years ago
parent
commit
e2ad8bbf58

BIN
Mods/vcmi/Data/radialMenu/heroMove.png


BIN
Mods/vcmi/Data/radialMenu/heroSwap.png


BIN
Mods/vcmi/Data/radialMenu/itemEmpty.png


BIN
Mods/vcmi/Data/radialMenu/itemInactive.png


BIN
Mods/vcmi/Data/radialMenu/stackInfo.png


BIN
Mods/vcmi/Data/radialMenu/stackMerge.png


BIN
Mods/vcmi/Data/radialMenu/stackSplitDialog.png


BIN
Mods/vcmi/Data/radialMenu/stackSplitEqual.png


BIN
Mods/vcmi/Data/radialMenu/stackSplitOne.png


+ 27 - 6
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<CPicture>(image, Point(0, 0));
-	pos = picture->pos;
+	inactiveImage = std::make_shared<CPicture>("radialMenu/itemInactive", Point(0, 0));
+	selectedImage = std::make_shared<CPicture>("radialMenu/itemEmpty", Point(0, 0));
+
+	iconImage = std::make_shared<CPicture>("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<RadialMenuConfig> & menuConfig)
@@ -33,10 +43,10 @@ RadialMenu::RadialMenu(const Point & positionToCenter, const std::vector<RadialM
 	OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
 	pos += positionToCenter;
 
-	addItem(Point(0,0), true, "itemEmpty", "", [](){});
-
-	Point itemSize = items.back()->pos.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)

+ 7 - 2
client/widgets/RadialMenu.h

@@ -37,13 +37,16 @@ class RadialMenuItem : public CIntObject
 {
 	friend class RadialMenu;
 
-	std::shared_ptr<IImage> image;
-	std::shared_ptr<CPicture> picture;
+	std::shared_ptr<CPicture> iconImage;
+	std::shared_ptr<CPicture> selectedImage;
+	std::shared_ptr<CPicture> inactiveImage;
 	std::function<void()> callback;
 	std::string hoverText;
 
 public:
 	RadialMenuItem(const std::string & imageName, const std::string & hoverText, const std::function<void()> & callback);
+
+	void setSelected(bool selected);
 };
 
 class RadialMenu : public CIntObject
@@ -52,6 +55,8 @@ class RadialMenu : public CIntObject
 
 	std::shared_ptr<CGStatusBar> statusBar;
 
+	std::shared_ptr<RadialMenuItem> selectedItem;
+
 	void addItem(const Point & offset, bool enabled, const std::string & path, const std::string & hoverText, const std::function<void()> & callback);
 
 	std::shared_ptr<RadialMenuItem> findNearestItem(const Point & cursorPosition) const;