Added initial version of selection highlight
| Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 483 B | 
| Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 493 B | 
| Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Mods/vcmi/Data/radialMenu/itemInactive.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 676 B | 
| Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 628 B | 
| Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 678 B | 
| Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 490 B | 
| Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 934 B | 
| Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 914 B | 
| @@ -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) | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||