Auto iterate through configuration inputs

Allows user to map all inputs seamlessly without having to
click on each button.
Also increased button timeout to 5 seconds from 1.5 due to pita.

Motion controls are not included since they will be special cases.
This commit is contained in:
MikeRavenelle 2014-06-14 18:15:41 -05:00
parent f9650c52f8
commit ffa6572116
2 changed files with 32 additions and 5 deletions

View File

@ -521,18 +521,34 @@ void ControlDialog::DetectControl(wxCommandEvent& event)
void GamepadPage::DetectControl(wxCommandEvent& event) void GamepadPage::DetectControl(wxCommandEvent& event)
{ {
ControlButton* btn = (ControlButton*)event.GetEventObject(); ControlButton* btn = (ControlButton*)event.GetEventObject();
if (DetectButton(btn))
{
auto it = std::find(control_buttons.begin(), control_buttons.end(), btn);
// std find will never return end since btn will always be found in control_buttons
++it;
for (; it != control_buttons.end(); ++it)
{
if (!DetectButton(*it))
break;
}
}
}
bool GamepadPage::DetectButton(ControlButton* button)
{
bool success = false;
// find device :/ // find device :/
Device* const dev = g_controller_interface.FindDevice(controller->default_device); Device* const dev = g_controller_interface.FindDevice(controller->default_device);
if (dev) if (dev)
{ {
btn->SetLabel(_("[ waiting ]")); button->SetLabel(_("[ waiting ]"));
// This makes the "waiting" text work on Linux. true (only if needed) prevents crash on Windows // This makes the "waiting" text work on Linux. true (only if needed) prevents crash on Windows
wxTheApp->Yield(true); wxTheApp->Yield(true);
std::lock_guard<std::recursive_mutex> lk(m_config.controls_lock); std::lock_guard<std::recursive_mutex> lk(m_config.controls_lock);
Device::Control* const ctrl = btn->control_reference->Detect(DETECT_WAIT_TIME, dev); Device::Control* const ctrl = button->control_reference->Detect(DETECT_WAIT_TIME, dev);
// if we got input, update expression and reference // if we got input, update expression and reference
if (ctrl) if (ctrl)
@ -540,12 +556,15 @@ void GamepadPage::DetectControl(wxCommandEvent& event)
wxString control_name = ctrl->GetName(); wxString control_name = ctrl->GetName();
wxString expr; wxString expr;
GetExpressionForControl(expr, control_name); GetExpressionForControl(expr, control_name);
btn->control_reference->expression = expr; button->control_reference->expression = expr;
g_controller_interface.UpdateReference(btn->control_reference, controller->default_device); g_controller_interface.UpdateReference(button->control_reference, controller->default_device);
success = true;
} }
} }
UpdateGUI(); UpdateGUI();
return success;
} }
wxStaticBoxSizer* ControlDialog::CreateControlChooser(GamepadPage* const parent) wxStaticBoxSizer* ControlDialog::CreateControlChooser(GamepadPage* const parent)
@ -740,6 +759,8 @@ ControlGroupBox::ControlGroupBox(ControllerEmu::ControlGroup* const group, wxWin
, control_group(group) , control_group(group)
{ {
static_bitmap = nullptr; static_bitmap = nullptr;
const std::vector<std::string> exclude_buttons = {"Mic", "Modifier"};
const std::vector<std::string> exclude_groups = {"IR", "Swing", "Tilt", "Shake", "UDP Wiimote", "Extension", "Rumble"};
wxFont m_SmallFont(7, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL); wxFont m_SmallFont(7, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
for (auto& control : group->controls) for (auto& control : group->controls)
@ -750,6 +771,10 @@ ControlGroupBox::ControlGroupBox(ControllerEmu::ControlGroup* const group, wxWin
control_button->SetFont(m_SmallFont); control_button->SetFont(m_SmallFont);
control_buttons.push_back(control_button); control_buttons.push_back(control_button);
if (std::find(exclude_groups.begin(), exclude_groups.end(), control_group->name) == exclude_groups.end() &&
std::find(exclude_buttons.begin(), exclude_buttons.end(), control->name) == exclude_buttons.end())
eventsink->control_buttons.push_back(control_button);
if (control->control_ref->is_input) if (control->control_ref->is_input)
{ {

View File

@ -5,7 +5,7 @@
#pragma once #pragma once
#define SLIDER_TICK_COUNT 100 #define SLIDER_TICK_COUNT 100
#define DETECT_WAIT_TIME 1500 #define DETECT_WAIT_TIME 5000
#define PREVIEW_UPDATE_TIME 25 #define PREVIEW_UPDATE_TIME 25
// might have to change this setup for wiimote // might have to change this setup for wiimote
@ -203,6 +203,7 @@ public:
wxComboBox* device_cbox; wxComboBox* device_cbox;
std::vector<ControlGroupBox*> control_groups; std::vector<ControlGroupBox*> control_groups;
std::vector<ControlButton*> control_buttons;
protected: protected:
@ -213,6 +214,7 @@ private:
ControlDialog* m_control_dialog; ControlDialog* m_control_dialog;
InputConfigDialog* const m_config_dialog; InputConfigDialog* const m_config_dialog;
InputConfig& m_config; InputConfig& m_config;
bool DetectButton(ControlButton* button);
}; };
class InputConfigDialog : public wxDialog class InputConfigDialog : public wxDialog