From bbbe2f8916dcb9263a0050d86d012e1e9d649d32 Mon Sep 17 00:00:00 2001 From: O1L Date: Sat, 5 Apr 2014 18:26:45 +0400 Subject: [PATCH] GUI: Pad Settings dialog reworked. --- rpcs3/Emu/Io/Windows/WindowsPadHandler.h | 40 +- rpcs3/Gui/MainFrame.cpp | 205 +------- rpcs3/Gui/PADManager.cpp | 573 +++++++++++++++++++++++ rpcs3/Gui/PADManager.h | 102 ++++ rpcs3/Ini.h | 37 +- rpcs3/rpcs3.vcxproj | 3 +- rpcs3/rpcs3.vcxproj.filters | 5 +- 7 files changed, 738 insertions(+), 227 deletions(-) create mode 100644 rpcs3/Gui/PADManager.cpp create mode 100644 rpcs3/Gui/PADManager.h diff --git a/rpcs3/Emu/Io/Windows/WindowsPadHandler.h b/rpcs3/Emu/Io/Windows/WindowsPadHandler.h index a3464aecc5..257db117ea 100644 --- a/rpcs3/Emu/Io/Windows/WindowsPadHandler.h +++ b/rpcs3/Emu/Io/Windows/WindowsPadHandler.h @@ -39,27 +39,27 @@ public: CELL_PAD_CAPABILITY_PS3_CONFORMITY | CELL_PAD_CAPABILITY_PRESS_MODE, CELL_PAD_DEV_TYPE_STANDARD)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, static_cast(Ini.PadHandlerLeft.GetValue()), CELL_PAD_CTRL_LEFT)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, static_cast(Ini.PadHandlerDown.GetValue()), CELL_PAD_CTRL_DOWN)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, static_cast(Ini.PadHandlerRight.GetValue()), CELL_PAD_CTRL_RIGHT)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, static_cast(Ini.PadHandlerUp.GetValue()), CELL_PAD_CTRL_UP)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, WXK_RETURN, CELL_PAD_CTRL_START)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, static_cast(Ini.PadHandlerR3.GetValue()), CELL_PAD_CTRL_R3)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, static_cast(Ini.PadHandlerL3.GetValue()), CELL_PAD_CTRL_L3)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, WXK_SPACE, CELL_PAD_CTRL_SELECT)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, Ini.PadHandlerLeft.GetValue(), CELL_PAD_CTRL_LEFT)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, Ini.PadHandlerDown.GetValue(), CELL_PAD_CTRL_DOWN)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, Ini.PadHandlerRight.GetValue(), CELL_PAD_CTRL_RIGHT)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, Ini.PadHandlerUp.GetValue(), CELL_PAD_CTRL_UP)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, Ini.PadHandlerStart.GetValue(), CELL_PAD_CTRL_START)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, Ini.PadHandlerR3.GetValue(), CELL_PAD_CTRL_R3)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, Ini.PadHandlerL3.GetValue(), CELL_PAD_CTRL_L3)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL1, Ini.PadHandlerSelect.GetValue(), CELL_PAD_CTRL_SELECT)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, static_cast(Ini.PadHandlerSquare.GetValue()), CELL_PAD_CTRL_SQUARE)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, static_cast(Ini.PadHandlerCross.GetValue()), CELL_PAD_CTRL_CROSS)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, static_cast(Ini.PadHandlerCircle.GetValue()), CELL_PAD_CTRL_CIRCLE)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, static_cast(Ini.PadHandlerTriangle.GetValue()), CELL_PAD_CTRL_TRIANGLE)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, static_cast(Ini.PadHandlerR1.GetValue()), CELL_PAD_CTRL_R1)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, static_cast(Ini.PadHandlerL1.GetValue()), CELL_PAD_CTRL_L1)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, static_cast(Ini.PadHandlerR2.GetValue()), CELL_PAD_CTRL_R2)); - m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, static_cast(Ini.PadHandlerL2.GetValue()), CELL_PAD_CTRL_L2)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, Ini.PadHandlerSquare.GetValue(), CELL_PAD_CTRL_SQUARE)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, Ini.PadHandlerCross.GetValue(), CELL_PAD_CTRL_CROSS)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, Ini.PadHandlerCircle.GetValue(), CELL_PAD_CTRL_CIRCLE)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, Ini.PadHandlerTriangle.GetValue(), CELL_PAD_CTRL_TRIANGLE)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, Ini.PadHandlerR1.GetValue(), CELL_PAD_CTRL_R1)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, Ini.PadHandlerL1.GetValue(), CELL_PAD_CTRL_L1)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, Ini.PadHandlerR2.GetValue(), CELL_PAD_CTRL_R2)); + m_pads[0].m_buttons.Move(new Button(CELL_PAD_BTN_OFFSET_DIGITAL2, Ini.PadHandlerL2.GetValue(), CELL_PAD_CTRL_L2)); - m_pads[0].m_sticks.Move(new AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X, WXK_LEFT, WXK_RIGHT)); - m_pads[0].m_sticks.Move(new AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y, WXK_UP, WXK_DOWN)); - m_pads[0].m_sticks.Move(new AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X, WXK_HOME, WXK_END)); - m_pads[0].m_sticks.Move(new AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y, WXK_PAGEUP, WXK_PAGEDOWN)); + m_pads[0].m_sticks.Move(new AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_X, Ini.PadHandlerLStickLeft.GetValue(), Ini.PadHandlerLStickRight.GetValue())); + m_pads[0].m_sticks.Move(new AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y, Ini.PadHandlerLStickUp.GetValue(), Ini.PadHandlerLStickDown.GetValue())); + m_pads[0].m_sticks.Move(new AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X, Ini.PadHandlerRStickLeft.GetValue(), Ini.PadHandlerRStickRight.GetValue())); + m_pads[0].m_sticks.Move(new AnalogStick(CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y, Ini.PadHandlerRStickUp.GetValue(), Ini.PadHandlerRStickDown.GetValue())); } }; \ No newline at end of file diff --git a/rpcs3/Gui/MainFrame.cpp b/rpcs3/Gui/MainFrame.cpp index e374be004e..c84ff1e539 100644 --- a/rpcs3/Gui/MainFrame.cpp +++ b/rpcs3/Gui/MainFrame.cpp @@ -3,6 +3,7 @@ #include "CompilerELF.h" #include "MemoryViewer.h" #include "RSXDebugger.h" +#include "PADManager.h" #include "git-version.h" #include "Ini.h" @@ -38,26 +39,6 @@ enum IDs id_update_dbg, }; -enum PadIDs -{ - id_pad_left, - id_pad_down, - id_pad_right, - id_pad_up, - id_pad_start, - id_pad_r3, - id_pad_l3, - id_pad_select, - id_pad_square, - id_pad_cross, - id_pad_circle, - id_pad_triangle, - id_pad_r1, - id_pad_l1, - id_pad_r2, - id_pad_l2, -}; - wxString GetPaneName() { static int pane_num = 0; @@ -574,189 +555,7 @@ void MainFrame::Config(wxCommandEvent& WXUNUSED(event)) void MainFrame::ConfigPad(wxCommandEvent& WXUNUSED(event)) { - bool paused = false; - - if(Emu.IsRunning()) - { - Emu.Pause(); - paused = true; - } - - wxDialog diag(this, wxID_ANY, "PAD Settings", wxDefaultPosition); - - wxBoxSizer* s_panel(new wxBoxSizer(wxHORIZONTAL)); - wxBoxSizer* s_subpanel1(new wxBoxSizer(wxVERTICAL)); - wxBoxSizer* s_subpanel2(new wxBoxSizer(wxVERTICAL)); - wxBoxSizer* s_subpanel3(new wxBoxSizer(wxVERTICAL)); - wxBoxSizer* s_subpanel4(new wxBoxSizer(wxVERTICAL)); - wxBoxSizer* s_subpanel5(new wxBoxSizer(wxVERTICAL)); - - wxStaticBoxSizer* s_round_pad_controls( new wxStaticBoxSizer( wxVERTICAL, &diag, _("Controls") ) ); - wxStaticBoxSizer* s_round_pad_left( new wxStaticBoxSizer( wxVERTICAL, &diag, _("LEFT") ) ); - wxStaticBoxSizer* s_round_pad_down( new wxStaticBoxSizer( wxVERTICAL, &diag, _("DOWN") ) ); - wxStaticBoxSizer* s_round_pad_right( new wxStaticBoxSizer( wxVERTICAL, &diag, _("RIGHT") ) ); - wxStaticBoxSizer* s_round_pad_up( new wxStaticBoxSizer( wxVERTICAL, &diag, _("UP") ) ); - - wxStaticBoxSizer* s_round_pad_shifts_l( new wxStaticBoxSizer( wxVERTICAL, &diag, _("Shifts") ) ); - wxStaticBoxSizer* s_round_pad_l1( new wxStaticBoxSizer( wxVERTICAL, &diag, _("L1") ) ); - wxStaticBoxSizer* s_round_pad_l2( new wxStaticBoxSizer( wxVERTICAL, &diag, _("L2") ) ); - wxStaticBoxSizer* s_round_pad_l3( new wxStaticBoxSizer( wxVERTICAL, &diag, _("L3") ) ); - - wxStaticBoxSizer* s_round_pad_system( new wxStaticBoxSizer( wxVERTICAL, &diag, _("System") ) ); - wxStaticBoxSizer* s_round_pad_select( new wxStaticBoxSizer( wxVERTICAL, &diag, _("SELECT") ) ); - wxStaticBoxSizer* s_round_pad_start( new wxStaticBoxSizer( wxVERTICAL, &diag, _("START") ) ); - - wxStaticBoxSizer* s_round_pad_shifts_r( new wxStaticBoxSizer( wxVERTICAL, &diag, _("Shifts") ) ); - wxStaticBoxSizer* s_round_pad_r1( new wxStaticBoxSizer( wxVERTICAL, &diag, _("R1") ) ); - wxStaticBoxSizer* s_round_pad_r2( new wxStaticBoxSizer( wxVERTICAL, &diag, _("R2") ) ); - wxStaticBoxSizer* s_round_pad_r3( new wxStaticBoxSizer( wxVERTICAL, &diag, _("R3") ) ); - - wxStaticBoxSizer* s_round_pad_buttons( new wxStaticBoxSizer( wxVERTICAL, &diag, _("Buttons") ) ); - wxStaticBoxSizer* s_round_pad_square( new wxStaticBoxSizer( wxVERTICAL, &diag, _("SQUARE") ) ); - wxStaticBoxSizer* s_round_pad_cross( new wxStaticBoxSizer( wxVERTICAL, &diag, _("CROSS") ) ); - wxStaticBoxSizer* s_round_pad_circle( new wxStaticBoxSizer( wxVERTICAL, &diag, _("CIRCLE") ) ); - wxStaticBoxSizer* s_round_pad_triangle( new wxStaticBoxSizer( wxVERTICAL, &diag, _("TRIANGLE") ) ); - - - wxComboBox* cbox_pad_left = new wxComboBox(&diag, wxID_ANY); - wxComboBox* cbox_pad_down = new wxComboBox(&diag, wxID_ANY); - wxComboBox* cbox_pad_right = new wxComboBox(&diag, wxID_ANY); - wxComboBox* cbox_pad_up = new wxComboBox(&diag, wxID_ANY); - wxComboBox* cbox_pad_start = new wxComboBox(&diag, wxID_ANY); - wxComboBox* cbox_pad_r3 = new wxComboBox(&diag, wxID_ANY); - wxComboBox* cbox_pad_l3 = new wxComboBox(&diag, wxID_ANY); - wxComboBox* cbox_pad_select = new wxComboBox(&diag, wxID_ANY); - wxComboBox* cbox_pad_square = new wxComboBox(&diag, wxID_ANY); - wxComboBox* cbox_pad_cross = new wxComboBox(&diag, wxID_ANY); - wxComboBox* cbox_pad_circle = new wxComboBox(&diag, wxID_ANY); - wxComboBox* cbox_pad_triangle = new wxComboBox(&diag, wxID_ANY); - wxComboBox* cbox_pad_r1 = new wxComboBox(&diag, wxID_ANY); - wxComboBox* cbox_pad_l1 = new wxComboBox(&diag, wxID_ANY); - wxComboBox* cbox_pad_r2 = new wxComboBox(&diag, wxID_ANY); - wxComboBox* cbox_pad_l2 = new wxComboBox(&diag, wxID_ANY); - - for(int i=0; i<128; i++) - { - cbox_pad_left->Append (wxString::Format("%c", static_cast(i) ) ); - cbox_pad_down->Append (wxString::Format("%c", static_cast(i) ) ); - cbox_pad_right->Append (wxString::Format("%c", static_cast(i) ) ); - cbox_pad_up->Append (wxString::Format("%c", static_cast(i) ) ); - cbox_pad_r3->Append (wxString::Format("%c", static_cast(i) ) ); - cbox_pad_l3->Append (wxString::Format("%c", static_cast(i) ) ); - cbox_pad_square->Append (wxString::Format("%c", static_cast(i) ) ); - cbox_pad_cross->Append (wxString::Format("%c", static_cast(i) ) ); - cbox_pad_circle->Append (wxString::Format("%c", static_cast(i) ) ); - cbox_pad_triangle->Append(wxString::Format("%c", static_cast(i) ) ); - cbox_pad_r1->Append (wxString::Format("%c", static_cast(i) ) ); - cbox_pad_l1->Append (wxString::Format("%c", static_cast(i) ) ); - cbox_pad_r2->Append (wxString::Format("%c", static_cast(i) ) ); - cbox_pad_l2->Append (wxString::Format("%c", static_cast(i) ) ); - } - - cbox_pad_start->Append("Enter"); - cbox_pad_select->Append("Space"); - - cbox_pad_left->SetSelection (Ini.PadHandlerLeft.GetValue()); - cbox_pad_down->SetSelection (Ini.PadHandlerDown.GetValue()); - cbox_pad_right->SetSelection (Ini.PadHandlerRight.GetValue()); - cbox_pad_up->SetSelection (Ini.PadHandlerUp.GetValue()); - cbox_pad_start->SetSelection (Ini.PadHandlerStart.GetValue()); - cbox_pad_r3->SetSelection (Ini.PadHandlerR3.GetValue()); - cbox_pad_l3->SetSelection (Ini.PadHandlerL3.GetValue()); - cbox_pad_select->SetSelection (Ini.PadHandlerSelect.GetValue()); - cbox_pad_square->SetSelection (Ini.PadHandlerSquare.GetValue()); - cbox_pad_cross->SetSelection (Ini.PadHandlerCross.GetValue()); - cbox_pad_circle->SetSelection (Ini.PadHandlerCircle.GetValue()); - cbox_pad_triangle->SetSelection (Ini.PadHandlerTriangle.GetValue()); - cbox_pad_r1->SetSelection (Ini.PadHandlerR1.GetValue()); - cbox_pad_l1->SetSelection (Ini.PadHandlerL1.GetValue()); - cbox_pad_r2->SetSelection (Ini.PadHandlerR2.GetValue()); - cbox_pad_l2->SetSelection (Ini.PadHandlerL2.GetValue()); - - s_round_pad_left->Add(cbox_pad_left, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_down->Add(cbox_pad_down, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_right->Add(cbox_pad_right, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_up->Add(cbox_pad_up, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_start->Add(cbox_pad_start, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_r3->Add(cbox_pad_r3, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_l3->Add(cbox_pad_l3, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_select->Add(cbox_pad_select, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_square->Add(cbox_pad_square, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_cross->Add(cbox_pad_cross, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_circle->Add(cbox_pad_circle, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_triangle->Add(cbox_pad_triangle, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_r1->Add(cbox_pad_r1, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_l1->Add(cbox_pad_l1, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_r2->Add(cbox_pad_r2, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_l2->Add(cbox_pad_l2, wxSizerFlags().Border(wxALL, 5).Expand()); - - - s_round_pad_controls->Add(s_round_pad_left, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_controls->Add(s_round_pad_down, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_controls->Add(s_round_pad_right, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_controls->Add(s_round_pad_up, wxSizerFlags().Border(wxALL, 5).Expand()); - - - s_round_pad_shifts_l->Add(s_round_pad_l1, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_shifts_l->Add(s_round_pad_l2, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_shifts_l->Add(s_round_pad_l3, wxSizerFlags().Border(wxALL, 5).Expand()); - - s_round_pad_system->Add(s_round_pad_start, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_system->Add(s_round_pad_select, wxSizerFlags().Border(wxALL, 5).Expand()); - - s_round_pad_shifts_r->Add(s_round_pad_r1, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_shifts_r->Add(s_round_pad_r2, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_shifts_r->Add(s_round_pad_r3, wxSizerFlags().Border(wxALL, 5).Expand()); - - - s_round_pad_buttons->Add(s_round_pad_square, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_buttons->Add(s_round_pad_cross, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_buttons->Add(s_round_pad_circle, wxSizerFlags().Border(wxALL, 5).Expand()); - s_round_pad_buttons->Add(s_round_pad_triangle, wxSizerFlags().Border(wxALL, 5).Expand()); - - wxBoxSizer* s_b_panel(new wxBoxSizer(wxHORIZONTAL)); - - s_b_panel->Add(new wxButton(&diag, wxID_OK), wxSizerFlags().Border(wxALL, 5).Center()); - s_b_panel->Add(new wxButton(&diag, wxID_CANCEL), wxSizerFlags().Border(wxALL, 5).Center()); - - s_subpanel1->Add(s_round_pad_controls, wxSizerFlags().Border(wxALL, 5).Expand()); - s_subpanel2->Add(s_round_pad_shifts_l, wxSizerFlags().Border(wxALL, 5).Expand()); - s_subpanel3->Add(s_round_pad_system, wxSizerFlags().Border(wxALL, 5).Expand()); - s_subpanel3->Add(s_b_panel, wxSizerFlags().Border(wxALL, 8).Expand()); - s_subpanel4->Add(s_round_pad_shifts_r, wxSizerFlags().Border(wxALL, 5).Expand()); - s_subpanel5->Add(s_round_pad_buttons, wxSizerFlags().Border(wxALL, 5).Expand()); - - s_panel->Add(s_subpanel1, wxSizerFlags().Border(wxALL, 5).Expand()); - s_panel->Add(s_subpanel2, wxSizerFlags().Border(wxALL, 5).Expand()); - s_panel->Add(s_subpanel3, wxSizerFlags().Border(wxALL, 5).Expand()); - s_panel->Add(s_subpanel4, wxSizerFlags().Border(wxALL, 5).Expand()); - s_panel->Add(s_subpanel5, wxSizerFlags().Border(wxALL, 5).Expand()); - - diag.SetSizerAndFit( s_panel ); - - if(diag.ShowModal() == wxID_OK) - { - Ini.PadHandlerLeft.SetValue(cbox_pad_left->GetSelection()); - Ini.PadHandlerDown.SetValue(cbox_pad_down->GetSelection()); - Ini.PadHandlerRight.SetValue(cbox_pad_right->GetSelection()); - Ini.PadHandlerUp.SetValue(cbox_pad_up->GetSelection()); - Ini.PadHandlerStart.SetValue(cbox_pad_start->GetSelection()); - Ini.PadHandlerR3.SetValue(cbox_pad_r3->GetSelection()); - Ini.PadHandlerL3.SetValue(cbox_pad_l3->GetSelection()); - Ini.PadHandlerSelect.SetValue(cbox_pad_select->GetSelection()); - Ini.PadHandlerSquare.SetValue(cbox_pad_square->GetSelection()); - Ini.PadHandlerCross.SetValue(cbox_pad_cross->GetSelection()); - Ini.PadHandlerCircle.SetValue(cbox_pad_circle->GetSelection()); - Ini.PadHandlerTriangle.SetValue(cbox_pad_triangle->GetSelection()); - Ini.PadHandlerR1.SetValue(cbox_pad_r1->GetSelection()); - Ini.PadHandlerL1.SetValue(cbox_pad_l1->GetSelection()); - Ini.PadHandlerR2.SetValue(cbox_pad_r2->GetSelection()); - Ini.PadHandlerL2.SetValue(cbox_pad_l2->GetSelection()); - - Ini.Save(); - } - - if(paused) Emu.Resume(); + PADManager(this).ShowModal(); } void MainFrame::ConfigVFS(wxCommandEvent& WXUNUSED(event)) diff --git a/rpcs3/Gui/PADManager.cpp b/rpcs3/Gui/PADManager.cpp new file mode 100644 index 0000000000..fd7ef34f98 --- /dev/null +++ b/rpcs3/Gui/PADManager.cpp @@ -0,0 +1,573 @@ +#include "stdafx.h" +#include "PADManager.h" + +PADManager::PADManager(wxWindow* parent) + : wxDialog(parent, wxID_ANY, "PAD Settings", wxDefaultPosition) + , m_button_id(0) + , m_key_pressed(false) +{ + bool paused = false; + + if(Emu.IsRunning()) + { + Emu.Pause(); + paused = true; + } + + wxBoxSizer* s_panel(new wxBoxSizer(wxHORIZONTAL)); + wxBoxSizer* s_subpanel(new wxBoxSizer(wxVERTICAL)); + wxBoxSizer* s_subpanel2(new wxBoxSizer(wxVERTICAL)); + + // Left Analog Stick + wxStaticBoxSizer* s_round_stick_l( new wxStaticBoxSizer( wxVERTICAL, this, _("Left Analog Stick") ) ); + wxBoxSizer* s_subpanel_lstick_1( new wxBoxSizer( wxVERTICAL) ); + wxBoxSizer* s_subpanel_lstick_2( new wxBoxSizer( wxHORIZONTAL) ); + wxBoxSizer* s_subpanel_lstick_3( new wxBoxSizer( wxVERTICAL) ); + + // D-Pad + wxStaticBoxSizer* s_round_pad_controls( new wxStaticBoxSizer( wxVERTICAL, this, _("D-Pad") ) ); + wxBoxSizer* s_subpanel_pad_1( new wxBoxSizer( wxVERTICAL) ); + wxBoxSizer* s_subpanel_pad_2( new wxBoxSizer( wxHORIZONTAL) ); + wxBoxSizer* s_subpanel_pad_3( new wxBoxSizer( wxVERTICAL) ); + + // Left shifts + wxStaticBoxSizer* s_round_pad_shifts_l( new wxStaticBoxSizer( wxVERTICAL, this, _("Left Shifts") ) ); + wxStaticBoxSizer* s_round_pad_l1( new wxStaticBoxSizer( wxVERTICAL, this, _("L1") ) ); + wxStaticBoxSizer* s_round_pad_l2( new wxStaticBoxSizer( wxVERTICAL, this, _("L2") ) ); + wxStaticBoxSizer* s_round_pad_l3( new wxStaticBoxSizer( wxVERTICAL, this, _("L3") ) ); + + // Start / Select + wxStaticBoxSizer* s_round_pad_system( new wxStaticBoxSizer( wxVERTICAL, this, _("System") ) ); + wxStaticBoxSizer* s_round_pad_select( new wxStaticBoxSizer( wxVERTICAL, this, _("Select") ) ); + wxStaticBoxSizer* s_round_pad_start( new wxStaticBoxSizer( wxVERTICAL, this, _("Start") ) ); + + // Right shifts + wxStaticBoxSizer* s_round_pad_shifts_r( new wxStaticBoxSizer( wxVERTICAL, this, _("Right Shifts") ) ); + wxStaticBoxSizer* s_round_pad_r1( new wxStaticBoxSizer( wxVERTICAL, this, _("R1") ) ); + wxStaticBoxSizer* s_round_pad_r2( new wxStaticBoxSizer( wxVERTICAL, this, _("R2") ) ); + wxStaticBoxSizer* s_round_pad_r3( new wxStaticBoxSizer( wxVERTICAL, this, _("R3") ) ); + + // Action buttons + wxStaticBoxSizer* s_round_pad_buttons( new wxStaticBoxSizer( wxVERTICAL, this, _("Buttons") ) ); + wxStaticBoxSizer* s_round_pad_square( new wxStaticBoxSizer( wxVERTICAL, this, _("Square") ) ); + wxStaticBoxSizer* s_round_pad_cross( new wxStaticBoxSizer( wxVERTICAL, this, _("Cross") ) ); + wxStaticBoxSizer* s_round_pad_circle( new wxStaticBoxSizer( wxVERTICAL, this, _("Circle") ) ); + wxStaticBoxSizer* s_round_pad_triangle( new wxStaticBoxSizer( wxVERTICAL, this, _("Triangle") ) ); + wxBoxSizer* s_subpanel_buttons_1( new wxBoxSizer( wxVERTICAL) ); + wxBoxSizer* s_subpanel_buttons_2( new wxBoxSizer( wxHORIZONTAL) ); + wxBoxSizer* s_subpanel_buttons_3( new wxBoxSizer( wxVERTICAL) ); + + // Right Analog Stick + wxStaticBoxSizer* s_round_stick_r( new wxStaticBoxSizer( wxVERTICAL, this, _("Right Analog Stick") ) ); + wxBoxSizer* s_subpanel_rstick_1( new wxBoxSizer( wxVERTICAL) ); + wxBoxSizer* s_subpanel_rstick_2( new wxBoxSizer( wxHORIZONTAL) ); + wxBoxSizer* s_subpanel_rstick_3( new wxBoxSizer( wxVERTICAL) ); + + // Ok / Cancel + wxBoxSizer* s_b_panel(new wxBoxSizer(wxHORIZONTAL)); + + wxBoxSizer* s_reset_panel(new wxBoxSizer(wxHORIZONTAL)); + + #define ButtonParameters wxEmptyString, wxDefaultPosition, wxSize(60,-1) + #define SizerFlags wxSizerFlags().Border(wxALL, 3).Center() + + + // Buttons + b_up_lstick = new wxButton(this, id_pad_lstick_up, ButtonParameters); + b_down_lstick = new wxButton(this, id_pad_lstick_down, ButtonParameters); + b_left_lstick = new wxButton(this, id_pad_lstick_left, ButtonParameters); + b_right_lstick = new wxButton(this, id_pad_lstick_right, ButtonParameters); + + b_up = new wxButton(this, id_pad_up, ButtonParameters); + b_down = new wxButton(this, id_pad_down, ButtonParameters); + b_left = new wxButton(this, id_pad_left, ButtonParameters); + b_right = new wxButton(this, id_pad_right, ButtonParameters); + + b_shift_l1 = new wxButton(this, id_pad_l1, ButtonParameters); + b_shift_l2 = new wxButton(this, id_pad_l2, ButtonParameters); + b_shift_l3 = new wxButton(this, id_pad_l3, ButtonParameters); + + b_start = new wxButton(this, id_pad_start, ButtonParameters); + b_select = new wxButton(this, id_pad_select, ButtonParameters); + + b_shift_r1 = new wxButton(this, id_pad_r1, ButtonParameters); + b_shift_r2 = new wxButton(this, id_pad_r2, ButtonParameters); + b_shift_r3 = new wxButton(this, id_pad_r3, ButtonParameters); + + b_square = new wxButton(this, id_pad_square, ButtonParameters); + b_cross = new wxButton(this, id_pad_cross, ButtonParameters); + b_circle = new wxButton(this, id_pad_circle, ButtonParameters); + b_triangle = new wxButton(this, id_pad_triangle, ButtonParameters); + + b_up_rstick = new wxButton(this, id_pad_rstick_up, ButtonParameters); + b_down_rstick = new wxButton(this, id_pad_rstick_down, ButtonParameters); + b_left_rstick = new wxButton(this, id_pad_rstick_left, ButtonParameters); + b_right_rstick = new wxButton(this, id_pad_rstick_right, ButtonParameters); + + b_ok = new wxButton(this, wxID_OK, "OK", wxDefaultPosition, wxSize(60,-1)); + b_cancel = new wxButton(this, wxID_CANCEL, "Cancel", wxDefaultPosition, wxSize(60,-1)); + b_reset = new wxButton(this, id_reset_parameters, "By default"); + + + // Get button labels from .ini + UpdateLabel(); + + // Add buttons in subpanels + // LStick + s_subpanel_lstick_1->Add(b_up_lstick); + s_subpanel_lstick_2->Add(b_left_lstick); + s_subpanel_lstick_2->Add(b_right_lstick); + s_subpanel_lstick_3->Add(b_down_lstick); + + // D-Pad + s_subpanel_pad_1->Add(b_up); + s_subpanel_pad_2->Add(b_left); + s_subpanel_pad_2->Add(b_right); + s_subpanel_pad_3->Add(b_down); + + // Left shifts + s_round_pad_l1->Add(b_shift_l1); + s_round_pad_l2->Add(b_shift_l2); + s_round_pad_l3->Add(b_shift_l3); + + // Start / Select + s_round_pad_select->Add(b_select); + s_round_pad_start->Add(b_start); + + // Right shifts + s_round_pad_r1->Add(b_shift_r1); + s_round_pad_r2->Add(b_shift_r2); + s_round_pad_r3->Add(b_shift_r3); + + // Action buttons + s_round_pad_square->Add(b_square); + s_round_pad_cross->Add(b_cross); + s_round_pad_circle->Add(b_circle); + s_round_pad_triangle->Add(b_triangle); + s_subpanel_buttons_1->Add(s_round_pad_triangle); + s_subpanel_buttons_2->Add(s_round_pad_square); + s_subpanel_buttons_2->Add(s_round_pad_circle); + s_subpanel_buttons_3->Add(s_round_pad_cross); + + // RStick + s_subpanel_rstick_1->Add(b_up_rstick); + s_subpanel_rstick_2->Add(b_left_rstick); + s_subpanel_rstick_2->Add(b_right_rstick); + s_subpanel_rstick_3->Add(b_down_rstick); + + // Ok / Cancel + s_b_panel->Add(b_ok); + s_b_panel->Add(b_cancel); + + // Reset parameters + s_reset_panel->Add(b_reset); + + s_round_stick_l->Add(s_subpanel_lstick_1, SizerFlags); + s_round_stick_l->Add(s_subpanel_lstick_2, SizerFlags); + s_round_stick_l->Add(s_subpanel_lstick_3, SizerFlags); + + s_round_pad_controls->Add(s_subpanel_pad_1, SizerFlags); + s_round_pad_controls->Add(s_subpanel_pad_2, SizerFlags); + s_round_pad_controls->Add(s_subpanel_pad_3, SizerFlags); + + s_round_pad_shifts_l->Add(s_round_pad_l1, SizerFlags); + s_round_pad_shifts_l->Add(s_round_pad_l2, SizerFlags); + s_round_pad_shifts_l->Add(s_round_pad_l3, SizerFlags); + + s_round_pad_system->Add(s_round_pad_select, SizerFlags); + s_round_pad_system->Add(s_round_pad_start, SizerFlags); + + s_round_pad_shifts_r->Add(s_round_pad_r1, SizerFlags); + s_round_pad_shifts_r->Add(s_round_pad_r2, SizerFlags); + s_round_pad_shifts_r->Add(s_round_pad_r3, SizerFlags); + + s_round_pad_buttons->Add(s_subpanel_buttons_1, SizerFlags); + s_round_pad_buttons->Add(s_subpanel_buttons_2, SizerFlags); + s_round_pad_buttons->Add(s_subpanel_buttons_3, SizerFlags); + + s_round_stick_r->Add(s_subpanel_rstick_1, SizerFlags); + s_round_stick_r->Add(s_subpanel_rstick_2, SizerFlags); + s_round_stick_r->Add(s_subpanel_rstick_3, SizerFlags); + + + s_subpanel->Add(s_round_stick_l); + s_subpanel->AddSpacer(50); + s_subpanel->Add(s_b_panel, SizerFlags); + + s_subpanel2->Add(s_round_pad_controls); + s_subpanel2->AddSpacer(50); + s_subpanel2->Add(s_reset_panel, SizerFlags); + + // Add subpanels in general panel + s_panel->Add(s_subpanel); + s_panel->Add(s_subpanel2); + s_panel->Add(s_round_pad_shifts_l); + s_panel->Add(s_round_pad_system); + s_panel->Add(s_round_pad_shifts_r); + s_panel->Add(s_round_pad_buttons); + s_panel->Add(s_round_stick_r); + + this->SetSizerAndFit(s_panel); + + // Connect buttons + m_app_connector.Connect(wxID_ANY, wxEVT_KEY_UP, wxKeyEventHandler(PADManager::OnKeyUp), (wxObject*)0, this); + m_app_connector.Connect(wxID_ANY, wxEVT_KEY_DOWN, wxKeyEventHandler(PADManager::OnKeyDown), (wxObject*)0, this); + Connect(b_up_lstick->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_down_lstick->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_left_lstick->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_right_lstick->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + + Connect(b_up->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler (PADManager::OnButtonClicked)); + Connect(b_down->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_left->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_right->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + + Connect(b_shift_l1->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_shift_l2->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_shift_l3->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + + Connect(b_start->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_select->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + + Connect(b_shift_r1->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_shift_r2->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_shift_r3->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + + Connect(b_square->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_cross->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_circle->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_triangle->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + + Connect(b_up_rstick->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_down_rstick->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_left_rstick->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_right_rstick->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + + Connect(b_ok->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_reset->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + Connect(b_cancel->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(PADManager::OnButtonClicked)); + + if(paused) Emu.Resume(); +} + +void PADManager::OnKeyDown(wxKeyEvent &keyEvent) +{ + m_key_pressed = true; + + switch (m_button_id) + { + case id_pad_lstick_left: Ini.PadHandlerLStickLeft.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_lstick_down: Ini.PadHandlerLStickDown.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_lstick_right: Ini.PadHandlerLStickRight.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_lstick_up: Ini.PadHandlerLStickUp.SetValue(keyEvent.GetKeyCode()); break; + + case id_pad_left: Ini.PadHandlerLeft.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_down: Ini.PadHandlerDown.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_right: Ini.PadHandlerRight.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_up: Ini.PadHandlerUp.SetValue(keyEvent.GetKeyCode()); break; + + case id_pad_l1: Ini.PadHandlerL1.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_l2: Ini.PadHandlerL2.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_l3: Ini.PadHandlerL3.SetValue(keyEvent.GetKeyCode()); break; + + case id_pad_start: Ini.PadHandlerStart.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_select: Ini.PadHandlerSelect.SetValue(keyEvent.GetKeyCode()); break; + + case id_pad_r1: Ini.PadHandlerR1.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_r2: Ini.PadHandlerR2.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_r3: Ini.PadHandlerR3.SetValue(keyEvent.GetKeyCode()); break; + + case id_pad_square: Ini.PadHandlerSquare.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_cross: Ini.PadHandlerCross.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_circle: Ini.PadHandlerCircle.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_triangle: Ini.PadHandlerTriangle.SetValue(keyEvent.GetKeyCode()); break; + + case id_pad_rstick_left: Ini.PadHandlerRStickLeft.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_rstick_down: Ini.PadHandlerRStickDown.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_rstick_right: Ini.PadHandlerRStickRight.SetValue(keyEvent.GetKeyCode()); break; + case id_pad_rstick_up: Ini.PadHandlerRStickUp.SetValue(keyEvent.GetKeyCode()); break; + + case 0: break; + default: ConLog.Error("Unknown button ID: %d", m_button_id); break; + } + + UpdateLabel(); + keyEvent.Skip(); +} + +void PADManager::OnKeyUp(wxKeyEvent &keyEvent) +{ + SwitchButtons(true); // enable all buttons + m_button_id = 0; // reset current button id + m_key_pressed = false; + keyEvent.Skip(); +} + +void PADManager::OnButtonClicked(wxCommandEvent &event) +{ + if (event.GetId() != wxID_OK && event.GetId() != wxID_CANCEL && event.GetId() != id_reset_parameters) + { + m_button_id = event.GetId(); + 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(); + } + + else + { + switch (event.GetId()) + { + case id_reset_parameters: ResetParameters(); UpdateLabel(); break; + case wxID_OK: Ini.Save(); break; + case wxID_CANCEL: break; + + default: ConLog.Error("Unknown button ID: %d", event.GetId()); break; + } + } + + event.Skip(); +} + +const wxString PADManager::GetKeyName(const u32 keyCode) +{ + wxString keyName; + + switch(keyCode) + { + case WXK_NONE: ConLog.Error("Invalid key code"); keyName = "ERROR!"; break; + case WXK_BACK: keyName = "BackSpace"; break; + case WXK_TAB: keyName = "Tab"; break; + case WXK_RETURN: keyName = "Enter"; break; + case WXK_ESCAPE: keyName = "Esc"; break; + case WXK_SPACE: keyName = "Space"; break; + case WXK_DELETE: keyName = "Delete"; break; + case WXK_SHIFT: keyName = "Shift"; break; + case WXK_ALT: keyName = "ALT"; break; + case WXK_CONTROL: keyName = "CTRL"; break; + case WXK_PAUSE: keyName = "Pause"; break; + case WXK_CAPITAL: keyName = "CapsLock"; break; + case WXK_END: keyName = "End"; break; + case WXK_HOME: keyName = "Home"; break; + case WXK_LEFT: keyName = "Left"; break; + case WXK_UP: keyName = "Up"; break; + case WXK_RIGHT: keyName = "Right"; break; + case WXK_DOWN: keyName = "Down"; break; + case WXK_SELECT: keyName = "Select"; break; + case WXK_PRINT: keyName = "Print"; break; + case WXK_SNAPSHOT: keyName = "Snapshot"; break; + case WXK_INSERT: keyName = "Insert"; break; + case WXK_NUMPAD0: keyName = "Num0"; break; + case WXK_NUMPAD1: keyName = "Num1"; break; + case WXK_NUMPAD2: keyName = "Num2"; break; + case WXK_NUMPAD3: keyName = "Num3"; break; + case WXK_NUMPAD4: keyName = "Num4"; break; + case WXK_NUMPAD5: keyName = "Num5"; break; + case WXK_NUMPAD6: keyName = "Num6"; break; + case WXK_NUMPAD7: keyName = "Num7"; break; + case WXK_NUMPAD8: keyName = "Num8"; break; + case WXK_NUMPAD9: keyName = "Num9"; break; + case WXK_F1: keyName = "F1"; break; + case WXK_F2: keyName = "F2"; break; + case WXK_F3: keyName = "F3"; break; + case WXK_F4: keyName = "F4"; break; + case WXK_F5: keyName = "F5"; break; + case WXK_F6: keyName = "F6"; break; + case WXK_F7: keyName = "F7"; break; + case WXK_F8: keyName = "F8"; break; + case WXK_F9: keyName = "F9"; break; + case WXK_F10: keyName = "F10"; break; + case WXK_F11: keyName = "F11"; break; + case WXK_F12: keyName = "F12"; break; + case WXK_NUMLOCK: keyName = "NumLock"; break; + case WXK_SCROLL: keyName = "ScrollLock"; break; + case WXK_PAGEUP: keyName = "PgUp"; break; + case WXK_PAGEDOWN: keyName = "PgDn"; break; + case WXK_NUMPAD_SPACE: keyName = "NumSpace"; break; + case WXK_NUMPAD_TAB: keyName = "NumTab"; break; + case WXK_NUMPAD_ENTER: keyName = "NumEnter"; break; + case WXK_NUMPAD_HOME: keyName = "NumHome"; break; + case WXK_NUMPAD_LEFT: keyName = "NumLeft"; break; + case WXK_NUMPAD_UP: keyName = "NumUp"; break; + case WXK_NUMPAD_RIGHT: keyName = "NumRight"; break; + case WXK_NUMPAD_DOWN: keyName = "NumDown"; break; + case WXK_NUMPAD_PAGEUP: keyName = "NumPgUp"; break; + case WXK_NUMPAD_PAGEDOWN: keyName = "NumPgDn"; break; + case WXK_NUMPAD_END: keyName = "NumEnd"; break; + case WXK_NUMPAD_BEGIN: keyName = "NumHome"; break; + case WXK_NUMPAD_INSERT: keyName = "NumIns"; break; + case WXK_NUMPAD_DELETE: keyName = "NumDel"; break; + + default: keyName = static_cast(keyCode); break; + } + + return keyName; +} + +void PADManager::UpdateLabel() +{ + // Get button labels from .ini + b_up_lstick->SetLabel(GetKeyName(Ini.PadHandlerLStickUp.GetValue())); + b_down_lstick->SetLabel(GetKeyName(Ini.PadHandlerLStickDown.GetValue())); + b_left_lstick->SetLabel(GetKeyName(Ini.PadHandlerLStickLeft.GetValue())); + b_right_lstick->SetLabel(GetKeyName(Ini.PadHandlerLStickRight.GetValue())); + + b_up->SetLabel(GetKeyName(Ini.PadHandlerUp.GetValue())); + b_down->SetLabel(GetKeyName(Ini.PadHandlerDown.GetValue())); + b_left->SetLabel(GetKeyName(Ini.PadHandlerLeft.GetValue())); + b_right->SetLabel(GetKeyName(Ini.PadHandlerRight.GetValue())); + + b_shift_l1->SetLabel(GetKeyName(Ini.PadHandlerL1.GetValue())); + b_shift_l2->SetLabel(GetKeyName(Ini.PadHandlerL2.GetValue())); + b_shift_l3->SetLabel(GetKeyName(Ini.PadHandlerL3.GetValue())); + + b_start->SetLabel(GetKeyName(Ini.PadHandlerStart.GetValue())); + b_select->SetLabel(GetKeyName(Ini.PadHandlerSelect.GetValue())); + + b_shift_r1->SetLabel(GetKeyName(Ini.PadHandlerR1.GetValue())); + b_shift_r2->SetLabel(GetKeyName(Ini.PadHandlerR2.GetValue())); + b_shift_r3->SetLabel(GetKeyName(Ini.PadHandlerR3.GetValue())); + + b_square->SetLabel(GetKeyName(Ini.PadHandlerSquare.GetValue())); + b_cross->SetLabel(GetKeyName(Ini.PadHandlerCross.GetValue())); + b_circle->SetLabel(GetKeyName(Ini.PadHandlerCircle.GetValue())); + b_triangle->SetLabel(GetKeyName(Ini.PadHandlerTriangle.GetValue())); + + b_up_rstick->SetLabel(GetKeyName(Ini.PadHandlerRStickUp.GetValue())); + b_down_rstick->SetLabel(GetKeyName(Ini.PadHandlerRStickDown.GetValue())); + b_left_rstick->SetLabel(GetKeyName(Ini.PadHandlerRStickLeft.GetValue())); + b_right_rstick->SetLabel(GetKeyName(Ini.PadHandlerRStickRight.GetValue())); +} + +void PADManager::ResetParameters() +{ + Ini.PadHandlerLStickUp.SetValue(315); + Ini.PadHandlerLStickDown.SetValue(317); + Ini.PadHandlerLStickLeft.SetValue(314); + Ini.PadHandlerLStickRight.SetValue(316); + + Ini.PadHandlerUp.SetValue(static_cast('W')); + Ini.PadHandlerDown.SetValue(static_cast('S')); + Ini.PadHandlerLeft.SetValue(static_cast('A')); + Ini.PadHandlerRight.SetValue(static_cast('D')); + + Ini.PadHandlerL1.SetValue(static_cast('1')); + Ini.PadHandlerL2.SetValue(static_cast('Q')); + Ini.PadHandlerL3.SetValue(static_cast('Z')); + + Ini.PadHandlerStart.SetValue(13); + Ini.PadHandlerSelect.SetValue(32); + + Ini.PadHandlerR1.SetValue(static_cast('3')); + Ini.PadHandlerR2.SetValue(static_cast('E')); + Ini.PadHandlerR3.SetValue(static_cast('C')); + + Ini.PadHandlerSquare.SetValue(static_cast('J')); + Ini.PadHandlerCross.SetValue(static_cast('K')); + Ini.PadHandlerCircle.SetValue(static_cast('L')); + Ini.PadHandlerTriangle.SetValue(static_cast('I')); + + Ini.PadHandlerRStickUp.SetValue(366); + Ini.PadHandlerRStickDown.SetValue(367); + Ini.PadHandlerRStickLeft.SetValue(313); + Ini.PadHandlerRStickRight.SetValue(312); +} + +void PADManager::UpdateTimerLabel(const u32 id) +{ + switch (id) + { + case id_pad_lstick_left: b_left_lstick->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_lstick_down: b_down_lstick->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_lstick_right: b_right_lstick->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_lstick_up: b_up_lstick->SetLabel(static_cast(m_seconds + 47)); break; + + case id_pad_left: b_left->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_down: b_down->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_right: b_right->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_up: b_up->SetLabel(static_cast(m_seconds + 47)); break; + + case id_pad_l1: b_shift_l1->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_l2: b_shift_l2->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_l3: b_shift_l3->SetLabel(static_cast(m_seconds + 47)); break; + + case id_pad_start: b_start->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_select: b_select->SetLabel(static_cast(m_seconds + 47)); break; + + case id_pad_r1: b_shift_r1->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_r2: b_shift_r2->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_r3: b_shift_r3->SetLabel(static_cast(m_seconds + 47)); break; + + case id_pad_square: b_square->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_cross: b_cross->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_circle: b_circle->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_triangle: b_triangle->SetLabel(static_cast(m_seconds + 47)); break; + + case id_pad_rstick_left: b_left_rstick->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_rstick_down: b_down_rstick->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_rstick_right: b_right_rstick->SetLabel(static_cast(m_seconds + 47)); break; + case id_pad_rstick_up: b_up_rstick->SetLabel(static_cast(m_seconds + 47)); break; + + default: ConLog.Error("Unknown button ID: %d", id); break; + } +} + +void PADManager::SwitchButtons(const bool IsEnabled) +{ + b_up_lstick->Enable(IsEnabled); + b_down_lstick->Enable(IsEnabled); + b_left_lstick->Enable(IsEnabled); + b_right_lstick->Enable(IsEnabled); + + b_up->Enable(IsEnabled); + b_down->Enable(IsEnabled); + b_left->Enable(IsEnabled); + b_right->Enable(IsEnabled); + + b_shift_l1->Enable(IsEnabled); + b_shift_l2->Enable(IsEnabled); + b_shift_l3->Enable(IsEnabled); + + b_start->Enable(IsEnabled); + b_select->Enable(IsEnabled); + + b_shift_r1->Enable(IsEnabled); + b_shift_r2->Enable(IsEnabled); + b_shift_r3->Enable(IsEnabled); + + b_square->Enable(IsEnabled); + b_cross->Enable(IsEnabled); + b_circle->Enable(IsEnabled); + b_triangle->Enable(IsEnabled); + + b_up_rstick->Enable(IsEnabled); + b_down_rstick->Enable(IsEnabled); + b_left_rstick->Enable(IsEnabled); + b_right_rstick->Enable(IsEnabled); + + b_ok->Enable(IsEnabled); + b_cancel->Enable(IsEnabled); + b_reset->Enable(IsEnabled); +} + +void PADManager::RunTimer(const u32 seconds, const u32 id) +{ + m_seconds = seconds; + clock_t t1, t2; + t1 = t2 = clock() / CLK_TCK; + while (m_seconds) + { + if (t1 / CLK_TCK + 1 <= (t2 = clock()) / CLK_TCK) + { + UpdateTimerLabel(id); + m_seconds--; + t1 = t2; + } + + if(m_key_pressed) + { + m_seconds = 0; + break; + } + } +} \ No newline at end of file diff --git a/rpcs3/Gui/PADManager.h b/rpcs3/Gui/PADManager.h new file mode 100644 index 0000000000..61d2520991 --- /dev/null +++ b/rpcs3/Gui/PADManager.h @@ -0,0 +1,102 @@ +#include "Ini.h" +#include + +enum ButtonIDs +{ + id_pad_lstick_left = 0x777, + id_pad_lstick_down, + id_pad_lstick_right, + id_pad_lstick_up, + + id_pad_left, + id_pad_down, + id_pad_right, + id_pad_up, + + id_pad_l1, + id_pad_l2, + id_pad_l3, + + id_pad_start, + id_pad_select, + + id_pad_r1, + id_pad_r2, + id_pad_r3, + + id_pad_square, + id_pad_cross, + id_pad_circle, + id_pad_triangle, + + id_pad_rstick_left, + id_pad_rstick_down, + id_pad_rstick_right, + id_pad_rstick_up, + + id_reset_parameters, +}; + +struct PadButtons +{ + wxButton* b_up_lstick; + wxButton* b_down_lstick; + wxButton* b_left_lstick; + wxButton* b_right_lstick; + + wxButton* b_up; + wxButton* b_down; + wxButton* b_left; + wxButton* b_right; + + wxButton* b_shift_l1; + wxButton* b_shift_l2; + wxButton* b_shift_l3; + + wxButton* b_start; + wxButton* b_select; + + wxButton* b_shift_r1; + wxButton* b_shift_r2; + wxButton* b_shift_r3; + + + wxButton* b_square; + wxButton* b_cross; + wxButton* b_circle; + wxButton* b_triangle; + + wxButton* b_up_rstick; + wxButton* b_down_rstick; + wxButton* b_left_rstick; + wxButton* b_right_rstick; + + wxButton* b_ok; + wxButton* b_cancel; + wxButton* b_reset; +}; + +class PADManager : public wxDialog, PadButtons +{ +private: + AppConnector m_app_connector; + u32 m_seconds; + u32 m_button_id; + bool m_key_pressed; + +public: + PADManager(wxWindow* parent); + ~PADManager() + { + } + + void OnKeyDown(wxKeyEvent &keyEvent); + void OnKeyUp(wxKeyEvent &keyEvent); + void OnButtonClicked(wxCommandEvent &event); + void UpdateLabel(); + void ResetParameters(); + void UpdateTimerLabel(const u32 id); + void SwitchButtons(const bool IsEnabled); + const wxString GetKeyName(const u32 keyCode); + void RunTimer(const u32 seconds, const u32 id); +}; \ No newline at end of file diff --git a/rpcs3/Ini.h b/rpcs3/Ini.h index b273d69577..997975f13b 100644 --- a/rpcs3/Ini.h +++ b/rpcs3/Ini.h @@ -113,6 +113,10 @@ public: IniEntry HLELogLvl; IniEntry SysLanguage; + IniEntry PadHandlerLStickLeft; + IniEntry PadHandlerLStickDown; + IniEntry PadHandlerLStickRight; + IniEntry PadHandlerLStickUp; IniEntry PadHandlerLeft; IniEntry PadHandlerDown; IniEntry PadHandlerRight; @@ -129,6 +133,10 @@ public: IniEntry PadHandlerL1; IniEntry PadHandlerR2; IniEntry PadHandlerL2; + IniEntry PadHandlerRStickLeft; + IniEntry PadHandlerRStickDown; + IniEntry PadHandlerRStickRight; + IniEntry PadHandlerRStickUp; public: Inis() : DefPath("EmuSettings") @@ -154,6 +162,10 @@ public: MouseHandlerMode.Init("MouseHandlerMode", path); path = DefPath + "/" + "ControlSetings"; + PadHandlerLStickLeft.Init("PadHandlerLStickLeft", path); + PadHandlerLStickDown.Init("PadHandlerLStickDown", path); + PadHandlerLStickRight.Init("PadHandlerLStickRight", path); + PadHandlerLStickUp.Init("PadHandlerLStickUp", path); PadHandlerLeft.Init("PadHandlerLeft", path); PadHandlerDown.Init("PadHandlerDown", path); PadHandlerRight.Init("PadHandlerRight", path); @@ -170,6 +182,11 @@ public: PadHandlerL1.Init("PadHandlerL1", path); PadHandlerR2.Init("PadHandlerR2", path); PadHandlerL2.Init("PadHandlerL2", path); + PadHandlerRStickLeft.Init("PadHandlerRStickLeft", path); + PadHandlerRStickDown.Init("PadHandlerRStickDown", path); + PadHandlerRStickRight.Init("PadHandlerRStickRight", path); + PadHandlerRStickUp.Init("PadHandlerRStickUp", path); + path = DefPath + "/" + "Audio"; AudioOutMode.Init("AudioOutMode", path); @@ -209,14 +226,18 @@ public: HLELogLvl.Load(0); SysLanguage.Load(1); + PadHandlerLStickLeft.Load(314); //WXK_LEFT + PadHandlerLStickDown.Load(317); //WXK_DOWN + PadHandlerLStickRight.Load(316); //WXK_RIGHT + PadHandlerLStickUp.Load(315); //WXK_UP PadHandlerLeft.Load(static_cast('A')); PadHandlerDown.Load(static_cast('S')); PadHandlerRight.Load(static_cast('D')); PadHandlerUp.Load(static_cast('W')); - PadHandlerStart.Load(0); + PadHandlerStart.Load(13); //WXK_RETURN PadHandlerR3.Load(static_cast('C')); PadHandlerL3.Load(static_cast('Z')); - PadHandlerSelect.Load(0); + PadHandlerSelect.Load(32); //WXK_SPACE PadHandlerSquare.Load(static_cast('J')); PadHandlerCross.Load(static_cast('K')); PadHandlerCircle.Load(static_cast('L')); @@ -225,6 +246,10 @@ public: PadHandlerL1.Load(static_cast('1')); PadHandlerR2.Load(static_cast('E')); PadHandlerL2.Load(static_cast('Q')); + PadHandlerRStickLeft.Load(313); //WXK_HOME + PadHandlerRStickDown.Load(367); //WXK_PAGEDOWN + PadHandlerRStickRight.Load(312); //WXK_END + PadHandlerRStickUp.Load(366); //WXK_PAGEUP } void Save() @@ -250,6 +275,10 @@ public: HLELogLvl.Save(); SysLanguage.Save(); + PadHandlerLStickLeft.Save(); + PadHandlerLStickDown.Save(); + PadHandlerLStickRight.Save(); + PadHandlerLStickUp.Save(); PadHandlerLeft.Save(); PadHandlerDown.Save(); PadHandlerRight.Save(); @@ -266,6 +295,10 @@ public: PadHandlerL1.Save(); PadHandlerR2.Save(); PadHandlerL2.Save(); + PadHandlerRStickLeft.Save(); + PadHandlerRStickDown.Save(); + PadHandlerRStickRight.Save(); + PadHandlerRStickUp.Save(); } }; diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 5aa56519bc..c5c97e7ea3 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -1,4 +1,4 @@ - + @@ -331,6 +331,7 @@ + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 1c1ed0a365..bb8f95b549 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -1,4 +1,4 @@ - + @@ -364,6 +364,9 @@ Gui + + Gui + Emu\SysCalls\Modules