DolphinWX: TAS fixes, take three

This commit is contained in:
Jeffrey Pfau 2015-09-07 02:15:23 -07:00
parent 1f800b80dd
commit c08203b704
2 changed files with 101 additions and 63 deletions

View File

@ -23,8 +23,8 @@
#include "InputCommon/GCPadStatus.h" #include "InputCommon/GCPadStatus.h"
#include "InputCommon/InputConfig.h" #include "InputCommon/InputConfig.h"
wxDEFINE_EVENT(WIIMOTE_UPDATE_CALLBACK, wxCommandEvent); wxDEFINE_EVENT(INVALIDATE_BUTTON_EVENT, wxCommandEvent);
wxDEFINE_EVENT(GCPAD_UPDATE_CALLBACK, wxCommandEvent); wxDEFINE_EVENT(INVALIDATE_CONTROL_EVENT, wxCommandEvent);
struct TASWiimoteReport struct TASWiimoteReport
{ {
@ -206,8 +206,8 @@ void TASInputDlg::CreateWiiLayout(int num)
void TASInputDlg::FinishLayout() void TASInputDlg::FinishLayout()
{ {
Bind(wxEVT_CLOSE_WINDOW, &TASInputDlg::OnCloseWindow, this); Bind(wxEVT_CLOSE_WINDOW, &TASInputDlg::OnCloseWindow, this);
Bind(GCPAD_UPDATE_CALLBACK, &TASInputDlg::GetValuesCallback, this); Bind(INVALIDATE_BUTTON_EVENT, &TASInputDlg::UpdateFromInvalidatedButton, this);
Bind(WIIMOTE_UPDATE_CALLBACK, &TASInputDlg::GetValuesCallback, this); Bind(INVALIDATE_CONTROL_EVENT, &TASInputDlg::UpdateFromInvalidatedControl, this);
m_has_layout = true; m_has_layout = true;
} }
@ -455,7 +455,10 @@ void TASInputDlg::ResetValues()
for (Button* const button : m_buttons) for (Button* const button : m_buttons)
{ {
if (button != nullptr) if (button != nullptr)
{
button->value = false;
button->checkbox->SetValue(false); button->checkbox->SetValue(false);
}
} }
for (Control* const control : m_controls) for (Control* const control : m_controls)
@ -469,10 +472,13 @@ void TASInputDlg::ResetValues()
} }
if (m_ext == 2) if (m_ext == 2)
{ {
for (Button const button : m_cc_buttons) for (Button& button : m_cc_buttons)
{
button.value = false;
button.checkbox->SetValue(false); button.checkbox->SetValue(false);
}
for (Control* const control : m_cc_controls) for (Control* control : m_cc_controls)
{ {
control->value = control->default_value; control->value = control->default_value;
control->slider->SetValue(control->default_value); control->slider->SetValue(control->default_value);
@ -481,24 +487,24 @@ void TASInputDlg::ResetValues()
} }
} }
void TASInputDlg::SetStickValue(bool* ActivatedByKeyboard, int* AmountPressed, wxTextCtrl* Textbox, int CurrentValue, int center) void TASInputDlg::SetStickValue(Control* control, int CurrentValue, int center)
{ {
if (CurrentValue != center) if (CurrentValue != center)
{ {
*AmountPressed = CurrentValue; control->value = CurrentValue;
*ActivatedByKeyboard = true; control->set_by_keyboard = true;
} }
else if (*ActivatedByKeyboard) else if (control->set_by_keyboard)
{ {
*AmountPressed = center; control->value = center;
*ActivatedByKeyboard = false; control->set_by_keyboard = false;
} }
else else
{ {
return; return;
} }
Textbox->SetValue(std::to_string(*AmountPressed)); InvalidateControl(control);
} }
void TASInputDlg::SetSliderValue(Control* control, int CurrentValue) void TASInputDlg::SetSliderValue(Control* control, int CurrentValue)
@ -507,14 +513,18 @@ void TASInputDlg::SetSliderValue(Control* control, int CurrentValue)
{ {
control->value = CurrentValue; control->value = CurrentValue;
control->set_by_keyboard = true; control->set_by_keyboard = true;
control->text->SetValue(std::to_string(CurrentValue));
} }
else if (control->set_by_keyboard) else if (control->set_by_keyboard)
{ {
control->value = control->default_value; control->value = control->default_value;
control->set_by_keyboard = false; control->set_by_keyboard = false;
control->text->SetValue(std::to_string(control->default_value));
} }
else
{
return;
}
InvalidateControl(control);
} }
void TASInputDlg::SetButtonValue(Button* button, bool CurrentState) void TASInputDlg::SetButtonValue(Button* button, bool CurrentState)
@ -522,13 +532,18 @@ void TASInputDlg::SetButtonValue(Button* button, bool CurrentState)
if (CurrentState) if (CurrentState)
{ {
button->set_by_keyboard = true; button->set_by_keyboard = true;
button->checkbox->SetValue(CurrentState);
} }
else if (button->set_by_keyboard) else if (button->set_by_keyboard)
{ {
button->set_by_keyboard = false; button->set_by_keyboard = false;
button->checkbox->SetValue(CurrentState);
} }
else
{
return;
}
button->value = CurrentState;
InvalidateButton(button);
} }
void TASInputDlg::SetWiiButtons(u16* butt) void TASInputDlg::SetWiiButtons(u16* butt)
@ -543,11 +558,11 @@ void TASInputDlg::SetWiiButtons(u16* butt)
void TASInputDlg::GetKeyBoardInput(GCPadStatus* PadStatus) void TASInputDlg::GetKeyBoardInput(GCPadStatus* PadStatus)
{ {
SetStickValue(&m_main_stick.x_cont.set_by_keyboard, &m_main_stick.x_cont.value, m_main_stick.x_cont.text, PadStatus->stickX); SetStickValue(&m_main_stick.x_cont, PadStatus->stickX);
SetStickValue(&m_main_stick.y_cont.set_by_keyboard, &m_main_stick.y_cont.value, m_main_stick.y_cont.text, PadStatus->stickY); SetStickValue(&m_main_stick.y_cont, PadStatus->stickY);
SetStickValue(&m_c_stick.x_cont.set_by_keyboard, &m_c_stick.x_cont.value, m_c_stick.x_cont.text, PadStatus->substickX); SetStickValue(&m_c_stick.x_cont, PadStatus->substickX);
SetStickValue(&m_c_stick.y_cont.set_by_keyboard, &m_c_stick.y_cont.value, m_c_stick.y_cont.text, PadStatus->substickY); SetStickValue(&m_c_stick.y_cont, PadStatus->substickY);
SetSliderValue(&m_l_cont, PadStatus->triggerLeft); SetSliderValue(&m_l_cont, PadStatus->triggerLeft);
SetSliderValue(&m_r_cont, PadStatus->triggerRight); SetSliderValue(&m_r_cont, PadStatus->triggerRight);
@ -614,9 +629,15 @@ void TASInputDlg::GetKeyBoardInput(u8* data, WiimoteEmu::ReportFeatures rptf, in
} }
if (m_cc_l.value == 31) if (m_cc_l.value == 31)
m_cc_buttons[10].checkbox->SetValue(true); {
m_cc_buttons[10].value = true;
InvalidateButton(&m_cc_buttons[10]);
}
if (m_cc_r.value == 31) if (m_cc_r.value == 31)
m_cc_buttons[11].checkbox->SetValue(true); {
m_cc_buttons[11].value = true;
InvalidateButton(&m_cc_buttons[11]);
}
SetSliderValue(&m_cc_l_stick.x_cont, cc.regular_data.lx); SetSliderValue(&m_cc_l_stick.x_cont, cc.regular_data.lx);
SetSliderValue(&m_cc_l_stick.y_cont, cc.regular_data.ly); SetSliderValue(&m_cc_l_stick.y_cont, cc.regular_data.ly);
@ -631,15 +652,6 @@ void TASInputDlg::GetValues(u8* data, WiimoteEmu::ReportFeatures rptf, int ext,
if (!IsShown() || !m_has_layout) if (!IsShown() || !m_has_layout)
return; return;
if (!wxIsMainThread())
{
TASWiimoteReport* report = new TASWiimoteReport{ data, rptf, ext, key };
wxCommandEvent* evt = new wxCommandEvent(WIIMOTE_UPDATE_CALLBACK);
evt->SetClientData(report);
wxQueueEvent(this, evt);
return;
}
GetKeyBoardInput(data, rptf, ext, key); GetKeyBoardInput(data, rptf, ext, key);
u8* const coreData = rptf.core ? (data + rptf.core) : nullptr; u8* const coreData = rptf.core ? (data + rptf.core) : nullptr;
@ -777,37 +789,11 @@ void TASInputDlg::GetValues(u8* data, WiimoteEmu::ReportFeatures rptf, int ext,
} }
} }
void TASInputDlg::GetValuesCallback(wxCommandEvent& event)
{
if (event.GetEventType() == WIIMOTE_UPDATE_CALLBACK)
{
TASWiimoteReport* report = static_cast<TASWiimoteReport*>(event.GetClientData());
GetValues(report->data, report->rptf, report->ext, report->key);
delete report;
}
else if (event.GetEventType() == GCPAD_UPDATE_CALLBACK)
{
GCPadStatus* pad = static_cast<GCPadStatus*>(event.GetClientData());
GetValues(pad);
delete pad;
}
}
void TASInputDlg::GetValues(GCPadStatus* PadStatus) void TASInputDlg::GetValues(GCPadStatus* PadStatus)
{ {
if (!IsShown() || !m_has_layout) if (!IsShown() || !m_has_layout)
return; return;
if (!wxIsMainThread())
{
GCPadStatus* status = new GCPadStatus(*PadStatus);
wxCommandEvent* evt = new wxCommandEvent(GCPAD_UPDATE_CALLBACK);
evt->SetClientData(status);
wxQueueEvent(this, evt);
return;
}
//TODO:: Make this instant not when polled. //TODO:: Make this instant not when polled.
GetKeyBoardInput(PadStatus); GetKeyBoardInput(PadStatus);
@ -875,6 +861,7 @@ void TASInputDlg::UpdateFromText(wxCommandEvent& event)
{ {
int v = (value > control->range) ? control->range : value; int v = (value > control->range) ? control->range : value;
control->slider->SetValue(v); control->slider->SetValue(v);
control->text->ChangeValue(std::to_string(v));
control->value = v; control->value = v;
} }
} }
@ -885,6 +872,7 @@ void TASInputDlg::UpdateFromText(wxCommandEvent& event)
{ {
int v = (value > control->range) ? control->range : value; int v = (value > control->range) ? control->range : value;
control->slider->SetValue(v); control->slider->SetValue(v);
control->text->ChangeValue(std::to_string(v));
control->value = v; control->value = v;
} }
} }
@ -1053,19 +1041,65 @@ void TASInputDlg::ButtonTurbo()
for (Button* const button : m_buttons) for (Button* const button : m_buttons)
{ {
if (button != nullptr && button->turbo_on) if (button != nullptr && button->turbo_on)
button->checkbox->SetValue(!button->checkbox->GetValue()); {
button->value = !button->checkbox->GetValue();
InvalidateButton(button);
}
} }
if (m_ext == 2) if (m_ext == 2)
{ {
for (Button const button : m_cc_buttons) for (Button& button : m_cc_buttons)
{ {
if (button.turbo_on) if (button.turbo_on)
button.checkbox->SetValue(!button.checkbox->GetValue()); {
button.value = !button.checkbox->GetValue();
InvalidateButton(&button);
}
} }
} }
} }
} }
void TASInputDlg::InvalidateButton(Button* button)
{
if (!wxIsMainThread())
{
wxCommandEvent* evt = new wxCommandEvent(INVALIDATE_BUTTON_EVENT, button->id);
evt->SetClientData(button);
wxQueueEvent(this, evt);
return;
}
button->checkbox->SetValue(button->value);
}
void TASInputDlg::InvalidateControl(Control* control)
{
if (!wxIsMainThread())
{
wxCommandEvent* evt = new wxCommandEvent(INVALIDATE_CONTROL_EVENT, control->text_id);
evt->SetClientData(control);
wxQueueEvent(this, evt);
return;
}
control->text->SetValue(std::to_string(control->value));
}
void TASInputDlg::UpdateFromInvalidatedButton(wxCommandEvent& event)
{
Button* button = static_cast<Button*>(event.GetClientData());
_assert_msg_(PAD, button->id == button->checkbox->GetId(), "Button ids do not match: %i != %i", button->id, button->checkbox->GetId());
button->checkbox->SetValue(button->value);
}
void TASInputDlg::UpdateFromInvalidatedControl(wxCommandEvent& event)
{
Control* control = static_cast<Control*>(event.GetClientData());
_assert_msg_(PAD, control->text_id == control->text->GetId(), "Control ids do not match: %i != %i", control->text_id, control->text->GetId());
control->text->SetValue(std::to_string(control->value));
}
wxBitmap TASInputDlg::CreateStickBitmap(int x, int y) wxBitmap TASInputDlg::CreateStickBitmap(int x, int y)
{ {
x = x / 2; x = x / 2;

View File

@ -70,6 +70,7 @@ class TASInputDlg : public wxDialog
struct Button struct Button
{ {
wxCheckBox* checkbox; wxCheckBox* checkbox;
bool value = false;
bool set_by_keyboard = false; bool set_by_keyboard = false;
bool turbo_on = false; bool turbo_on = false;
int id; int id;
@ -84,12 +85,15 @@ class TASInputDlg : public wxDialog
wxBoxSizer* CreateCCLayout(); wxBoxSizer* CreateCCLayout();
void FinishLayout(); void FinishLayout();
void GetValuesCallback(wxCommandEvent& event); void SetStickValue(Control* stick, int CurrentValue, int center = 128);
void SetStickValue(bool* ActivatedByKeyboard, int* AmountPressed, wxTextCtrl* Textbox, int CurrentValue, int center = 128);
void SetButtonValue(Button* button, bool CurrentState); void SetButtonValue(Button* button, bool CurrentState);
void SetSliderValue(Control* control, int CurrentValue); void SetSliderValue(Control* control, int CurrentValue);
void CreateBaseLayout(); void CreateBaseLayout();
void UpdateStickBitmap(Stick stick); void UpdateStickBitmap(Stick stick);
void InvalidateButton(Button* button);
void InvalidateControl(Control* button);
void UpdateFromInvalidatedButton(wxCommandEvent& event);
void UpdateFromInvalidatedControl(wxCommandEvent& event);
Stick* FindStickByID(int id); Stick* FindStickByID(int id);
Stick CreateStick(int id_stick, int xRange, int yRange, u32 defaultX, u32 defaultY, bool reverseX, bool reverseY); Stick CreateStick(int id_stick, int xRange, int yRange, u32 defaultX, u32 defaultY, bool reverseX, bool reverseY);
wxStaticBoxSizer* CreateStickLayout(Stick* tempStick, const wxString& title); wxStaticBoxSizer* CreateStickLayout(Stick* tempStick, const wxString& title);