Browse Source

Do not activate radial wheel if cursor stays in the center

Ivan Savenko 2 years ago
parent
commit
1acc936e51
2 changed files with 24 additions and 9 deletions
  1. 22 7
      client/widgets/RadialMenu.cpp
  2. 2 2
      client/widgets/RadialMenu.h

+ 22 - 7
client/widgets/RadialMenu.cpp

@@ -41,7 +41,8 @@ void RadialMenuItem::setSelected(bool selected)
 	inactiveImage->setEnabled(!selected);
 }
 
-RadialMenu::RadialMenu(const Point & positionToCenter, const std::vector<RadialMenuConfig> & menuConfig)
+RadialMenu::RadialMenu(const Point & positionToCenter, const std::vector<RadialMenuConfig> & menuConfig):
+	centerPosition(positionToCenter)
 {
 	OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
 	pos += positionToCenter;
@@ -78,6 +79,12 @@ void RadialMenu::addItem(const Point & offset, bool enabled, const std::string &
 
 std::shared_ptr<RadialMenuItem> RadialMenu::findNearestItem(const Point & cursorPosition) const
 {
+	static const int requiredDistanceFromCenter = 45;
+
+	// cursor is inside centeral area -> no selection
+	if ((centerPosition - cursorPosition).length() < requiredDistanceFromCenter)
+		return nullptr;
+
 	int bestDistance = std::numeric_limits<int>::max();
 	std::shared_ptr<RadialMenuItem> bestItem;
 
@@ -98,16 +105,23 @@ std::shared_ptr<RadialMenuItem> RadialMenu::findNearestItem(const Point & cursor
 
 void RadialMenu::gesturePanning(const Point & initialPosition, const Point & currentPosition, const Point & lastUpdateDistance)
 {
-	auto item = findNearestItem(currentPosition);
-	GH.statusbar()->write(item->hoverText);
+	auto newSelection = findNearestItem(currentPosition);
+
 
-	if (item != selectedItem)
+	if (newSelection != selectedItem)
 	{
 		if (selectedItem)
 			selectedItem->setSelected(false);
 
-		item->setSelected(true);
-		selectedItem = item;
+		if (newSelection)
+		{
+			GH.statusbar()->write(newSelection->hoverText);
+			newSelection->setSelected(true);
+		}
+		else
+			GH.statusbar()->clear();
+
+		selectedItem = newSelection;
 
 		GH.windows().totalRedraw();
 	}
@@ -122,5 +136,6 @@ void RadialMenu::gesture(bool on, const Point & initialPosition, const Point & f
 
 	// we need to close this window first so if action spawns a new window it won't be closed instead
 	GH.windows().popWindows(1);
-	item->callback();
+	if (item)
+		item->callback();
 }

+ 2 - 2
client/widgets/RadialMenu.h

@@ -52,11 +52,11 @@ public:
 class RadialMenu : public CIntObject
 {
 	std::vector<std::shared_ptr<RadialMenuItem>> items;
-
 	std::shared_ptr<CGStatusBar> statusBar;
-
 	std::shared_ptr<RadialMenuItem> selectedItem;
 
+	Point centerPosition;
+
 	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;