[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:
Megamouse 2017-11-27 22:31:15 +01:00 committed by Ivan
parent 695b4c1f06
commit 662fe8cc95
33 changed files with 3573 additions and 1796 deletions

View file

@ -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);
}