mirror of
https://git.citron-emu.org/citron/emulator
synced 2025-12-19 10:43:33 +00:00
feat: Controller Overlay
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user