From fce9d6a7b851682e78814da813d4c0d9d98f6f81 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 9 May 2019 21:31:43 +0200 Subject: [PATCH] Qt/input: add LED color picker to pad settings dialog --- rpcs3/Emu/Io/PadHandler.cpp | 7 ++++- rpcs3/Emu/Io/PadHandler.h | 3 ++ rpcs3/ds4_pad_handler.cpp | 35 +++++++++++++++++++++ rpcs3/ds4_pad_handler.h | 3 +- rpcs3/rpcs3qt/main_window.cpp | 4 +-- rpcs3/rpcs3qt/pad_settings_dialog.cpp | 44 ++++++++++++++++++++++++++- rpcs3/rpcs3qt/pad_settings_dialog.h | 4 ++- rpcs3/rpcs3qt/pad_settings_dialog.ui | 42 +++++++++++++++++++++++-- rpcs3/rpcs3qt/qt_utils.cpp | 2 +- rpcs3/rpcs3qt/qt_utils.h | 2 +- 10 files changed, 136 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/Io/PadHandler.cpp b/rpcs3/Emu/Io/PadHandler.cpp index 20dab403e5..151aa54884 100644 --- a/rpcs3/Emu/Io/PadHandler.cpp +++ b/rpcs3/Emu/Io/PadHandler.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "stdafx.h" #include "PadHandler.h" cfg_input g_cfg_input; @@ -263,6 +263,11 @@ bool PadHandlerBase::has_deadzones() return b_has_deadzones; } +bool PadHandlerBase::has_led() +{ + return b_has_led; +} + std::string PadHandlerBase::get_config_dir(pad_handler type) { return fs::get_config_dir() + "/InputConfigs/" + fmt::format("%s", type) + "/"; diff --git a/rpcs3/Emu/Io/PadHandler.h b/rpcs3/Emu/Io/PadHandler.h index 73970e9e0e..0a9a1ed3b1 100644 --- a/rpcs3/Emu/Io/PadHandler.h +++ b/rpcs3/Emu/Io/PadHandler.h @@ -385,6 +385,7 @@ protected: int m_trigger_threshold = 0; int m_thumb_threshold = 0; + bool b_has_led = false; bool b_has_deadzones = false; bool b_has_rumble = false; bool b_has_config = false; @@ -457,6 +458,7 @@ public: bool has_config(); bool has_rumble(); bool has_deadzones(); + bool has_led(); static std::string get_config_dir(pad_handler type); static std::string get_config_filename(int i); @@ -467,6 +469,7 @@ public: //Sets window to config the controller(optional) virtual void GetNextButtonPress(const std::string& /*padId*/, const std::function& /*callback*/, const std::function& /*fail_callback*/, bool /*get_blacklist*/ = false, const std::vector& /*buttons*/ = {}) {}; virtual void TestVibration(const std::string& /*padId*/, u32 /*largeMotor*/, u32 /*smallMotor*/) {}; + virtual void SetLED(const std::string& /*padId*/, s32 /*r*/, s32 /*g*/, s32 /*b*/){}; //Return list of devices for that handler virtual std::vector ListDevices() = 0; //Callback called during pad_thread::ThreadFunc diff --git a/rpcs3/ds4_pad_handler.cpp b/rpcs3/ds4_pad_handler.cpp index 5467fb7c67..6c5d8796ad 100644 --- a/rpcs3/ds4_pad_handler.cpp +++ b/rpcs3/ds4_pad_handler.cpp @@ -95,6 +95,7 @@ ds4_pad_handler::ds4_pad_handler() : PadHandlerBase(pad_handler::ds4) b_has_config = true; b_has_rumble = true; b_has_deadzones = true; + b_has_led = true; m_name_string = "DS4 Pad #"; m_max_devices = CELL_PAD_MAX_PORT_NUM; @@ -250,6 +251,40 @@ void ds4_pad_handler::TestVibration(const std::string& padId, u32 largeMotor, u3 SendVibrateData(device); } +void ds4_pad_handler::SetLED(const std::string& padId, s32 r, s32 g, s32 b) +{ + std::shared_ptr device = GetDevice(padId); + if (device == nullptr || device->hidDevice == nullptr) + return; + + int index = 0; + for (int i = 0; i < MAX_GAMEPADS; i++) + { + if (g_cfg_input.player[i]->handler == pad_handler::ds4) + { + if (g_cfg_input.player[i]->device.to_string() == padId) + { + m_pad_configs[index].load(); + device->config = &m_pad_configs[index]; + break; + } + index++; + } + } + + // disable pulse + device->led_delay_on = 0; + device->led_delay_off = 0; + + // set new color + device->config->colorR.set(r); + device->config->colorG.set(g); + device->config->colorB.set(b); + + // Show new color :) + SendVibrateData(device); +} + std::shared_ptr ds4_pad_handler::GetDevice(const std::string& padId, bool try_reconnect) { if (!Init()) diff --git a/rpcs3/ds4_pad_handler.h b/rpcs3/ds4_pad_handler.h index c2b1dfc467..67361ccc60 100644 --- a/rpcs3/ds4_pad_handler.h +++ b/rpcs3/ds4_pad_handler.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "Emu/Io/PadHandler.h" #include "Utilities/Thread.h" @@ -144,6 +144,7 @@ public: void ThreadProc() override; void GetNextButtonPress(const std::string& padId, const std::function& buttonCallback, const std::function& fail_callback, bool get_blacklist = false, const std::vector& buttons = {}) override; void TestVibration(const std::string& padId, u32 largeMotor, u32 smallMotor) override; + void SetLED(const std::string& padId, s32 r, s32 g, s32 b) override; void init_config(pad_config* cfg, const std::string& name) override; private: diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index 586256bd65..6a1f628fc8 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -1282,7 +1282,7 @@ void main_window::CreateConnects() auto openPadSettings = [this] { - auto resetPadHandlers = [this] + auto resetPadHandlers = [this](int/* result*/) { if (Emu.IsStopped()) { @@ -1295,7 +1295,7 @@ void main_window::CreateConnects() Emu.GetCallbacks().enable_pads(false); } pad_settings_dialog dlg(this); - connect(&dlg, &QDialog::accepted, resetPadHandlers); + connect(&dlg, &QDialog::finished, resetPadHandlers); dlg.exec(); if (!Emu.IsStopped()) { diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.cpp b/rpcs3/rpcs3qt/pad_settings_dialog.cpp index 9dfc643b98..edd7599914 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/pad_settings_dialog.cpp @@ -1,10 +1,11 @@ -#include +#include #include #include #include #include #include #include +#include #include "qt_utils.h" #include "pad_settings_dialog.h" @@ -246,6 +247,7 @@ void pad_settings_dialog::InitButtons() insertButton(button_ids::id_pad_rstick_right, ui->b_rstick_right); insertButton(button_ids::id_pad_rstick_up, ui->b_rstick_up); + m_padButtons->addButton(ui->b_led, button_ids::id_led); m_padButtons->addButton(ui->b_reset, button_ids::id_reset_parameters); m_padButtons->addButton(ui->b_blacklist, button_ids::id_blacklist); m_padButtons->addButton(ui->b_refresh, button_ids::id_refresh); @@ -324,6 +326,19 @@ void pad_settings_dialog::InitButtons() RepaintPreviewLabel(ui->preview_stick_right, value, ui->slider_stick_right->size().width(), rx, ry); }); + connect(ui->b_led, &QPushButton::clicked, [=]() + { + QColorDialog dlg(QColor(m_handler_cfg.colorR, m_handler_cfg.colorG, m_handler_cfg.colorB), this); + dlg.setWindowTitle(tr("LED Color")); + if (dlg.exec() == QColorDialog::Accepted) + { + const QColor newColor = dlg.selectedColor(); + m_handler->SetLED(m_device_name, newColor.red(), newColor.green(), newColor.blue()); + ui->b_led->setIcon(gui::utils::get_colorized_icon(QIcon(":/Icons/controllers.png"), Qt::black, newColor)); + ui->b_led->setProperty("led", newColor); + } + }); + // Enable Button Remapping const auto& callback = [=](u16 val, std::string name, std::string pad_name, int preview_values[6]) { @@ -529,6 +544,15 @@ void pad_settings_dialog::ReloadButtons() RepaintPreviewLabel(ui->preview_stick_left, ui->slider_stick_left->value(), ui->slider_stick_left->size().width(), lx, ly); RepaintPreviewLabel(ui->preview_stick_right, ui->slider_stick_right->value(), ui->slider_stick_right->size().width(), rx, ry); + + // Enable and repaint the LED Button + m_enable_led = m_handler->has_led(); + m_handler->SetLED(m_device_name, m_handler_cfg.colorR, m_handler_cfg.colorG, m_handler_cfg.colorB); + + const QColor led_color(m_handler_cfg.colorR, m_handler_cfg.colorG, m_handler_cfg.colorB); + ui->b_led->setIcon(gui::utils::get_colorized_icon(QIcon(":/Icons/controllers.png"), Qt::black, led_color)); + ui->b_led->setProperty("led", led_color); + ui->gb_led->setVisible(m_enable_led); } void pad_settings_dialog::ReactivateButtons() @@ -725,6 +749,14 @@ void pad_settings_dialog::UpdateLabel(bool is_reset) ui->slider_stick_left->setValue(m_handler_cfg.lstickdeadzone); ui->slider_stick_right->setValue(m_handler_cfg.rstickdeadzone); } + + if (m_handler->has_led()) + { + const QColor led_color(m_handler_cfg.colorR, m_handler_cfg.colorG, m_handler_cfg.colorB); + ui->b_led->setProperty("led", led_color); + ui->b_led->setIcon(gui::utils::get_colorized_icon(QIcon(":/Icons/controllers.png"), Qt::black, led_color)); + m_handler->SetLED(m_device_name, m_handler_cfg.colorR, m_handler_cfg.colorG, m_handler_cfg.colorB); + } } for (auto& entry : m_cfg_entries) @@ -748,6 +780,7 @@ void pad_settings_dialog::SwitchButtons(bool is_enabled) ui->gb_vibration->setEnabled(is_enabled && m_enable_rumble); ui->gb_sticks->setEnabled(is_enabled && m_enable_deadzones); ui->gb_triggers->setEnabled(is_enabled && m_enable_deadzones); + ui->gb_led->setEnabled(is_enabled && m_enable_led); ui->gb_mouse_accel->setEnabled(is_enabled && m_handler->m_type == pad_handler::keyboard); ui->gb_mouse_dz->setEnabled(is_enabled && m_handler->m_type == pad_handler::keyboard); ui->gb_stick_lerp->setEnabled(is_enabled && m_handler->m_type == pad_handler::keyboard); @@ -762,6 +795,7 @@ void pad_settings_dialog::OnPadButtonClicked(int id) { switch (id) { + case button_ids::id_led: case button_ids::id_pad_begin: case button_ids::id_pad_end: case button_ids::id_add_profile: @@ -1074,6 +1108,14 @@ void pad_settings_dialog::SaveProfile() m_handler_cfg.rstickdeadzone.set(ui->slider_stick_right->value()); } + if (m_handler->has_led() && ui->b_led->property("led").canConvert()) + { + const QColor led_color = ui->b_led->property("led").value(); + m_handler_cfg.colorR.set(led_color.red()); + m_handler_cfg.colorG.set(led_color.green()); + m_handler_cfg.colorB.set(led_color.blue()); + } + if (m_handler->m_type == pad_handler::keyboard) { m_handler_cfg.mouse_acceleration_x.set(ui->mouse_accel_x->value() * 100); diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.h b/rpcs3/rpcs3qt/pad_settings_dialog.h index 99484a681e..e14b00ad37 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.h +++ b/rpcs3/rpcs3qt/pad_settings_dialog.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include @@ -66,6 +66,7 @@ class pad_settings_dialog : public QDialog id_pad_end, // end + id_led, id_reset_parameters, id_blacklist, id_refresh, @@ -107,6 +108,7 @@ private: bool m_enable_buttons{ false }; bool m_enable_rumble{ false }; bool m_enable_deadzones{ false }; + bool m_enable_led{ false }; // Button Mapping QButtonGroup* m_padButtons; diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.ui b/rpcs3/rpcs3qt/pad_settings_dialog.ui index 24bb80ce57..39b7f2d48d 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.ui +++ b/rpcs3/rpcs3qt/pad_settings_dialog.ui @@ -25,8 +25,8 @@ 60 10 - 878 - 624 + 886 + 612 @@ -1172,6 +1172,9 @@ + + 10 + 0 @@ -1412,6 +1415,41 @@ + + + + LED + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + + + + + :/Icons/controllers.png:/Icons/controllers.png + + + false + + + + + + diff --git a/rpcs3/rpcs3qt/qt_utils.cpp b/rpcs3/rpcs3qt/qt_utils.cpp index aaf0e862f3..e82ef887b2 100644 --- a/rpcs3/rpcs3qt/qt_utils.cpp +++ b/rpcs3/rpcs3qt/qt_utils.cpp @@ -1,4 +1,4 @@ - + #include "qt_utils.h" #include #include diff --git a/rpcs3/rpcs3qt/qt_utils.h b/rpcs3/rpcs3qt/qt_utils.h index fb8462732f..cf6aa498ea 100644 --- a/rpcs3/rpcs3qt/qt_utils.h +++ b/rpcs3/rpcs3qt/qt_utils.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "stdafx.h" #include