mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-12 09:48:37 +12:00
[Qt/Input] Improve pad_settings_dialog a bit (#3611)
* Input: further work on remapping Xinput and begin work on remapping DS4 * Input: Improve pad_settings_dialog a bit and begin Remapping for XInput * Input: begin evdev remapping and change all handlers to use cfg::string * Input: finish work on remapping evdev and some more crap * Input: finish work on remapping Xinput and DS4 * Input: add DS4 Colors to DS4 config * Input: Improve DS4 deadzone scaling Jarves made some mistakes, so I'll fix them in the follow up commit * Input: fix Jarves fixes on DS4 deadzone and remove unnecessary usage of toUtf8 * Input: add primitive batterychecks to XInput and DS4 * Input: add mmjoystick remapping * Input: Fix evdev and some Vibration issues * Input: adjust capabilities to fix stick input for games like LoS 2 also fix threshold slider minimum also add ps button to all the handlers * Input: Further evdev work based on danilaml code review and own debugging: Fixed path issue, <= 0 issue, some captures, const, axis with same codes. Adds a map to each device that differentiates negative and positive axis mappings. adjusted rest of the file to tabs (ListDevices and beginning of threadProc) * Input: use 20ms vibration update time for xbox one elite controllers. * Input: Fix return type of Clamp() * Input: Evdev Fix * Input: Evdev Optional GetNextButtonPress presumably better than the other * Input: review changes * Input: evdev: fix wrong index in axis handling move bindpadtodevice down to keep consistency between handlers and not get crazy * Input: evdev: fix expensive add_device in GetNextButtonPress * cleanup * Input: mmjoy: fix type * Input: evdev: final fixes * Input: evdev: exclude unnecessary buttons while mapping Xbox 360 or DS4 * Input: add deadzone preview by passing necessary values in callback use 0.5 of max value for threshold in pad dialog * Input: get rid of all-uppercase variables
This commit is contained in:
parent
695b4c1f06
commit
662fe8cc95
33 changed files with 3573 additions and 1796 deletions
|
@ -5,19 +5,19 @@
|
|||
#include <QHBoxLayout>
|
||||
#include <QLabel>
|
||||
#include <QAction>
|
||||
#include <QButtonGroup>
|
||||
#include <QPainter>
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "pad_settings_dialog.h"
|
||||
#include "ui_pad_settings_dialog.h"
|
||||
|
||||
// TODO: rewrite with std::chrono or QTimer
|
||||
#include <time.h>
|
||||
inline std::string sstr(const QString& _in) { return _in.toStdString(); }
|
||||
constexpr auto qstr = QString::fromStdString;
|
||||
|
||||
extern keyboard_pad_config g_kbpad_config;
|
||||
|
||||
pad_settings_dialog::pad_settings_dialog(QWidget *parent) : QDialog(parent), ui(new Ui::pad_settings_dialog)
|
||||
pad_settings_dialog::pad_settings_dialog(const std::string& device, std::shared_ptr<PadHandlerBase> handler, QWidget *parent)
|
||||
: QDialog(parent), ui(new Ui::pad_settings_dialog), m_handler_cfg(handler->GetConfig()), m_device_name(device), m_handler(handler)
|
||||
{
|
||||
m_handler_cfg->load();
|
||||
|
||||
ui->setupUi(this);
|
||||
|
||||
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||||
|
@ -25,46 +25,225 @@ pad_settings_dialog::pad_settings_dialog(QWidget *parent) : QDialog(parent), ui(
|
|||
ui->b_cancel->setDefault(true);
|
||||
connect(ui->b_cancel, &QAbstractButton::clicked, this, &QWidget::close);
|
||||
|
||||
// Handling
|
||||
QButtonGroup *padButtons = new QButtonGroup(this);
|
||||
padButtons->addButton(ui->b_left_lstick, 1);
|
||||
padButtons->addButton(ui->b_down_lstick, 2);
|
||||
padButtons->addButton(ui->b_right_lstick, 3);
|
||||
padButtons->addButton(ui->b_up_lstick, 4);
|
||||
|
||||
padButtons->addButton(ui->b_left, 5);
|
||||
padButtons->addButton(ui->b_down, 6);
|
||||
padButtons->addButton(ui->b_right, 7);
|
||||
padButtons->addButton(ui->b_up, 8);
|
||||
|
||||
padButtons->addButton(ui->b_shift_l1, 9);
|
||||
padButtons->addButton(ui->b_shift_l2, 10);
|
||||
padButtons->addButton(ui->b_shift_l3, 11);
|
||||
|
||||
padButtons->addButton(ui->b_start, 12);
|
||||
padButtons->addButton(ui->b_select, 13);
|
||||
|
||||
padButtons->addButton(ui->b_shift_r1, 14);
|
||||
padButtons->addButton(ui->b_shift_r2, 15);
|
||||
padButtons->addButton(ui->b_shift_r3, 16);
|
||||
|
||||
padButtons->addButton(ui->b_square, 17);
|
||||
padButtons->addButton(ui->b_cross, 18);
|
||||
padButtons->addButton(ui->b_circle, 19);
|
||||
padButtons->addButton(ui->b_triangle, 20);
|
||||
|
||||
padButtons->addButton(ui->b_left_rstick, 21);
|
||||
padButtons->addButton(ui->b_down_rstick, 22);
|
||||
padButtons->addButton(ui->b_right_rstick, 23);
|
||||
padButtons->addButton(ui->b_up_rstick, 24);
|
||||
|
||||
padButtons->addButton(ui->b_reset, 25);
|
||||
padButtons->addButton(ui->b_ok, 26);
|
||||
padButtons->addButton(ui->b_cancel, 27);
|
||||
m_padButtons = new QButtonGroup(this);
|
||||
m_palette = ui->b_left->palette(); // save normal palette
|
||||
|
||||
connect(padButtons, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked), this, &pad_settings_dialog::OnPadButtonClicked);
|
||||
ui->chb_vibration_large->setChecked((bool)m_handler_cfg->enable_vibration_motor_large);
|
||||
ui->chb_vibration_small->setChecked((bool)m_handler_cfg->enable_vibration_motor_small);
|
||||
ui->chb_vibration_switch->setChecked((bool)m_handler_cfg->switch_vibration_motors);
|
||||
|
||||
// Adjust to the different pad handlers
|
||||
if (m_handler_cfg->cfg_type == "keyboard")
|
||||
{
|
||||
setWindowTitle(tr("Configure Keyboard"));
|
||||
m_handler_type = handler_type::handler_type_keyboard;
|
||||
}
|
||||
else if (m_handler_cfg->cfg_type == "xinput")
|
||||
{
|
||||
setWindowTitle(tr("Configure XInput"));
|
||||
m_handler_type = handler_type::handler_type_xinput;
|
||||
}
|
||||
else if (m_handler_cfg->cfg_type == "ds4")
|
||||
{
|
||||
setWindowTitle(tr("Configure DS4"));
|
||||
m_handler_type = handler_type::handler_type_ds4;
|
||||
}
|
||||
else if (m_handler_cfg->cfg_type == "mmjoystick")
|
||||
{
|
||||
setWindowTitle(tr("Configure MMJoystick"));
|
||||
m_handler_type = handler_type::handler_type_mmjoy;
|
||||
}
|
||||
else if (m_handler_cfg->cfg_type == "evdev")
|
||||
{
|
||||
setWindowTitle(tr("Configure evdev"));
|
||||
m_handler_type = handler_type::handler_type_evdev;
|
||||
}
|
||||
|
||||
// Enable Button Remapping
|
||||
if (m_handler->has_config())
|
||||
{
|
||||
// Use timer to get button input
|
||||
const auto& callback = [=](u16 val, std::string name, int preview_values[6])
|
||||
{
|
||||
if (m_handler->has_deadzones())
|
||||
{
|
||||
ui->preview_trigger_left->setValue(preview_values[0]);
|
||||
ui->preview_trigger_right->setValue(preview_values[1]);
|
||||
|
||||
if (lx != preview_values[2] || ly != preview_values[3])
|
||||
{
|
||||
lx = preview_values[2], ly = preview_values[3];
|
||||
RepaintPreviewLabel(ui->preview_stick_left, ui->slider_stick_left->value(), ui->slider_stick_left->sizeHint().width(), lx, ly);
|
||||
}
|
||||
if (rx != preview_values[4] || ry != preview_values[5])
|
||||
{
|
||||
rx = preview_values[4], ry = preview_values[5];
|
||||
RepaintPreviewLabel(ui->preview_stick_right, ui->slider_stick_right->value(), ui->slider_stick_right->sizeHint().width(), rx, ry);
|
||||
}
|
||||
}
|
||||
|
||||
if (val <= 0) return;
|
||||
|
||||
LOG_NOTICE(HLE, "GetNextButtonPress: %s button %s pressed with value %d", m_handler_cfg->cfg_type, name, val);
|
||||
if (m_button_id > button_ids::id_pad_begin && m_button_id < button_ids::id_pad_end)
|
||||
{
|
||||
m_cfg_entries[m_button_id].key = name;
|
||||
m_cfg_entries[m_button_id].text = qstr(name);
|
||||
ReactivateButtons();
|
||||
}
|
||||
};
|
||||
|
||||
connect(&m_timer_input, &QTimer::timeout, [=]()
|
||||
{
|
||||
m_handler->GetNextButtonPress(m_device_name, callback);
|
||||
});
|
||||
|
||||
m_timer_input.start(1);
|
||||
};
|
||||
|
||||
// Enable Vibration Checkboxes
|
||||
if (m_handler->has_rumble())
|
||||
{
|
||||
const s32 min_force = m_handler->vibration_min;
|
||||
const s32 max_force = m_handler->vibration_max;
|
||||
|
||||
ui->chb_vibration_large->setEnabled(true);
|
||||
ui->chb_vibration_small->setEnabled(true);
|
||||
ui->chb_vibration_switch->setEnabled(true);
|
||||
|
||||
connect(ui->chb_vibration_large, &QCheckBox::clicked, [=](bool checked)
|
||||
{
|
||||
if (!checked) return;
|
||||
|
||||
ui->chb_vibration_switch->isChecked() ? m_handler->TestVibration(m_device_name, min_force, max_force)
|
||||
: m_handler->TestVibration(m_device_name, max_force, min_force);
|
||||
|
||||
QTimer::singleShot(300, [=]()
|
||||
{
|
||||
m_handler->TestVibration(m_device_name, min_force, min_force);
|
||||
});
|
||||
});
|
||||
|
||||
connect(ui->chb_vibration_small, &QCheckBox::clicked, [=](bool checked)
|
||||
{
|
||||
if (!checked) return;
|
||||
|
||||
ui->chb_vibration_switch->isChecked() ? m_handler->TestVibration(m_device_name, max_force, min_force)
|
||||
: m_handler->TestVibration(m_device_name, min_force, max_force);
|
||||
|
||||
QTimer::singleShot(300, [=]()
|
||||
{
|
||||
m_handler->TestVibration(m_device_name, min_force, min_force);
|
||||
});
|
||||
});
|
||||
|
||||
connect(ui->chb_vibration_switch, &QCheckBox::clicked, [=](bool checked)
|
||||
{
|
||||
checked ? m_handler->TestVibration(m_device_name, min_force, max_force)
|
||||
: m_handler->TestVibration(m_device_name, max_force, min_force);
|
||||
|
||||
QTimer::singleShot(200, [=]()
|
||||
{
|
||||
checked ? m_handler->TestVibration(m_device_name, max_force, min_force)
|
||||
: m_handler->TestVibration(m_device_name, min_force, max_force);
|
||||
|
||||
QTimer::singleShot(200, [=]()
|
||||
{
|
||||
m_handler->TestVibration(m_device_name, min_force, min_force);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Enable Deadzone Settings
|
||||
if (m_handler->has_deadzones())
|
||||
{
|
||||
auto initSlider = [=](QSlider* slider, const s32& value, const s32& min, const s32& max)
|
||||
{
|
||||
slider->setEnabled(true);
|
||||
slider->setRange(min, max);
|
||||
slider->setValue(value);
|
||||
};
|
||||
|
||||
// Enable Trigger Thresholds
|
||||
initSlider(ui->slider_trigger_left, m_handler_cfg->ltriggerthreshold, 0, m_handler->trigger_max);
|
||||
initSlider(ui->slider_trigger_right, m_handler_cfg->rtriggerthreshold, 0, m_handler->trigger_max);
|
||||
ui->preview_trigger_left->setRange(0, m_handler->trigger_max);
|
||||
ui->preview_trigger_right->setRange(0, m_handler->trigger_max);
|
||||
|
||||
// Enable Stick Deadzones
|
||||
initSlider(ui->slider_stick_left, m_handler_cfg->lstickdeadzone, 0, m_handler->thumb_max);
|
||||
initSlider(ui->slider_stick_right, m_handler_cfg->rstickdeadzone, 0, m_handler->thumb_max);
|
||||
|
||||
RepaintPreviewLabel(ui->preview_stick_left, ui->slider_stick_left->value(), ui->slider_stick_left->sizeHint().width(), lx, ly);
|
||||
connect(ui->slider_stick_left, &QSlider::valueChanged, [&](int value)
|
||||
{
|
||||
RepaintPreviewLabel(ui->preview_stick_left, value, ui->slider_stick_left->sizeHint().width(), lx, ly);
|
||||
});
|
||||
|
||||
RepaintPreviewLabel(ui->preview_stick_right, ui->slider_stick_right->value(), ui->slider_stick_right->sizeHint().width(), rx, ry);
|
||||
connect(ui->slider_stick_right, &QSlider::valueChanged, [&](int value)
|
||||
{
|
||||
RepaintPreviewLabel(ui->preview_stick_right, value, ui->slider_stick_right->sizeHint().width(), rx, ry);
|
||||
});
|
||||
}
|
||||
|
||||
auto insertButton = [this](int id, QPushButton* button, cfg::string* cfg_name)
|
||||
{
|
||||
QString name = qstr(*cfg_name);
|
||||
m_cfg_entries.insert(std::make_pair(id, pad_button{ cfg_name, *cfg_name, name }));
|
||||
m_padButtons->addButton(button, id);
|
||||
button->setText(name);
|
||||
};
|
||||
|
||||
insertButton(button_ids::id_pad_lstick_left, ui->b_lstick_left, &m_handler_cfg->ls_left);
|
||||
insertButton(button_ids::id_pad_lstick_down, ui->b_lstick_down, &m_handler_cfg->ls_down);
|
||||
insertButton(button_ids::id_pad_lstick_right, ui->b_lstick_right, &m_handler_cfg->ls_right);
|
||||
insertButton(button_ids::id_pad_lstick_up, ui->b_lstick_up, &m_handler_cfg->ls_up);
|
||||
|
||||
insertButton(button_ids::id_pad_left, ui->b_left, &m_handler_cfg->left);
|
||||
insertButton(button_ids::id_pad_down, ui->b_down, &m_handler_cfg->down);
|
||||
insertButton(button_ids::id_pad_right, ui->b_right, &m_handler_cfg->right);
|
||||
insertButton(button_ids::id_pad_up, ui->b_up, &m_handler_cfg->up);
|
||||
|
||||
insertButton(button_ids::id_pad_l1, ui->b_shift_l1, &m_handler_cfg->l1);
|
||||
insertButton(button_ids::id_pad_l2, ui->b_shift_l2, &m_handler_cfg->l2);
|
||||
insertButton(button_ids::id_pad_l3, ui->b_shift_l3, &m_handler_cfg->l3);
|
||||
|
||||
insertButton(button_ids::id_pad_start, ui->b_start, &m_handler_cfg->start);
|
||||
insertButton(button_ids::id_pad_select, ui->b_select, &m_handler_cfg->select);
|
||||
insertButton(button_ids::id_pad_ps, ui->b_ps, &m_handler_cfg->ps);
|
||||
|
||||
insertButton(button_ids::id_pad_r1, ui->b_shift_r1, &m_handler_cfg->r1);
|
||||
insertButton(button_ids::id_pad_r2, ui->b_shift_r2, &m_handler_cfg->r2);
|
||||
insertButton(button_ids::id_pad_r3, ui->b_shift_r3, &m_handler_cfg->r3);
|
||||
|
||||
insertButton(button_ids::id_pad_square, ui->b_square, &m_handler_cfg->square);
|
||||
insertButton(button_ids::id_pad_cross, ui->b_cross, &m_handler_cfg->cross);
|
||||
insertButton(button_ids::id_pad_circle, ui->b_circle, &m_handler_cfg->circle);
|
||||
insertButton(button_ids::id_pad_triangle, ui->b_triangle, &m_handler_cfg->triangle);
|
||||
|
||||
insertButton(button_ids::id_pad_rstick_left, ui->b_rstick_left, &m_handler_cfg->rs_left);
|
||||
insertButton(button_ids::id_pad_rstick_down, ui->b_rstick_down, &m_handler_cfg->rs_down);
|
||||
insertButton(button_ids::id_pad_rstick_right, ui->b_rstick_right, &m_handler_cfg->rs_right);
|
||||
insertButton(button_ids::id_pad_rstick_up, ui->b_rstick_up, &m_handler_cfg->rs_up);
|
||||
|
||||
m_padButtons->addButton(ui->b_reset, button_ids::id_reset_parameters);
|
||||
m_padButtons->addButton(ui->b_ok, button_ids::id_ok);
|
||||
m_padButtons->addButton(ui->b_cancel, button_ids::id_cancel);
|
||||
|
||||
connect(m_padButtons, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked), this, &pad_settings_dialog::OnPadButtonClicked);
|
||||
|
||||
connect(&m_timer, &QTimer::timeout, [&]()
|
||||
{
|
||||
if (--m_seconds <= 0)
|
||||
{
|
||||
ReactivateButtons();
|
||||
return;
|
||||
}
|
||||
m_padButtons->button(m_button_id)->setText(tr("[ Waiting %1 ]").arg(m_seconds));
|
||||
});
|
||||
|
||||
g_kbpad_config.load();
|
||||
UpdateLabel();
|
||||
|
||||
gui_settings settings(this);
|
||||
|
@ -81,224 +260,154 @@ pad_settings_dialog::~pad_settings_dialog()
|
|||
delete ui;
|
||||
}
|
||||
|
||||
void pad_settings_dialog::ReactivateButtons()
|
||||
{
|
||||
m_timer.stop();
|
||||
m_seconds = MAX_SECONDS;
|
||||
|
||||
if (m_button_id == button_ids::id_pad_begin)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_padButtons->button(m_button_id))
|
||||
{
|
||||
m_padButtons->button(m_button_id)->setPalette(m_palette);
|
||||
}
|
||||
|
||||
m_button_id = button_ids::id_pad_begin;
|
||||
UpdateLabel();
|
||||
SwitchButtons(true);
|
||||
}
|
||||
|
||||
void pad_settings_dialog::RepaintPreviewLabel(QLabel* l, int dz, int w, int x, int y)
|
||||
{
|
||||
int max = m_handler->thumb_max;
|
||||
int origin = w * 0.1;
|
||||
int width = w * 0.8;
|
||||
int dz_width = width * dz / max;
|
||||
int dz_origin = (w - dz_width) / 2;
|
||||
|
||||
x = (w + (x * width / max)) / 2;
|
||||
y = (w + (y * -1 * width / max)) / 2;
|
||||
|
||||
QPixmap pm(w, w);
|
||||
pm.fill(Qt::transparent);
|
||||
QPainter p(&pm);
|
||||
p.setRenderHint(QPainter::Antialiasing, true);
|
||||
QPen pen(Qt::black, 2);
|
||||
p.setPen(pen);
|
||||
QBrush brush(Qt::white);
|
||||
p.setBrush(brush);
|
||||
p.drawEllipse(origin, origin, width, width);
|
||||
pen = QPen(Qt::red, 2);
|
||||
p.setPen(pen);
|
||||
p.drawEllipse(dz_origin, dz_origin, dz_width, dz_width);
|
||||
pen = QPen(Qt::blue, 2);
|
||||
p.setPen(pen);
|
||||
p.drawEllipse(x, y, 1, 1);
|
||||
l->setPixmap(pm);
|
||||
}
|
||||
|
||||
void pad_settings_dialog::keyPressEvent(QKeyEvent *keyEvent)
|
||||
{
|
||||
m_key_pressed = true;
|
||||
|
||||
cfg::int32* entry = nullptr;
|
||||
|
||||
switch (m_button_id)
|
||||
if (m_handler_type != handler_type::handler_type_keyboard)
|
||||
{
|
||||
case id_pad_lstick_left: entry = &g_kbpad_config.left_stick_left; break;
|
||||
case id_pad_lstick_down: entry = &g_kbpad_config.left_stick_down; break;
|
||||
case id_pad_lstick_right: entry = &g_kbpad_config.left_stick_right; break;
|
||||
case id_pad_lstick_up: entry = &g_kbpad_config.left_stick_up; break;
|
||||
|
||||
case id_pad_left: entry = &g_kbpad_config.left; break;
|
||||
case id_pad_down: entry = &g_kbpad_config.down; break;
|
||||
case id_pad_right: entry = &g_kbpad_config.right; break;
|
||||
case id_pad_up: entry = &g_kbpad_config.up; break;
|
||||
|
||||
case id_pad_l1: entry = &g_kbpad_config.l1; break;
|
||||
case id_pad_l2: entry = &g_kbpad_config.l2; break;
|
||||
case id_pad_l3: entry = &g_kbpad_config.l3; break;
|
||||
|
||||
case id_pad_start: entry = &g_kbpad_config.start; break;
|
||||
case id_pad_select: entry = &g_kbpad_config.select; break;
|
||||
|
||||
case id_pad_r1: entry = &g_kbpad_config.r1; break;
|
||||
case id_pad_r2: entry = &g_kbpad_config.r2; break;
|
||||
case id_pad_r3: entry = &g_kbpad_config.r3; break;
|
||||
|
||||
case id_pad_square: entry = &g_kbpad_config.square; break;
|
||||
case id_pad_cross: entry = &g_kbpad_config.cross; break;
|
||||
case id_pad_circle: entry = &g_kbpad_config.circle; break;
|
||||
case id_pad_triangle: entry = &g_kbpad_config.triangle; break;
|
||||
case id_pad_rstick_left: entry = &g_kbpad_config.right_stick_left; break;
|
||||
case id_pad_rstick_down: entry = &g_kbpad_config.right_stick_down; break;
|
||||
case id_pad_rstick_right: entry = &g_kbpad_config.right_stick_right; break;
|
||||
case id_pad_rstick_up: entry = &g_kbpad_config.right_stick_up; break;
|
||||
|
||||
case 0: break;
|
||||
default: LOG_ERROR(HLE, "Unknown button ID: %d", m_button_id); break;
|
||||
return;
|
||||
}
|
||||
|
||||
if (entry)
|
||||
if (m_button_id == button_ids::id_pad_begin)
|
||||
{
|
||||
// TODO: do not modify config
|
||||
entry->from_string(std::to_string(keyEvent->key()));
|
||||
return;
|
||||
}
|
||||
|
||||
SwitchButtons(true); // enable all buttons
|
||||
m_button_id = 0; // reset current button id
|
||||
m_key_pressed = false;
|
||||
UpdateLabel();
|
||||
}
|
||||
|
||||
void pad_settings_dialog::UpdateLabel()
|
||||
{
|
||||
// Get button labels from .ini
|
||||
ui->b_up_lstick->setText(GetKeyName(g_kbpad_config.left_stick_up));
|
||||
ui->b_down_lstick->setText(GetKeyName(g_kbpad_config.left_stick_down));
|
||||
ui->b_left_lstick->setText(GetKeyName(g_kbpad_config.left_stick_left));
|
||||
ui->b_right_lstick->setText(GetKeyName(g_kbpad_config.left_stick_right));
|
||||
|
||||
ui->b_up->setText(GetKeyName(g_kbpad_config.up));
|
||||
ui->b_down->setText(GetKeyName(g_kbpad_config.down));
|
||||
ui->b_left->setText(GetKeyName(g_kbpad_config.left));
|
||||
ui->b_right->setText(GetKeyName(g_kbpad_config.right));
|
||||
|
||||
ui->b_shift_l1->setText(GetKeyName(g_kbpad_config.l1));
|
||||
ui->b_shift_l2->setText(GetKeyName(g_kbpad_config.l2));
|
||||
ui->b_shift_l3->setText(GetKeyName(g_kbpad_config.l3));
|
||||
|
||||
ui->b_start->setText(GetKeyName(g_kbpad_config.start));
|
||||
ui->b_select->setText(GetKeyName(g_kbpad_config.select));
|
||||
|
||||
ui->b_shift_r1->setText(GetKeyName(g_kbpad_config.r1));
|
||||
ui->b_shift_r2->setText(GetKeyName(g_kbpad_config.r2));
|
||||
ui->b_shift_r3->setText(GetKeyName(g_kbpad_config.r3));
|
||||
|
||||
ui->b_square->setText(GetKeyName(g_kbpad_config.square));
|
||||
ui->b_cross->setText(GetKeyName(g_kbpad_config.cross));
|
||||
ui->b_circle->setText(GetKeyName(g_kbpad_config.circle));
|
||||
ui->b_triangle->setText(GetKeyName(g_kbpad_config.triangle));
|
||||
|
||||
ui->b_up_rstick->setText(GetKeyName(g_kbpad_config.right_stick_up));
|
||||
ui->b_down_rstick->setText(GetKeyName(g_kbpad_config.right_stick_down));
|
||||
ui->b_left_rstick->setText(GetKeyName(g_kbpad_config.right_stick_left));
|
||||
ui->b_right_rstick->setText(GetKeyName(g_kbpad_config.right_stick_right));
|
||||
}
|
||||
|
||||
void pad_settings_dialog::UpdateTimerLabel(const u32 id)
|
||||
{
|
||||
// Lambda used to update label. The 47 is magical.
|
||||
auto UpdateLabel = [=](QPushButton* target)
|
||||
if (m_button_id <= button_ids::id_pad_begin || m_button_id >= button_ids::id_pad_end)
|
||||
{
|
||||
target->setText(QString::number(m_seconds + 47));
|
||||
};
|
||||
|
||||
switch (id)
|
||||
{
|
||||
case id_pad_lstick_left: UpdateLabel(ui->b_left_lstick); break;
|
||||
case id_pad_lstick_down: UpdateLabel(ui->b_down_lstick); break;
|
||||
case id_pad_lstick_right: UpdateLabel(ui->b_right_lstick); break;
|
||||
case id_pad_lstick_up: UpdateLabel(ui->b_up_lstick); break;
|
||||
|
||||
case id_pad_left: UpdateLabel(ui->b_left); break;
|
||||
case id_pad_down: UpdateLabel(ui->b_down); break;
|
||||
case id_pad_right: UpdateLabel(ui->b_right); break;
|
||||
case id_pad_up: UpdateLabel(ui->b_up); break;
|
||||
|
||||
case id_pad_l1: UpdateLabel(ui->b_shift_l1); break;
|
||||
case id_pad_l2: UpdateLabel(ui->b_shift_l2); break;
|
||||
case id_pad_l3: UpdateLabel(ui->b_shift_l3); break;
|
||||
|
||||
case id_pad_start: UpdateLabel(ui->b_start); break;
|
||||
case id_pad_select: UpdateLabel(ui->b_select); break;
|
||||
|
||||
case id_pad_r1: UpdateLabel(ui->b_shift_r1); break;
|
||||
case id_pad_r2: UpdateLabel(ui->b_shift_r2); break;
|
||||
case id_pad_r3: UpdateLabel(ui->b_shift_r3); break;
|
||||
|
||||
case id_pad_square: UpdateLabel(ui->b_square); break;
|
||||
case id_pad_cross: UpdateLabel(ui->b_cross); break;
|
||||
case id_pad_circle: UpdateLabel(ui->b_circle); break;
|
||||
case id_pad_triangle: UpdateLabel(ui->b_triangle); break;
|
||||
|
||||
case id_pad_rstick_left: UpdateLabel(ui->b_left_rstick); break;
|
||||
case id_pad_rstick_down: UpdateLabel(ui->b_down_rstick); break;
|
||||
case id_pad_rstick_right: UpdateLabel(ui->b_right_rstick); break;
|
||||
case id_pad_rstick_up: UpdateLabel(ui->b_up_rstick); break;
|
||||
|
||||
default: LOG_ERROR(HLE, "Unknown button ID: %d", id); break;
|
||||
LOG_NOTICE(HLE, "Pad Settings: Handler Type: %d, Unknown button ID: %d", static_cast<int>(m_handler_type), m_button_id);
|
||||
}
|
||||
}
|
||||
|
||||
void pad_settings_dialog::SwitchButtons(const bool IsEnabled)
|
||||
{
|
||||
ui->b_up_lstick->setEnabled(IsEnabled);
|
||||
ui->b_down_lstick->setEnabled(IsEnabled);
|
||||
ui->b_left_lstick->setEnabled(IsEnabled);
|
||||
ui->b_right_lstick->setEnabled(IsEnabled);
|
||||
|
||||
ui->b_up->setEnabled(IsEnabled);
|
||||
ui->b_down->setEnabled(IsEnabled);
|
||||
ui->b_left->setEnabled(IsEnabled);
|
||||
ui->b_right->setEnabled(IsEnabled);
|
||||
|
||||
ui->b_shift_l1->setEnabled(IsEnabled);
|
||||
ui->b_shift_l2->setEnabled(IsEnabled);
|
||||
ui->b_shift_l3->setEnabled(IsEnabled);
|
||||
|
||||
ui->b_start->setEnabled(IsEnabled);
|
||||
ui->b_select->setEnabled(IsEnabled);
|
||||
|
||||
ui->b_shift_r1->setEnabled(IsEnabled);
|
||||
ui->b_shift_r2->setEnabled(IsEnabled);
|
||||
ui->b_shift_r3->setEnabled(IsEnabled);
|
||||
|
||||
ui->b_square->setEnabled(IsEnabled);
|
||||
ui->b_cross->setEnabled(IsEnabled);
|
||||
ui->b_circle->setEnabled(IsEnabled);
|
||||
ui->b_triangle->setEnabled(IsEnabled);
|
||||
|
||||
ui->b_up_rstick->setEnabled(IsEnabled);
|
||||
ui->b_down_rstick->setEnabled(IsEnabled);
|
||||
ui->b_left_rstick->setEnabled(IsEnabled);
|
||||
ui->b_right_rstick->setEnabled(IsEnabled);
|
||||
|
||||
ui->b_ok->setEnabled(IsEnabled);
|
||||
ui->b_cancel->setEnabled(IsEnabled);
|
||||
ui->b_reset->setEnabled(IsEnabled);
|
||||
}
|
||||
|
||||
void pad_settings_dialog::RunTimer(const u32 seconds, const u32 id)
|
||||
{
|
||||
m_seconds = seconds;
|
||||
clock_t t1, t2;
|
||||
t1 = t2 = clock() / CLOCKS_PER_SEC;
|
||||
while (m_seconds)
|
||||
else
|
||||
{
|
||||
if (t1 / CLOCKS_PER_SEC + 1 <= (t2 = clock()) / CLOCKS_PER_SEC)
|
||||
m_cfg_entries[m_button_id].key = ((keyboard_pad_handler*)m_handler.get())->GetKeyName(keyEvent);
|
||||
m_cfg_entries[m_button_id].text = qstr(m_cfg_entries[m_button_id].key);
|
||||
}
|
||||
|
||||
ReactivateButtons();
|
||||
}
|
||||
|
||||
void pad_settings_dialog::UpdateLabel(bool is_reset)
|
||||
{
|
||||
if (is_reset)
|
||||
{
|
||||
ui->chb_vibration_large->setChecked((bool)m_handler_cfg->enable_vibration_motor_large);
|
||||
ui->chb_vibration_small->setChecked((bool)m_handler_cfg->enable_vibration_motor_small);
|
||||
ui->chb_vibration_switch->setChecked((bool)m_handler_cfg->switch_vibration_motors);
|
||||
|
||||
ui->slider_trigger_left->setValue(m_handler_cfg->ltriggerthreshold);
|
||||
ui->slider_trigger_right->setValue(m_handler_cfg->rtriggerthreshold);
|
||||
ui->slider_stick_left->setValue(m_handler_cfg->lstickdeadzone);
|
||||
ui->slider_stick_right->setValue(m_handler_cfg->rstickdeadzone);
|
||||
}
|
||||
|
||||
for (auto& entry : m_cfg_entries)
|
||||
{
|
||||
if (is_reset)
|
||||
{
|
||||
UpdateTimerLabel(id);
|
||||
m_seconds--;
|
||||
t1 = t2;
|
||||
entry.second.key = *entry.second.cfg_name;
|
||||
entry.second.text = qstr(entry.second.key);
|
||||
}
|
||||
|
||||
if (m_key_pressed)
|
||||
{
|
||||
m_seconds = 0;
|
||||
break;
|
||||
}
|
||||
m_padButtons->button(entry.first)->setText(entry.second.text);
|
||||
}
|
||||
}
|
||||
|
||||
const QString pad_settings_dialog::GetKeyName(const u32 keyCode)
|
||||
void pad_settings_dialog::SwitchButtons(bool is_enabled)
|
||||
{
|
||||
//TODO what about numpad?
|
||||
return QKeySequence(keyCode).toString();
|
||||
for (int i = button_ids::id_pad_begin + 1; i < button_ids::id_pad_end; i++)
|
||||
{
|
||||
m_padButtons->button(i)->setEnabled(is_enabled);
|
||||
}
|
||||
}
|
||||
|
||||
void pad_settings_dialog::SaveConfig()
|
||||
{
|
||||
for (const auto& entry : m_cfg_entries)
|
||||
{
|
||||
entry.second.cfg_name->from_string(entry.second.key);
|
||||
}
|
||||
m_handler_cfg->enable_vibration_motor_large.set(ui->chb_vibration_large->isChecked());
|
||||
m_handler_cfg->enable_vibration_motor_small.set(ui->chb_vibration_small->isChecked());
|
||||
m_handler_cfg->switch_vibration_motors.set(ui->chb_vibration_switch->isChecked());
|
||||
m_handler_cfg->ltriggerthreshold.set(ui->slider_trigger_left->value());
|
||||
m_handler_cfg->rtriggerthreshold.set(ui->slider_trigger_right->value());
|
||||
m_handler_cfg->lstickdeadzone.set(ui->slider_stick_left->value());
|
||||
m_handler_cfg->rstickdeadzone.set(ui->slider_stick_right->value());
|
||||
m_handler_cfg->save();
|
||||
}
|
||||
|
||||
void pad_settings_dialog::OnPadButtonClicked(int id)
|
||||
{
|
||||
if (id != id_reset_parameters && id != id_ok)
|
||||
switch (id)
|
||||
{
|
||||
m_button_id = id;
|
||||
SwitchButtons(false); // disable all buttons, needed for using Space, Enter and other specific buttons
|
||||
//RunTimer(3, event.GetId()); // TODO: Currently, timer disabled. Use by later, have some strange problems
|
||||
//SwitchButtons(true); // needed, if timer enabled
|
||||
UpdateLabel();
|
||||
case button_ids::id_pad_begin:
|
||||
case button_ids::id_pad_end:
|
||||
case button_ids::id_cancel:
|
||||
return;
|
||||
case button_ids::id_reset_parameters:
|
||||
ReactivateButtons();
|
||||
m_handler_cfg->from_default();
|
||||
UpdateLabel(true);
|
||||
return;
|
||||
case button_ids::id_ok:
|
||||
SaveConfig();
|
||||
QDialog::accept();
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case id_reset_parameters: g_kbpad_config.from_default(); UpdateLabel(); break;
|
||||
case id_ok: g_kbpad_config.save(); QDialog::accept(); break;
|
||||
case id_cancel: break;
|
||||
}
|
||||
}
|
||||
m_button_id = id;
|
||||
m_padButtons->button(m_button_id)->setText(tr("[ Waiting %1 ]").arg(MAX_SECONDS));
|
||||
m_padButtons->button(m_button_id)->setPalette(QPalette(Qt::blue));
|
||||
SwitchButtons(false); // disable all buttons, needed for using Space, Enter and other specific buttons
|
||||
m_timer.start(1000);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue