diff --git a/include/panda_qt/main_window.hpp b/include/panda_qt/main_window.hpp index ed54ad84d..70e3ef755 100644 --- a/include/panda_qt/main_window.hpp +++ b/include/panda_qt/main_window.hpp @@ -146,12 +146,15 @@ class MainWindow : public QMainWindow { void closeEvent(QCloseEvent* event) override; void keyPressEvent(QKeyEvent* event) override; void keyReleaseEvent(QKeyEvent* event) override; + void mousePressEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override; + void mouseMoveEvent(QMouseEvent* event) override; void loadLuaScript(const std::string& code); void reloadShader(const std::string& shader); void editCheat(u32 handle, const std::vector& cheat, const std::function& callback); void handleScreenResize(u32 width, u32 height); + void handleTouchscreenPress(QMouseEvent* event); }; diff --git a/src/panda_qt/main_window.cpp b/src/panda_qt/main_window.cpp index 784e1176e..881dc02d2 100644 --- a/src/panda_qt/main_window.cpp +++ b/src/panda_qt/main_window.cpp @@ -487,29 +487,14 @@ void MainWindow::keyReleaseEvent(QKeyEvent* event) { void MainWindow::mousePressEvent(QMouseEvent* event) { if (event->button() == Qt::MouseButton::LeftButton) { - const QPointF clickPos = event->globalPosition(); - const QPointF widgetPos = screen->mapFromGlobal(clickPos); - - // Press is inside the screen area - if (widgetPos.x() >= 0 && widgetPos.x() < screen->width() && widgetPos.y() >= 0 && widgetPos.y() < screen->height()) { - // Go from widget positions to [0, 400) for x and [0, 480) for y - uint x = (uint)std::round(widgetPos.x() / screen->width() * 400.f); - uint y = (uint)std::round(widgetPos.y() / screen->height() * 480.f); - - // Check if touch falls in the touch screen area - if (y >= 240 && y <= 480 && x >= 40 && x < 40 + 320) { - // Convert to 3DS coordinates - u16 x_converted = static_cast(x) - 40; - u16 y_converted = static_cast(y) - 240; - - EmulatorMessage message{.type = MessageType::PressTouchscreen}; - message.touchscreen.x = x_converted; - message.touchscreen.y = y_converted; - sendMessage(message); - } else { - sendMessage(EmulatorMessage{.type = MessageType::ReleaseTouchscreen}); - } - } + // We handle actual mouse press & movement logic inside the mouseMoveEvent handler + handleTouchscreenPress(event); + } +} + +void MainWindow::mouseMoveEvent(QMouseEvent* event) { + if (event->buttons().testFlag(Qt::MouseButton::LeftButton)) { + handleTouchscreenPress(event); } } @@ -519,6 +504,32 @@ void MainWindow::mouseReleaseEvent(QMouseEvent* event) { } } +void MainWindow::handleTouchscreenPress(QMouseEvent* event) { + const QPointF clickPos = event->globalPosition(); + const QPointF widgetPos = screen->mapFromGlobal(clickPos); + + // Press is inside the screen area + if (widgetPos.x() >= 0 && widgetPos.x() < screen->width() && widgetPos.y() >= 0 && widgetPos.y() < screen->height()) { + // Go from widget positions to [0, 400) for x and [0, 480) for y + uint x = (uint)std::round(widgetPos.x() / screen->width() * 400.f); + uint y = (uint)std::round(widgetPos.y() / screen->height() * 480.f); + + // Check if touch falls in the touch screen area + if (y >= 240 && y <= 480 && x >= 40 && x < 40 + 320) { + // Convert to 3DS coordinates + u16 x_converted = static_cast(x) - 40; + u16 y_converted = static_cast(y) - 240; + + EmulatorMessage message{.type = MessageType::PressTouchscreen}; + message.touchscreen.x = x_converted; + message.touchscreen.y = y_converted; + sendMessage(message); + } else { + sendMessage(EmulatorMessage{.type = MessageType::ReleaseTouchscreen}); + } + } +} + void MainWindow::loadLuaScript(const std::string& code) { EmulatorMessage message{.type = MessageType::LoadLuaScript};