mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-04-07 22:55:40 +12:00
[Qt] Add touchscreen
This commit is contained in:
parent
eabd22423c
commit
9cc3fc0c4c
2 changed files with 49 additions and 0 deletions
|
@ -42,6 +42,8 @@ class MainWindow : public QMainWindow {
|
||||||
SetCirclePadY,
|
SetCirclePadY,
|
||||||
LoadLuaScript,
|
LoadLuaScript,
|
||||||
EditCheat,
|
EditCheat,
|
||||||
|
PressTouchscreen,
|
||||||
|
ReleaseTouchscreen,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Tagged union representing our message queue messages
|
// Tagged union representing our message queue messages
|
||||||
|
@ -68,6 +70,11 @@ class MainWindow : public QMainWindow {
|
||||||
struct {
|
struct {
|
||||||
CheatMessage* c;
|
CheatMessage* c;
|
||||||
} cheat;
|
} cheat;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u16 x;
|
||||||
|
u16 y;
|
||||||
|
} touchscreen;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -108,6 +115,9 @@ class MainWindow : public QMainWindow {
|
||||||
|
|
||||||
void keyPressEvent(QKeyEvent* event) override;
|
void keyPressEvent(QKeyEvent* event) override;
|
||||||
void keyReleaseEvent(QKeyEvent* event) override;
|
void keyReleaseEvent(QKeyEvent* event) override;
|
||||||
|
void mousePressEvent(QMouseEvent* event) override;
|
||||||
|
void mouseReleaseEvent(QMouseEvent* event) override;
|
||||||
|
|
||||||
void loadLuaScript(const std::string& code);
|
void loadLuaScript(const std::string& code);
|
||||||
void editCheat(u32 handle, const std::vector<uint8_t>& cheat, const std::function<void(u32)>& callback);
|
void editCheat(u32 handle, const std::vector<uint8_t>& cheat, const std::function<void(u32)>& callback);
|
||||||
};
|
};
|
|
@ -3,6 +3,7 @@
|
||||||
#include <QDesktopServices>
|
#include <QDesktopServices>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
#include <cmath>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
|
@ -277,6 +278,10 @@ void MainWindow::dispatchMessage(const EmulatorMessage& message) {
|
||||||
case MessageType::ReleaseKey: emu->getServiceManager().getHID().releaseKey(message.key.key); break;
|
case MessageType::ReleaseKey: emu->getServiceManager().getHID().releaseKey(message.key.key); break;
|
||||||
case MessageType::SetCirclePadX: emu->getServiceManager().getHID().setCirclepadX(message.circlepad.value); break;
|
case MessageType::SetCirclePadX: emu->getServiceManager().getHID().setCirclepadX(message.circlepad.value); break;
|
||||||
case MessageType::SetCirclePadY: emu->getServiceManager().getHID().setCirclepadY(message.circlepad.value); break;
|
case MessageType::SetCirclePadY: emu->getServiceManager().getHID().setCirclepadY(message.circlepad.value); break;
|
||||||
|
case MessageType::PressTouchscreen:
|
||||||
|
emu->getServiceManager().getHID().setTouchScreenPress(message.touchscreen.x, message.touchscreen.y);
|
||||||
|
break;
|
||||||
|
case MessageType::ReleaseTouchscreen: emu->getServiceManager().getHID().releaseTouchScreen(); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,6 +362,40 @@ 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<u16>(x) - 40;
|
||||||
|
u16 y_converted = static_cast<u16>(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::mouseReleaseEvent(QMouseEvent* event) {
|
||||||
|
if (event->button() == Qt::MouseButton::LeftButton) {
|
||||||
|
sendMessage(EmulatorMessage{.type = MessageType::ReleaseTouchscreen});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::loadLuaScript(const std::string& code) {
|
void MainWindow::loadLuaScript(const std::string& code) {
|
||||||
EmulatorMessage message{.type = MessageType::LoadLuaScript};
|
EmulatorMessage message{.type = MessageType::LoadLuaScript};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue