feat: Controller Overlay

This commit is contained in:
collecting
2025-10-29 05:20:45 +00:00
parent 8db5c0bd83
commit cd3656fcaa

View File

@@ -1,4 +1,5 @@
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
// SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#include <algorithm> #include <algorithm>
@@ -22,6 +23,10 @@ PlayerControlPreview::~PlayerControlPreview() {
UnloadController(); UnloadController();
}; };
void PlayerControlPreview::SetRawJoystickVisible(bool visible) {
raw_joystick_visible = visible;
}
void PlayerControlPreview::SetController(Core::HID::EmulatedController* controller_) { void PlayerControlPreview::SetController(Core::HID::EmulatedController* controller_) {
UnloadController(); UnloadController();
is_controller_set = true; is_controller_set = true;
@@ -226,7 +231,26 @@ void PlayerControlPreview::paintEvent(QPaintEvent* event) {
QFrame::paintEvent(event); QFrame::paintEvent(event);
QPainter p(this); QPainter p(this);
p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::Antialiasing);
// Define the base size that the original drawing coordinates were designed for.
// A Pro Controller is roughly 420x320 pixels in its drawing function.
constexpr QSizeF base_size(450.0, 350.0);
// Get the current size of the widget.
const QSize current_size = this->size();
// Calculate the scaling factor. We want to maintain aspect ratio,
// so we use the smaller of the width/height scaling factors.
const double scale_x = current_size.width() / base_size.width();
const double scale_y = current_size.height() / base_size.height();
const double scale = std::min(scale_x, scale_y);
// Save the painter's state, apply the scaling, and center the drawing.
p.save();
const QPointF center = rect().center(); const QPointF center = rect().center();
p.translate(center);
p.scale(scale, scale);
p.translate(-center);
switch (controller_type) { switch (controller_type) {
case Core::HID::NpadStyleIndex::Handheld: case Core::HID::NpadStyleIndex::Handheld:
@@ -249,6 +273,8 @@ void PlayerControlPreview::paintEvent(QPaintEvent* event) {
DrawProController(p, center); DrawProController(p, center);
break; break;
} }
p.restore(); // Restore the painter's original state.
} }
void PlayerControlPreview::DrawLeftController(QPainter& p, const QPointF center) { void PlayerControlPreview::DrawLeftController(QPainter& p, const QPointF center) {
@@ -314,8 +340,10 @@ void PlayerControlPreview::DrawLeftController(QPainter& p, const QPointF center)
center + QPointF(9, -69) + center + QPointF(9, -69) +
(QPointF(stick_values[LStick].x.value, stick_values[LStick].y.value) * 8), (QPointF(stick_values[LStick].x.value, stick_values[LStick].y.value) * 8),
1.8f, button_values[Settings::NativeButton::LStick]); 1.8f, button_values[Settings::NativeButton::LStick]);
if (raw_joystick_visible) {
DrawRawJoystick(p, center + QPointF(-140, 90), QPointF(0, 0)); DrawRawJoystick(p, center + QPointF(-140, 90), QPointF(0, 0));
} }
}
{ {
// Draw motion cubes // Draw motion cubes
@@ -449,8 +477,10 @@ void PlayerControlPreview::DrawRightController(QPainter& p, const QPointF center
center + QPointF(-9, 11) + center + QPointF(-9, 11) +
(QPointF(stick_values[RStick].x.value, stick_values[RStick].y.value) * 8), (QPointF(stick_values[RStick].x.value, stick_values[RStick].y.value) * 8),
1.8f, button_values[Settings::NativeButton::RStick]); 1.8f, button_values[Settings::NativeButton::RStick]);
if (raw_joystick_visible) {
DrawRawJoystick(p, QPointF(0, 0), center + QPointF(140, 90)); DrawRawJoystick(p, QPointF(0, 0), center + QPointF(140, 90));
} }
}
{ {
// Draw motion cubes // Draw motion cubes
@@ -593,8 +623,10 @@ void PlayerControlPreview::DrawDualController(QPainter& p, const QPointF center)
DrawJoystick(p, center + QPointF(-65, -65) + (l_stick * 7), 1.62f, l_button); DrawJoystick(p, center + QPointF(-65, -65) + (l_stick * 7), 1.62f, l_button);
DrawJoystick(p, center + QPointF(65, 12) + (r_stick * 7), 1.62f, r_button); DrawJoystick(p, center + QPointF(65, 12) + (r_stick * 7), 1.62f, r_button);
if (raw_joystick_visible) {
DrawRawJoystick(p, center + QPointF(-180, 90), center + QPointF(180, 90)); DrawRawJoystick(p, center + QPointF(-180, 90), center + QPointF(180, 90));
} }
}
{ {
// Draw motion cubes // Draw motion cubes
@@ -696,8 +728,10 @@ void PlayerControlPreview::DrawHandheldController(QPainter& p, const QPointF cen
DrawJoystick(p, center + QPointF(-171, -41) + (l_stick * 4), 1.0f, l_button); DrawJoystick(p, center + QPointF(-171, -41) + (l_stick * 4), 1.0f, l_button);
DrawJoystick(p, center + QPointF(171, 8) + (r_stick * 4), 1.0f, r_button); DrawJoystick(p, center + QPointF(171, 8) + (r_stick * 4), 1.0f, r_button);
if (raw_joystick_visible) {
DrawRawJoystick(p, center + QPointF(-50, 0), center + QPointF(50, 0)); DrawRawJoystick(p, center + QPointF(-50, 0), center + QPointF(50, 0));
} }
}
{ {
// Draw motion cubes // Draw motion cubes
@@ -808,8 +842,10 @@ void PlayerControlPreview::DrawProController(QPainter& p, const QPointF center)
button_values[Settings::NativeButton::LStick]); button_values[Settings::NativeButton::LStick]);
DrawProJoystick(p, center + QPointF(51, 0), r_stick, 11, DrawProJoystick(p, center + QPointF(51, 0), r_stick, 11,
button_values[Settings::NativeButton::RStick]); button_values[Settings::NativeButton::RStick]);
if (raw_joystick_visible) {
DrawRawJoystick(p, center + QPointF(-50, 105), center + QPointF(50, 105)); DrawRawJoystick(p, center + QPointF(-50, 105), center + QPointF(50, 105));
} }
}
{ {
// Draw motion cubes // Draw motion cubes
@@ -910,8 +946,10 @@ void PlayerControlPreview::DrawGCController(QPainter& p, const QPointF center) {
p.setPen(colors.transparent); p.setPen(colors.transparent);
p.setBrush(colors.font); p.setBrush(colors.font);
DrawSymbol(p, center + QPointF(61, 37) + (r_stick * 9.5f), Symbol::C, 1.0f); DrawSymbol(p, center + QPointF(61, 37) + (r_stick * 9.5f), Symbol::C, 1.0f);
if (raw_joystick_visible) {
DrawRawJoystick(p, center + QPointF(-198, -125), center + QPointF(198, -125)); DrawRawJoystick(p, center + QPointF(-198, -125), center + QPointF(198, -125));
} }
}
using namespace Settings::NativeButton; using namespace Settings::NativeButton;