forked from dolphin-emu/dolphin
		
	git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7643 8ced0084-cf51-0410-be5f-012b33b47a6e
		
			
				
	
	
		
			371 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			371 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Copyright (C) 2011 Dolphin Project.
 | 
						|
 | 
						|
// This program is free software: you can redistribute it and/or modify
 | 
						|
// it under the terms of the GNU General Public License as published by
 | 
						|
// the Free Software Foundation, version 2.0.
 | 
						|
 | 
						|
// This program is distributed in the hope that it will be useful,
 | 
						|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
// GNU General Public License 2.0 for more details.
 | 
						|
 | 
						|
// A copy of the GPL 2.0 should have been included with the program.
 | 
						|
// If not, see http://www.gnu.org/licenses/
 | 
						|
 | 
						|
// Official SVN repository and contact information can be found at
 | 
						|
// http://code.google.com/p/dolphin-emu/
 | 
						|
 | 
						|
#include "TASInputDlg.h"
 | 
						|
#include "Movie.h"
 | 
						|
 | 
						|
BEGIN_EVENT_TABLE(TASInputDlg, wxDialog)
 | 
						|
 | 
						|
EVT_SLIDER(ID_MAIN_X_SLIDER, TASInputDlg::UpdateFromSliders)
 | 
						|
EVT_SLIDER(ID_MAIN_Y_SLIDER, TASInputDlg::UpdateFromSliders)
 | 
						|
EVT_SLIDER(ID_C_X_SLIDER, TASInputDlg::UpdateFromSliders)
 | 
						|
EVT_SLIDER(ID_C_Y_SLIDER, TASInputDlg::UpdateFromSliders)
 | 
						|
EVT_SLIDER(ID_L_SLIDER, TASInputDlg::UpdateFromSliders)
 | 
						|
EVT_SLIDER(ID_R_SLIDER, TASInputDlg::UpdateFromSliders)
 | 
						|
 | 
						|
EVT_TEXT(ID_MAIN_X_TEXT, TASInputDlg::UpdateFromText)
 | 
						|
EVT_TEXT(ID_MAIN_Y_TEXT, TASInputDlg::UpdateFromText)
 | 
						|
EVT_TEXT(ID_C_X_TEXT, TASInputDlg::UpdateFromText)
 | 
						|
EVT_TEXT(ID_C_Y_TEXT, TASInputDlg::UpdateFromText)
 | 
						|
EVT_TEXT(ID_L_TEXT, TASInputDlg::UpdateFromText)
 | 
						|
EVT_TEXT(ID_R_TEXT, TASInputDlg::UpdateFromText)
 | 
						|
 | 
						|
EVT_CLOSE(TASInputDlg::OnCloseWindow)
 | 
						|
 | 
						|
END_EVENT_TABLE()
 | 
						|
 | 
						|
TASInputDlg::TASInputDlg(wxWindow *parent, wxWindowID id, const wxString &title,
 | 
						|
		const wxPoint &position, const wxSize& size, long style)
 | 
						|
: wxDialog(parent, id, title, position, size, style)
 | 
						|
{
 | 
						|
	wxBoxSizer* const top_box = new wxBoxSizer(wxHORIZONTAL);
 | 
						|
	wxBoxSizer* const bottom_box = new wxBoxSizer(wxHORIZONTAL);
 | 
						|
	wxStaticBoxSizer* const main_box = new wxStaticBoxSizer(wxHORIZONTAL, this, _("Main Stick"));
 | 
						|
	wx_mainX_s = new wxSlider(this, ID_MAIN_X_SLIDER, 128, 0, 255, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL);
 | 
						|
	wx_mainX_s->SetMinSize(wxSize(100,-1));
 | 
						|
	wx_mainX_t = new wxTextCtrl(this, ID_MAIN_X_TEXT, wxT("128"), wxDefaultPosition, wxSize(40, 20));
 | 
						|
	wx_mainX_t->SetMaxLength(3);
 | 
						|
	wx_mainY_s = new wxSlider(this, ID_MAIN_Y_SLIDER, 128, 0, 255, wxDefaultPosition, wxDefaultSize, wxSL_VERTICAL | wxSL_INVERSE);
 | 
						|
	wx_mainY_s->SetMinSize(wxSize(-1,100));
 | 
						|
	wx_mainY_t = new wxTextCtrl(this, ID_MAIN_Y_TEXT, wxT("128"), wxDefaultPosition, wxSize(40, 20));
 | 
						|
	wx_mainY_t->SetMaxLength(3);
 | 
						|
	main_box->Add(wx_mainX_s, 0, wxALIGN_TOP);
 | 
						|
	main_box->Add(wx_mainX_t, 0, wxALIGN_TOP);
 | 
						|
	main_box->Add(wx_mainY_s, 0, wxALIGN_CENTER_VERTICAL);
 | 
						|
	main_box->Add(wx_mainY_t, 0, wxALIGN_CENTER_VERTICAL);
 | 
						|
 | 
						|
	wxStaticBoxSizer* const c_box = new wxStaticBoxSizer(wxHORIZONTAL, this, _("C Stick"));
 | 
						|
	wx_cX_s = new wxSlider(this, ID_C_X_SLIDER, 128, 0, 255, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL);
 | 
						|
	wx_cX_s->SetMinSize(wxSize(100,-1));
 | 
						|
	wx_cX_t = new wxTextCtrl(this, ID_C_X_TEXT, wxT("128"), wxDefaultPosition, wxSize(40, 20));
 | 
						|
	wx_cX_t->SetMaxLength(3);
 | 
						|
	wx_cY_s = new wxSlider(this, ID_C_Y_SLIDER, 128, 0, 255, wxDefaultPosition, wxDefaultSize, wxSL_VERTICAL | wxSL_INVERSE);
 | 
						|
	wx_cY_s->SetMinSize(wxSize(-1,100));
 | 
						|
	wx_cY_t = new wxTextCtrl(this, ID_C_Y_TEXT, wxT("128"), wxDefaultPosition, wxSize(40, 20));
 | 
						|
	wx_cY_t->SetMaxLength(3);
 | 
						|
	c_box->Add(wx_cX_s, 0, wxALIGN_TOP);
 | 
						|
	c_box->Add(wx_cX_t, 0, wxALIGN_TOP);
 | 
						|
	c_box->Add(wx_cY_s, 0, wxALIGN_CENTER_VERTICAL);
 | 
						|
	c_box->Add(wx_cY_t, 0, wxALIGN_CENTER_VERTICAL);
 | 
						|
 | 
						|
	wxStaticBoxSizer* const shoulder_box = new wxStaticBoxSizer(wxHORIZONTAL, this, _("Shoulder Buttons"));
 | 
						|
	wx_l_s = new wxSlider(this, ID_L_SLIDER, 0, 0, 255, wxDefaultPosition, wxDefaultSize, wxSL_VERTICAL | wxSL_INVERSE);
 | 
						|
	wx_l_s->SetMinSize(wxSize(-1,100));
 | 
						|
	wx_l_t = new wxTextCtrl(this, ID_L_TEXT, wxT("0"), wxDefaultPosition, wxSize(40, 20));
 | 
						|
	wx_l_t->SetMaxLength(3);
 | 
						|
	wx_r_s = new wxSlider(this, ID_R_SLIDER, 0, 0, 255, wxDefaultPosition, wxDefaultSize, wxSL_VERTICAL | wxSL_INVERSE);
 | 
						|
	wx_r_s->SetMinSize(wxSize(-1,100));
 | 
						|
	wx_r_t = new wxTextCtrl(this, ID_R_TEXT, wxT("0"), wxDefaultPosition, wxSize(40, 20));
 | 
						|
	wx_r_t->SetMaxLength(3);
 | 
						|
	shoulder_box->Add(wx_l_s, 0, wxALIGN_CENTER_VERTICAL);
 | 
						|
	shoulder_box->Add(wx_l_t, 0, wxALIGN_CENTER_VERTICAL);
 | 
						|
	shoulder_box->Add(wx_r_s, 0, wxALIGN_CENTER_VERTICAL);
 | 
						|
	shoulder_box->Add(wx_r_t, 0, wxALIGN_CENTER_VERTICAL);
 | 
						|
 | 
						|
	wxStaticBoxSizer* const buttons_box = new wxStaticBoxSizer(wxVERTICAL, this, _("Buttons"));
 | 
						|
	wxGridSizer* const buttons_grid = new wxGridSizer(4);
 | 
						|
	wx_a_button = new wxCheckBox(this,ID_A,_T("A"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr);
 | 
						|
	wx_b_button = new wxCheckBox(this,ID_B,_T("B"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr);
 | 
						|
	wx_x_button = new wxCheckBox(this,ID_X,_T("X"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr);
 | 
						|
	wx_y_button = new wxCheckBox(this,ID_Y,_T("Y"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr);
 | 
						|
	wx_l_button = new wxCheckBox(this,ID_L,_T("L"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr);
 | 
						|
	wx_r_button = new wxCheckBox(this,ID_R,_T("R"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr);
 | 
						|
	wx_z_button = new wxCheckBox(this,ID_Z,_T("Z"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr);
 | 
						|
	wx_start_button = new wxCheckBox(this,ID_START,_T("Start"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr);
 | 
						|
	buttons_grid->Add(wx_a_button,false);
 | 
						|
	buttons_grid->Add(wx_b_button,false);
 | 
						|
	buttons_grid->Add(wx_x_button,false);
 | 
						|
	buttons_grid->Add(wx_y_button,false);
 | 
						|
	buttons_grid->Add(wx_l_button,false);
 | 
						|
	buttons_grid->Add(wx_r_button,false);
 | 
						|
	buttons_grid->Add(wx_z_button,false);
 | 
						|
	buttons_grid->Add(wx_start_button,false);
 | 
						|
	buttons_grid->AddSpacer(5);
 | 
						|
 | 
						|
	wxGridSizer* const buttons_dpad = new wxGridSizer(3);
 | 
						|
	wx_up_button = new wxCheckBox(this,ID_UP,_T("Up"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr);
 | 
						|
	wx_right_button = new wxCheckBox(this,ID_RIGHT,_T("Right"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr);
 | 
						|
	wx_down_button = new wxCheckBox(this,ID_DOWN,_T("Down"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr);
 | 
						|
	wx_left_button = new wxCheckBox(this,ID_LEFT,_T("Left"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,wxCheckBoxNameStr);
 | 
						|
	buttons_dpad->AddSpacer(20);
 | 
						|
	buttons_dpad->Add(wx_up_button,false);
 | 
						|
	buttons_dpad->AddSpacer(20);
 | 
						|
	buttons_dpad->Add(wx_left_button,false);
 | 
						|
	buttons_dpad->AddSpacer(20);
 | 
						|
	buttons_dpad->Add(wx_right_button,false);
 | 
						|
	buttons_dpad->AddSpacer(20);
 | 
						|
	buttons_dpad->Add(wx_down_button,false);
 | 
						|
	buttons_dpad->AddSpacer(20);
 | 
						|
	buttons_box->Add(buttons_grid);
 | 
						|
	buttons_box->Add(buttons_dpad);
 | 
						|
 | 
						|
	wxBoxSizer* const main_szr = new wxBoxSizer(wxVERTICAL);
 | 
						|
	top_box->AddSpacer(5);
 | 
						|
	top_box->Add(main_box);
 | 
						|
	top_box->AddSpacer(5);
 | 
						|
	top_box->Add(c_box);
 | 
						|
	top_box->AddSpacer(5);
 | 
						|
	bottom_box->AddSpacer(5);
 | 
						|
	bottom_box->Add(shoulder_box);
 | 
						|
	bottom_box->AddSpacer(5);
 | 
						|
	bottom_box->Add(buttons_box);
 | 
						|
	bottom_box->AddSpacer(5);
 | 
						|
	main_szr->Add(top_box);
 | 
						|
	main_szr->Add(bottom_box);
 | 
						|
	SetSizerAndFit(main_szr);
 | 
						|
	ResetValues();
 | 
						|
}
 | 
						|
 | 
						|
void TASInputDlg::ResetValues()
 | 
						|
{
 | 
						|
	mainX = mainY = cX = cY = 128;
 | 
						|
	lTrig = rTrig = 0;
 | 
						|
	
 | 
						|
	wx_mainX_s->SetValue(128);
 | 
						|
	wx_mainY_s->SetValue(128);
 | 
						|
	wx_cX_s->SetValue(128);
 | 
						|
	wx_cY_s->SetValue(128);
 | 
						|
	wx_l_s->SetValue(0);
 | 
						|
	wx_r_s->SetValue(0);
 | 
						|
	
 | 
						|
	wx_mainX_t->SetValue(wxT("128"));
 | 
						|
	wx_mainY_t->SetValue(wxT("128"));
 | 
						|
	wx_cX_t->SetValue(wxT("128"));
 | 
						|
	wx_cY_t->SetValue(wxT("128"));
 | 
						|
	wx_l_t->SetValue(wxT("0"));
 | 
						|
	wx_r_t->SetValue(wxT("0"));
 | 
						|
	
 | 
						|
	wx_up_button->SetValue(false);
 | 
						|
	wx_down_button->SetValue(false);
 | 
						|
	wx_left_button->SetValue(false);
 | 
						|
	wx_right_button->SetValue(false);
 | 
						|
	wx_a_button->SetValue(false);
 | 
						|
	wx_b_button->SetValue(false);
 | 
						|
	wx_x_button->SetValue(false);
 | 
						|
	wx_y_button->SetValue(false);
 | 
						|
	wx_l_button->SetValue(false);
 | 
						|
	wx_r_button->SetValue(false);
 | 
						|
	wx_z_button->SetValue(false);
 | 
						|
	wx_start_button->SetValue(false);
 | 
						|
}
 | 
						|
 | 
						|
void TASInputDlg::GetValues(SPADStatus *PadStatus, int controllerID)
 | 
						|
{
 | 
						|
	if (!IsShown())
 | 
						|
		return;
 | 
						|
 | 
						|
	// TODO: implement support for more controllers
 | 
						|
	if (controllerID != 0)
 | 
						|
		return;
 | 
						|
 | 
						|
	PadStatus->stickX = mainX;
 | 
						|
	PadStatus->stickY = mainY;
 | 
						|
	PadStatus->substickX = cX;
 | 
						|
	PadStatus->substickY = cY;
 | 
						|
	PadStatus->triggerLeft = lTrig;
 | 
						|
	PadStatus->triggerRight = rTrig;
 | 
						|
 | 
						|
	if(wx_up_button->IsChecked())
 | 
						|
		PadStatus->button |= PAD_BUTTON_UP;
 | 
						|
	else
 | 
						|
		PadStatus->button &= ~PAD_BUTTON_UP;
 | 
						|
 | 
						|
	if(wx_down_button->IsChecked())
 | 
						|
		PadStatus->button |= PAD_BUTTON_DOWN;
 | 
						|
	else
 | 
						|
		PadStatus->button &= ~PAD_BUTTON_DOWN;
 | 
						|
 | 
						|
	if(wx_left_button->IsChecked())
 | 
						|
		PadStatus->button |= PAD_BUTTON_LEFT;
 | 
						|
	else
 | 
						|
		PadStatus->button &= ~PAD_BUTTON_LEFT;
 | 
						|
 | 
						|
	if(wx_right_button->IsChecked())
 | 
						|
		PadStatus->button |= PAD_BUTTON_RIGHT;
 | 
						|
	else
 | 
						|
		PadStatus->button &= ~PAD_BUTTON_RIGHT;
 | 
						|
 | 
						|
	if(wx_a_button->IsChecked())
 | 
						|
	{
 | 
						|
		PadStatus->button |= PAD_BUTTON_A;
 | 
						|
		PadStatus->analogA = 0xFF;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		PadStatus->button &= ~PAD_BUTTON_A;
 | 
						|
		PadStatus->analogA = 0x00;
 | 
						|
	}
 | 
						|
 | 
						|
	if(wx_b_button->IsChecked())
 | 
						|
	{
 | 
						|
		PadStatus->button |= PAD_BUTTON_B;
 | 
						|
		PadStatus->analogB = 0xFF;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		PadStatus->button &= ~PAD_BUTTON_B;
 | 
						|
		PadStatus->analogB = 0x00;
 | 
						|
	}
 | 
						|
 | 
						|
	if(wx_x_button->IsChecked())
 | 
						|
		PadStatus->button |= PAD_BUTTON_X;
 | 
						|
	else
 | 
						|
		PadStatus->button &= ~PAD_BUTTON_X;
 | 
						|
 | 
						|
	if(wx_y_button->IsChecked())
 | 
						|
		PadStatus->button |= PAD_BUTTON_Y;
 | 
						|
	else
 | 
						|
		PadStatus->button &= ~PAD_BUTTON_Y;
 | 
						|
 | 
						|
	if(wx_l_button->IsChecked())
 | 
						|
		PadStatus->button |= PAD_TRIGGER_L;
 | 
						|
	else
 | 
						|
		PadStatus->button &= ~PAD_TRIGGER_L;
 | 
						|
 | 
						|
	if(wx_r_button->IsChecked())
 | 
						|
		PadStatus->button |= PAD_TRIGGER_R;
 | 
						|
	else
 | 
						|
		PadStatus->button &= ~PAD_TRIGGER_R;
 | 
						|
 | 
						|
	if(wx_z_button->IsChecked())
 | 
						|
		PadStatus->button |= PAD_TRIGGER_Z;
 | 
						|
	else
 | 
						|
		PadStatus->button &= ~PAD_TRIGGER_Z;
 | 
						|
 | 
						|
	if(wx_start_button->IsChecked())
 | 
						|
		PadStatus->button |= PAD_BUTTON_START;
 | 
						|
	else
 | 
						|
		PadStatus->button &= ~PAD_BUTTON_START;
 | 
						|
	
 | 
						|
}
 | 
						|
 | 
						|
void TASInputDlg::UpdateFromSliders(wxCommandEvent& event)
 | 
						|
{
 | 
						|
	wxTextCtrl *text;
 | 
						|
	u8 *v;
 | 
						|
 | 
						|
	switch(event.GetId())
 | 
						|
	{
 | 
						|
		case ID_MAIN_X_SLIDER:
 | 
						|
			text = wx_mainX_t;
 | 
						|
			v = &mainX;
 | 
						|
			break;
 | 
						|
 | 
						|
		case ID_MAIN_Y_SLIDER:
 | 
						|
			text = wx_mainY_t;
 | 
						|
			v = &mainY;
 | 
						|
			break;
 | 
						|
 | 
						|
		case ID_C_X_SLIDER:
 | 
						|
			text = wx_cX_t;
 | 
						|
			v = &cX;
 | 
						|
			break;
 | 
						|
 | 
						|
		case ID_C_Y_SLIDER:
 | 
						|
			text = wx_cY_t;
 | 
						|
			v = &cY;
 | 
						|
			break;
 | 
						|
 | 
						|
		case ID_L_SLIDER:
 | 
						|
			text = wx_l_t;
 | 
						|
			v = &lTrig;
 | 
						|
			break;
 | 
						|
 | 
						|
		case ID_R_SLIDER:
 | 
						|
			text = wx_r_t;
 | 
						|
			v = &rTrig;
 | 
						|
			break;
 | 
						|
 | 
						|
		default:
 | 
						|
			return;
 | 
						|
	}
 | 
						|
 | 
						|
	int value = ((wxSlider *) event.GetEventObject())->GetValue();
 | 
						|
	*v = (u8) value;
 | 
						|
	text->SetValue(wxString::Format(wxT("%i"), value));
 | 
						|
}
 | 
						|
 | 
						|
void TASInputDlg::UpdateFromText(wxCommandEvent& event)
 | 
						|
{
 | 
						|
	wxSlider *slider;
 | 
						|
	u8 *v;
 | 
						|
 | 
						|
	switch(event.GetId())
 | 
						|
	{
 | 
						|
		case ID_MAIN_X_TEXT:
 | 
						|
			slider = wx_mainX_s;
 | 
						|
			v = &mainX;
 | 
						|
			break;
 | 
						|
 | 
						|
		case ID_MAIN_Y_TEXT:
 | 
						|
			slider = wx_mainY_s;
 | 
						|
			v = &mainY;
 | 
						|
			break;
 | 
						|
 | 
						|
		case ID_C_X_TEXT:
 | 
						|
			slider = wx_cX_s;
 | 
						|
			v = &cX;
 | 
						|
			break;
 | 
						|
 | 
						|
		case ID_C_Y_TEXT:
 | 
						|
			slider = wx_cY_s;
 | 
						|
			v = &cY;
 | 
						|
			break;
 | 
						|
 | 
						|
		case ID_L_TEXT:
 | 
						|
			slider = wx_l_s;
 | 
						|
			v = &lTrig;
 | 
						|
			break;
 | 
						|
 | 
						|
		case ID_R_TEXT:
 | 
						|
			slider = wx_r_s;
 | 
						|
			v = &rTrig;
 | 
						|
			break;
 | 
						|
 | 
						|
		default:
 | 
						|
			return;
 | 
						|
	}
 | 
						|
 | 
						|
	unsigned long value;
 | 
						|
 | 
						|
	if (((wxTextCtrl *) event.GetEventObject())->GetValue().ToULong(&value))
 | 
						|
	{
 | 
						|
		*v = (u8) (value > 255 ? 255 : value);
 | 
						|
		slider->SetValue(*v);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
void TASInputDlg::OnCloseWindow(wxCloseEvent& event)
 | 
						|
{
 | 
						|
	if (event.CanVeto())
 | 
						|
	{
 | 
						|
		event.Skip(false);
 | 
						|
		this->Show(false);
 | 
						|
		ResetValues();
 | 
						|
	}
 | 
						|
}
 |