Преглед на файлове

Merge pull request #1434 from vcmi/sdl-2-finger-touch

Handle 2 fingers gesture as rclick via SDL
Andrii Danylchenko преди 2 години
родител
ревизия
174624d791
променени са 3 файла, в които са добавени 59 реда и са изтрити 12 реда
  1. 57 11
      client/gui/CGuiHandler.cpp
  2. 1 0
      client/gui/CGuiHandler.h
  3. 1 1
      client/windows/CAdvmapInterface.cpp

+ 57 - 11
client/gui/CGuiHandler.cpp

@@ -206,6 +206,21 @@ void CGuiHandler::handleEvents()
 	}
 }
 
+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 +353,52 @@ void CGuiHandler::handleCurrentEvent()
 			it->textEdited(current->edit);
 		}
 	}
-	//todo: muiltitouch
 	else if(current->type == SDL_MOUSEBUTTONUP)
 	{
-		switch(current->button.button)
+		if(!multifinger)
 		{
-		case SDL_BUTTON_LEFT:
-			handleMouseButtonClick(lclickable, EIntObjMouseBtnType::LEFT, false);
-			break;
-		case SDL_BUTTON_RIGHT:
+			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;
+			}
+		}
+	}
+#ifndef VCMI_IOS
+	else if(current->type == SDL_FINGERDOWN)
+	{
+		auto fingerCount = SDL_GetNumTouchFingers(current->tfinger.touchId);
+
+		multifinger = fingerCount > 1;
+
+		if(fingerCount == 2)
+		{
+			convertTouch(current);
+			handleMouseMotion();
+			handleMouseButtonClick(rclickable, EIntObjMouseBtnType::RIGHT, true);
+		}
+	}
+	else if(current->type == SDL_FINGERUP)
+	{
+		auto fingerCount = SDL_GetNumTouchFingers(current->tfinger.touchId);
+
+		if(multifinger)
+		{
+			convertTouch(current);
+			handleMouseMotion();
 			handleMouseButtonClick(rclickable, EIntObjMouseBtnType::RIGHT, false);
-			break;
-		case SDL_BUTTON_MIDDLE:
-			handleMouseButtonClick(mclickable, EIntObjMouseBtnType::MIDDLE, false);
-			break;
+			multifinger = fingerCount != 0;
 		}
 	}
+#endif //VCMI_IOS
+
 	current = nullptr;
 } //event end
 
@@ -481,7 +526,8 @@ void CGuiHandler::renderFrame()
 
 
 CGuiHandler::CGuiHandler()
-	: lastClick(-500, -500),lastClickTime(0), defActionsDef(0), captureChildren(false)
+	: lastClick(-500, -500),lastClickTime(0), defActionsDef(0), captureChildren(false),
+    multifinger(false)
 {
 	continueEventHandling = true;
 	curInt = nullptr;

+ 1 - 0
client/gui/CGuiHandler.h

@@ -101,6 +101,7 @@ public:
 
 	Point lastClick;
 	unsigned lastClickTime;
+	bool multifinger;
 
 	ui8 defActionsDef; //default auto actions
 	bool captureChildren; //all newly created objects will get their parents from stack and will be added to parents children list

+ 1 - 1
client/windows/CAdvmapInterface.cpp

@@ -180,7 +180,7 @@ void CTerrainRect::mouseMoved(const SDL_MouseMotionEvent & sEvent)
 void CTerrainRect::handleSwipeMove(const SDL_MouseMotionEvent & sEvent)
 {
 #if defined(VCMI_ANDROID) || defined(VCMI_IOS)
-	if(sEvent.state == 0) // any "button" is enough on mobile
+	if(sEvent.state == 0 || GH.multifinger) // any "button" is enough on mobile
 #else
 	if((sEvent.state & SDL_BUTTON_MMASK) == 0) // swipe only works with middle mouse on other platforms
 #endif