2
0
Эх сурвалжийг харах

Handle 2 fingers gesture as rclick via SDL

Andrii Danylchenko 2 жил өмнө
parent
commit
7ccfcf51e9
1 өөрчлөгдсөн 60 нэмэгдсэн , 10 устгасан
  1. 60 10
      client/gui/CGuiHandler.cpp

+ 60 - 10
client/gui/CGuiHandler.cpp

@@ -206,6 +206,24 @@ void CGuiHandler::handleEvents()
 	}
 }
 
+bool multifinger = false;
+int lastFingerCount;
+
+void convertTouch(SDL_Event * current)
+{
+	int rLogicalWidth, rLogicalHeight;
+
+	SDL_RenderGetLogicalSize(mainRenderer, &rLogicalWidth, &rLogicalHeight);
+
+	int adjustedMouseY = (int)(current->tfinger.y * rLogicalHeight);
+	int adjustedMouseX = (int)(current->tfinger.x * rLogicalWidth);
+
+	current->button.x = adjustedMouseX;
+	current->motion.x = adjustedMouseX;
+	current->button.y = adjustedMouseY;
+	current->motion.y = adjustedMouseY;
+}
+
 void CGuiHandler::handleCurrentEvent()
 {
 	if(current->type == SDL_KEYDOWN || current->type == SDL_KEYUP)
@@ -338,22 +356,54 @@ void CGuiHandler::handleCurrentEvent()
 			it->textEdited(current->edit);
 		}
 	}
-	//todo: muiltitouch
 	else if(current->type == SDL_MOUSEBUTTONUP)
 	{
-		switch(current->button.button)
+		if(multifinger && lastFingerCount >= 1)
 		{
-		case SDL_BUTTON_LEFT:
-			handleMouseButtonClick(lclickable, EIntObjMouseBtnType::LEFT, false);
-			break;
-		case SDL_BUTTON_RIGHT:
+			multifinger = false;
+		}
+		else
+		{
+			switch(current->button.button)
+			{
+			case SDL_BUTTON_LEFT:
+				handleMouseButtonClick(lclickable, EIntObjMouseBtnType::LEFT, false);
+				break;
+			case SDL_BUTTON_RIGHT:
+				handleMouseButtonClick(rclickable, EIntObjMouseBtnType::RIGHT, false);
+				break;
+			case SDL_BUTTON_MIDDLE:
+				handleMouseButtonClick(mclickable, EIntObjMouseBtnType::MIDDLE, false);
+				break;
+			}
+		}
+	}
+	else if(current->type == SDL_FINGERDOWN)
+	{
+		lastFingerCount = SDL_GetNumTouchFingers(current->tfinger.touchId);
+
+		multifinger = lastFingerCount > 1;
+
+		if(lastFingerCount == 2)
+		{
+			convertTouch(current);
+			handleMouseMotion();
+			handleMouseButtonClick(rclickable, EIntObjMouseBtnType::RIGHT, true);
+		}
+	}
+	else if(current->type == SDL_FINGERUP)
+	{
+		lastFingerCount = SDL_GetNumTouchFingers(current->tfinger.touchId);
+
+		if(multifinger)
+		{
+			multifinger = false;
+			convertTouch(current);
+			handleMouseMotion();
 			handleMouseButtonClick(rclickable, EIntObjMouseBtnType::RIGHT, false);
-			break;
-		case SDL_BUTTON_MIDDLE:
-			handleMouseButtonClick(mclickable, EIntObjMouseBtnType::MIDDLE, false);
-			break;
 		}
 	}
+
 	current = nullptr;
 } //event end