2017-05-23 16:08:53 +01:00
|
|
|
#include "inputeventselectiondialog.h"
|
|
|
|
#include "ui_inputeventselectiondialog.h"
|
|
|
|
|
2018-04-30 21:01:23 +01:00
|
|
|
InputEventSelectionDialog::InputEventSelectionDialog(QWidget* parent)
|
|
|
|
: QDialog(parent)
|
|
|
|
, ui(new Ui::InputEventSelectionDialog)
|
2017-05-23 16:08:53 +01:00
|
|
|
{
|
|
|
|
ui->setupUi(this);
|
2017-06-13 04:51:38 +01:00
|
|
|
setWindowFlags(Qt::Window | Qt::WindowCloseButtonHint);
|
|
|
|
setFixedSize(size());
|
2018-01-10 16:24:21 +00:00
|
|
|
|
2018-01-10 15:45:33 +00:00
|
|
|
// workaround to avoid direct thread ui access
|
|
|
|
connect(this, SIGNAL(setSelectedButtonLabelText(QString)), ui->selectedbuttonlabel, SLOT(setText(QString)));
|
|
|
|
connect(this, SIGNAL(setCountDownLabelText(QString)), ui->countdownlabel, SLOT(setText(QString)));
|
|
|
|
|
2018-01-10 16:24:21 +00:00
|
|
|
m_isCounting = false;
|
|
|
|
m_running = true;
|
2018-04-30 21:01:23 +01:00
|
|
|
m_thread = std::thread([this] { CountDownThreadLoop(); });
|
2017-05-23 16:08:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
InputEventSelectionDialog::~InputEventSelectionDialog()
|
|
|
|
{
|
2018-11-19 13:20:46 -05:00
|
|
|
m_inputManager->OverrideInputEventHandler(InputEventFunction());
|
2018-01-10 16:24:21 +00:00
|
|
|
m_running = false;
|
|
|
|
if(m_thread.joinable()) m_thread.join();
|
2017-05-23 16:08:53 +01:00
|
|
|
delete ui;
|
|
|
|
}
|
|
|
|
|
2018-11-19 13:20:46 -05:00
|
|
|
void InputEventSelectionDialog::Setup(const char* text, CInputBindingManager* inputManager, CInputProviderQtKey* qtKeyInputProvider, PS2::CControllerInfo::BUTTON button)
|
2017-05-23 16:08:53 +01:00
|
|
|
{
|
2017-06-13 04:51:38 +01:00
|
|
|
m_inputManager = inputManager;
|
2018-11-19 19:20:26 -05:00
|
|
|
m_inputManager->OverrideInputEventHandler([this] (auto target, auto value) { this->onInputEvent(target, value); } );
|
2018-11-19 13:20:46 -05:00
|
|
|
m_qtKeyInputProvider = qtKeyInputProvider;
|
2018-01-10 16:24:21 +00:00
|
|
|
ui->bindinglabel->setText(m_bindingtext.arg(text));
|
2017-06-13 04:51:38 +01:00
|
|
|
m_button = button;
|
2018-07-31 19:00:16 -04:00
|
|
|
}
|
|
|
|
|
2018-11-19 13:20:46 -05:00
|
|
|
static bool IsAxisIdle(uint32 value)
|
|
|
|
{
|
|
|
|
uint32 triggerRange = (255 * 20) / 100;
|
|
|
|
uint32 triggerVal1 = 255 - triggerRange;
|
|
|
|
uint32 triggerVal2 = 0 + triggerRange;
|
|
|
|
return (value < triggerVal1) && (value > triggerVal2);
|
|
|
|
}
|
2017-06-13 04:51:38 +01:00
|
|
|
|
2018-11-19 13:20:46 -05:00
|
|
|
void InputEventSelectionDialog::onInputEvent(const BINDINGTARGET& target, uint32 value)
|
2018-07-31 19:00:16 -04:00
|
|
|
{
|
2018-11-19 13:20:46 -05:00
|
|
|
switch(m_state)
|
|
|
|
{
|
|
|
|
case STATE::NONE:
|
|
|
|
//Check if we've pressed something
|
|
|
|
switch(target.keyType)
|
2017-06-13 04:51:38 +01:00
|
|
|
{
|
2018-11-19 13:20:46 -05:00
|
|
|
case BINDINGTARGET::KEYTYPE::BUTTON:
|
|
|
|
if(value != 0)
|
2017-06-13 04:51:38 +01:00
|
|
|
{
|
2018-11-19 13:20:46 -05:00
|
|
|
m_selectedTarget = target;
|
|
|
|
m_bindingType = CInputBindingManager::BINDING_SIMPLE;
|
|
|
|
m_state = STATE::SELECTED;
|
2018-01-10 16:24:21 +00:00
|
|
|
setCounter(1);
|
2018-11-19 13:20:46 -05:00
|
|
|
auto targetDescription = m_inputManager->GetTargetDescription(target);
|
|
|
|
setSelectedButtonLabelText("Selected Key: " + QString::fromStdString(targetDescription));
|
2017-06-13 04:51:38 +01:00
|
|
|
}
|
2018-11-19 13:20:46 -05:00
|
|
|
break;
|
|
|
|
case BINDINGTARGET::KEYTYPE::AXIS:
|
|
|
|
if(!IsAxisIdle(value))
|
2017-06-13 04:51:38 +01:00
|
|
|
{
|
2018-11-19 13:20:46 -05:00
|
|
|
m_selectedTarget = target;
|
|
|
|
m_bindingType = CInputBindingManager::BINDING_SIMPLE;
|
|
|
|
m_state = STATE::SELECTED;
|
2018-10-23 01:40:35 +01:00
|
|
|
setCounter(1);
|
2018-11-19 13:20:46 -05:00
|
|
|
auto targetDescription = m_inputManager->GetTargetDescription(target);
|
|
|
|
setSelectedButtonLabelText("Selected Key: " + QString::fromStdString(targetDescription));
|
2018-10-23 01:40:35 +01:00
|
|
|
}
|
2018-11-19 13:20:46 -05:00
|
|
|
break;
|
|
|
|
case BINDINGTARGET::KEYTYPE::POVHAT:
|
|
|
|
if(value < 8)
|
2018-10-23 01:40:35 +01:00
|
|
|
{
|
2018-11-19 13:20:46 -05:00
|
|
|
m_selectedTarget = target;
|
|
|
|
m_bindingType = CInputBindingManager::BINDING_POVHAT;
|
|
|
|
m_bindingValue = value;
|
|
|
|
m_state = STATE::SELECTED;
|
2018-10-23 01:40:35 +01:00
|
|
|
setCounter(1);
|
2018-11-19 13:20:46 -05:00
|
|
|
auto targetDescription = m_inputManager->GetTargetDescription(target);
|
|
|
|
setSelectedButtonLabelText("Selected Key: " + QString::fromStdString(targetDescription));
|
2018-10-23 01:40:35 +01:00
|
|
|
}
|
|
|
|
}
|
2018-11-19 13:20:46 -05:00
|
|
|
break;
|
|
|
|
case STATE::SELECTED:
|
|
|
|
if(target != m_selectedTarget) break;
|
|
|
|
switch(target.keyType)
|
2018-10-23 01:40:35 +01:00
|
|
|
{
|
2018-11-19 13:20:46 -05:00
|
|
|
case BINDINGTARGET::KEYTYPE::BUTTON:
|
|
|
|
if(value == 0)
|
2018-10-23 01:40:35 +01:00
|
|
|
{
|
2018-11-19 13:20:46 -05:00
|
|
|
m_selectedTarget = BINDINGTARGET();
|
|
|
|
m_state = STATE::NONE;
|
|
|
|
m_bindingType = CInputBindingManager::BINDING_UNBOUND;
|
|
|
|
|
|
|
|
setCounter(0);
|
|
|
|
setSelectedButtonLabelText("Selected Key: None");
|
2018-10-23 01:40:35 +01:00
|
|
|
}
|
2018-11-19 13:20:46 -05:00
|
|
|
break;
|
|
|
|
case BINDINGTARGET::KEYTYPE::AXIS:
|
|
|
|
if(IsAxisIdle(value))
|
2018-10-23 01:40:35 +01:00
|
|
|
{
|
2018-11-19 13:20:46 -05:00
|
|
|
m_selectedTarget = BINDINGTARGET();
|
|
|
|
m_state = STATE::NONE;
|
|
|
|
m_bindingType = CInputBindingManager::BINDING_UNBOUND;
|
|
|
|
setCounter(0);
|
|
|
|
setSelectedButtonLabelText("Selected Key: None");
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case BINDINGTARGET::KEYTYPE::POVHAT:
|
|
|
|
if(m_bindingValue != value)
|
|
|
|
{
|
|
|
|
m_selectedTarget = BINDINGTARGET();
|
|
|
|
m_state = STATE::NONE;
|
|
|
|
m_bindingType = CInputBindingManager::BINDING_UNBOUND;
|
|
|
|
setCounter(0);
|
|
|
|
setSelectedButtonLabelText("Selected Key: None");
|
2018-10-23 01:40:35 +01:00
|
|
|
}
|
|
|
|
}
|
2018-11-19 13:20:46 -05:00
|
|
|
break;
|
|
|
|
}
|
2018-10-23 01:40:35 +01:00
|
|
|
}
|
2018-05-23 03:11:24 +03:00
|
|
|
|
2017-05-23 16:08:53 +01:00
|
|
|
void InputEventSelectionDialog::keyPressEvent(QKeyEvent* ev)
|
|
|
|
{
|
2017-06-13 04:51:38 +01:00
|
|
|
if(ev->key() == Qt::Key_Escape)
|
|
|
|
{
|
2018-01-10 16:24:21 +00:00
|
|
|
m_running = false;
|
2017-06-13 04:51:38 +01:00
|
|
|
reject();
|
|
|
|
return;
|
|
|
|
}
|
2018-11-19 13:20:46 -05:00
|
|
|
m_qtKeyInputProvider->OnKeyPress(ev->key());
|
2018-01-10 16:24:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void InputEventSelectionDialog::keyReleaseEvent(QKeyEvent* ev)
|
|
|
|
{
|
2018-11-19 13:20:46 -05:00
|
|
|
m_qtKeyInputProvider->OnKeyRelease(ev->key());
|
2018-01-10 16:24:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void InputEventSelectionDialog::CountDownThreadLoop()
|
|
|
|
{
|
|
|
|
while(m_running)
|
|
|
|
{
|
|
|
|
auto time_now = std::chrono::system_clock::now();
|
|
|
|
std::chrono::duration<double> diff = time_now - m_countStart;
|
|
|
|
if(m_isCounting)
|
|
|
|
{
|
|
|
|
if(diff.count() < 3)
|
|
|
|
{
|
2018-01-10 15:45:33 +00:00
|
|
|
setCountDownLabelText(m_countingtext.arg(static_cast<int>(3 - diff.count())));
|
2018-01-10 16:24:21 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2018-11-19 13:20:46 -05:00
|
|
|
switch(m_bindingType)
|
2018-01-10 16:24:21 +00:00
|
|
|
{
|
2018-11-19 13:20:46 -05:00
|
|
|
case CInputBindingManager::BINDING_SIMPLE:
|
|
|
|
m_inputManager->SetSimpleBinding(m_button, m_selectedTarget);
|
2018-04-30 21:01:23 +01:00
|
|
|
break;
|
2018-11-19 13:20:46 -05:00
|
|
|
case CInputBindingManager::BINDING_POVHAT:
|
|
|
|
m_inputManager->SetPovHatBinding(m_button, m_selectedTarget, m_bindingValue);
|
2018-04-30 21:01:23 +01:00
|
|
|
break;
|
2018-01-10 16:24:21 +00:00
|
|
|
}
|
|
|
|
m_running = false;
|
|
|
|
accept();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(diff.count() < 3)
|
|
|
|
{
|
2018-01-10 15:45:33 +00:00
|
|
|
setCountDownLabelText(m_countingtext.arg(3));
|
2018-01-10 16:24:21 +00:00
|
|
|
}
|
2018-11-12 13:15:08 -05:00
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
2018-01-10 16:24:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool InputEventSelectionDialog::setCounter(int value)
|
|
|
|
{
|
|
|
|
if(value == 0)
|
|
|
|
{
|
|
|
|
m_isCounting = false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
else if(m_isCounting == false)
|
|
|
|
{
|
|
|
|
m_countStart = std::chrono::system_clock::now();
|
|
|
|
m_isCounting = true;
|
2017-06-13 04:51:38 +01:00
|
|
|
}
|
2018-01-10 16:24:21 +00:00
|
|
|
return true;
|
2017-05-23 16:08:53 +01:00
|
|
|
}
|