Browse Source

Merge pull request #3927 from IvanSavenko/fix_doubleclick

[1.5.1] Fixed mouse double-click handling in some widgets
Ivan Savenko 1 year ago
parent
commit
a341abbd31
3 changed files with 29 additions and 2 deletions
  1. 11 0
      client/lobby/SelectionTab.cpp
  2. 9 2
      client/widgets/CComponent.cpp
  3. 9 0
      client/windows/GUIClasses.cpp

+ 11 - 0
client/lobby/SelectionTab.cpp

@@ -358,6 +358,17 @@ void SelectionTab::clickDouble(const Point & cursorPosition)
 	if(itemIndex >= curItems.size())
 		return;
 
+	auto clickedItem = curItems[itemIndex];
+	auto selectedItem = getSelectedMapInfo();
+
+	if (clickedItem != selectedItem)
+	{
+		// double-click BUT player hit different item than he had selected
+		// ignore - clickReleased would still trigger and update selection.
+		// After which another (3rd) click if it happens would still register as double-click
+		return;
+	}
+
 	if(itemIndex >= 0 && curItems[itemIndex]->isFolder)
 	{
 		select(position);

+ 9 - 2
client/widgets/CComponent.cpp

@@ -335,8 +335,15 @@ void CSelectableComponent::clickPressed(const Point & cursorPosition)
 
 void CSelectableComponent::clickDouble(const Point & cursorPosition)
 {
-	if(onChoose)
-		onChoose();
+	if (!selected)
+	{
+		clickPressed(cursorPosition);
+	}
+	else
+	{
+		if (onChoose)
+			onChoose();
+	}
 }
 
 void CSelectableComponent::init()

+ 9 - 0
client/windows/GUIClasses.cpp

@@ -616,6 +616,9 @@ void CTavernWindow::HeroPortrait::clickDouble(const Point & cursorPosition)
 
 void CTavernWindow::HeroPortrait::showPopupWindow(const Point & cursorPosition)
 {
+	// h3 behavior - right-click also selects hero
+	clickPressed(cursorPosition);
+
 	if(h)
 		GH.windows().createAndPushWindow<CRClickPopupInt>(std::make_shared<CHeroWindow>(h));
 }
@@ -1712,6 +1715,12 @@ void CObjectListWindow::CItem::clickPressed(const Point & cursorPosition)
 
 void CObjectListWindow::CItem::clickDouble(const Point & cursorPosition)
 {
+	if (parent->selected != index)
+	{
+		clickPressed(cursorPosition);
+		return;
+	}
+
 	parent->elementSelected();
 }