mirror of https://github.com/PCSX2/pcsx2.git
recording: implementation for recording file GUI panel
This commit is contained in:
parent
0021ad66e0
commit
94c160401c
|
@ -0,0 +1,338 @@
|
||||||
|
#include "PrecompiledHeader.h"
|
||||||
|
|
||||||
|
#include "MemoryTypes.h"
|
||||||
|
#include "Counters.h"
|
||||||
|
|
||||||
|
#include "InputRecordingEditor.h"
|
||||||
|
#include "InputRecording.h"
|
||||||
|
#include "RecordingControls.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <wx/joystick.h>
|
||||||
|
|
||||||
|
enum {
|
||||||
|
ID_MenuAuthor = 1,
|
||||||
|
ID_MenuInputRecordingInfo,
|
||||||
|
|
||||||
|
ID_List_KeyFrame,
|
||||||
|
ID_Text_Edit,
|
||||||
|
|
||||||
|
ID_Btn_Update,
|
||||||
|
ID_Btn_Insert,
|
||||||
|
ID_Btn_Delete,
|
||||||
|
ID_Btn_Copy,
|
||||||
|
ID_Btn_DrawFrame,
|
||||||
|
ID_Btn_DrawNowFrame,
|
||||||
|
|
||||||
|
ID_CheckList_NormalKey1,
|
||||||
|
|
||||||
|
ID_Text_AnalogKey1,
|
||||||
|
ID_Text_AnalogKey2,
|
||||||
|
ID_Text_AnalogKey3,
|
||||||
|
ID_Text_AnalogKey4,
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
wxBEGIN_EVENT_TABLE(InputRecordingEditor, wxFrame)
|
||||||
|
EVT_CLOSE(InputRecordingEditor::OnClose)
|
||||||
|
wxEND_EVENT_TABLE()
|
||||||
|
|
||||||
|
InputRecordingEditor::InputRecordingEditor(wxWindow * parent)
|
||||||
|
: wxFrame(parent, wxID_ANY, L"InputRecordingEditor", wxPoint(437+680,52), wxSize(680,560))
|
||||||
|
{
|
||||||
|
// TODO - needs proper wxFrame design, no hardcoding of coordinates
|
||||||
|
|
||||||
|
// menu bar
|
||||||
|
wxMenu *menuFile = new wxMenu;
|
||||||
|
menuFile->Append(ID_MenuAuthor, L"&set author");
|
||||||
|
menuFile->Append(ID_MenuInputRecordingInfo, L"&InputRecordingInfo");
|
||||||
|
wxMenuBar *menuBar = new wxMenuBar;
|
||||||
|
menuBar->Append(menuFile, L"&menu");
|
||||||
|
SetMenuBar(menuBar);
|
||||||
|
|
||||||
|
// panel
|
||||||
|
int x = 2;
|
||||||
|
int y = 2;
|
||||||
|
wxPanel *panel = new wxPanel(this, wxID_ANY);
|
||||||
|
|
||||||
|
// listbox
|
||||||
|
frameList = new wxListBox(panel, ID_List_KeyFrame, wxPoint(x, y),wxSize(250,460));
|
||||||
|
x += 250 + 5;
|
||||||
|
|
||||||
|
// key
|
||||||
|
keyTextView = new wxTextCtrl(panel, wxID_ANY, L"", wxPoint(x, y), wxSize(420, 25));
|
||||||
|
keyTextView->Disable();
|
||||||
|
y += 25;
|
||||||
|
new wxButton(panel, ID_Btn_Copy, L"copy", wxPoint(x, y));
|
||||||
|
y += 28;
|
||||||
|
keyTextEdit = new wxTextCtrl(panel, ID_Text_Edit, L"", wxPoint(x, y), wxSize(420, 25));
|
||||||
|
y += 25;
|
||||||
|
wxArrayString tmp;
|
||||||
|
for (int i = 0; i < PadDataNormalKeysSize; i++) {
|
||||||
|
tmp.Add(PadDataNormalKeys[i]);
|
||||||
|
}
|
||||||
|
keyCheckList1 = new wxCheckListBox(panel, ID_CheckList_NormalKey1, wxPoint(x, y), wxSize(90, 300), tmp);
|
||||||
|
x += 90+5;
|
||||||
|
|
||||||
|
// analog
|
||||||
|
for (int i = 0; i < PadDataAnalogKeysSize; i++) {
|
||||||
|
(new wxTextCtrl(panel, wxID_ANY, PadDataAnalogKeys[i] , wxPoint(x, y), wxSize(100, 28)))->Disable();
|
||||||
|
analogKeyText[i] = new wxTextCtrl(panel, (ID_Text_AnalogKey1+i), "", wxPoint(x + 100, y), wxSize(80, 28));
|
||||||
|
y += 28;
|
||||||
|
}
|
||||||
|
|
||||||
|
// button
|
||||||
|
int w = 90;
|
||||||
|
new wxButton(panel, ID_Btn_Update, L"update", wxPoint(x,y));
|
||||||
|
new wxButton(panel, ID_Btn_Insert, L"insert", wxPoint(x+w, y));
|
||||||
|
new wxButton(panel, ID_Btn_Delete, L"delete", wxPoint(x+w*2, y));
|
||||||
|
y += 28+20;
|
||||||
|
frameTextFoeMove = new wxTextCtrl(panel, wxID_ANY, L"100", wxPoint(x, y), wxSize(80, 25));
|
||||||
|
y += 28;
|
||||||
|
new wxButton(panel, ID_Btn_DrawFrame, L"draw frame:", wxPoint(x, y));
|
||||||
|
new wxButton(panel, ID_Btn_DrawNowFrame, L"draw now frame", wxPoint(x + w, y));
|
||||||
|
|
||||||
|
// status bar
|
||||||
|
statusbar = CreateStatusBar();
|
||||||
|
statusbar->SetStatusText(L"key editor open");
|
||||||
|
|
||||||
|
// event
|
||||||
|
Bind(wxEVT_COMMAND_MENU_SELECTED, &InputRecordingEditor::OnMenuAuthor, this, ID_MenuAuthor);
|
||||||
|
Bind(wxEVT_COMMAND_MENU_SELECTED, &InputRecordingEditor::OnMenuInputRecordingInfo, this, ID_MenuInputRecordingInfo);
|
||||||
|
// button
|
||||||
|
Bind(wxEVT_COMMAND_BUTTON_CLICKED, &InputRecordingEditor::OnBtnUpdate, this, ID_Btn_Update);
|
||||||
|
Bind(wxEVT_COMMAND_BUTTON_CLICKED, &InputRecordingEditor::OnBtnInsert, this, ID_Btn_Insert);
|
||||||
|
Bind(wxEVT_COMMAND_BUTTON_CLICKED, &InputRecordingEditor::OnBtnDelete, this, ID_Btn_Delete);
|
||||||
|
Bind(wxEVT_COMMAND_BUTTON_CLICKED, &InputRecordingEditor::OnBtnCopy, this, ID_Btn_Copy);
|
||||||
|
Bind(wxEVT_COMMAND_BUTTON_CLICKED, &InputRecordingEditor::OnBtnDrawFrame, this, ID_Btn_DrawFrame);
|
||||||
|
Bind(wxEVT_COMMAND_BUTTON_CLICKED, &InputRecordingEditor::OnBtnDrawNowFrame, this, ID_Btn_DrawNowFrame);
|
||||||
|
|
||||||
|
//list box
|
||||||
|
Bind(wxEVT_COMMAND_LISTBOX_SELECTED, &InputRecordingEditor::OnListBox, this, ID_List_KeyFrame);
|
||||||
|
|
||||||
|
//checklist
|
||||||
|
Bind(wxEVT_CHECKLISTBOX, &InputRecordingEditor::OnCheckList_NormalKey1, this, ID_CheckList_NormalKey1);
|
||||||
|
|
||||||
|
//text
|
||||||
|
Bind(wxEVT_TEXT, &InputRecordingEditor::OnText_Edit, this, ID_Text_Edit);
|
||||||
|
Bind(wxEVT_TEXT, &InputRecordingEditor::OnText_Analog1, this, ID_Text_AnalogKey1);
|
||||||
|
Bind(wxEVT_TEXT, &InputRecordingEditor::OnText_Analog2, this, ID_Text_AnalogKey2);
|
||||||
|
Bind(wxEVT_TEXT, &InputRecordingEditor::OnText_Analog3, this, ID_Text_AnalogKey3);
|
||||||
|
Bind(wxEVT_TEXT, &InputRecordingEditor::OnText_Analog4, this, ID_Text_AnalogKey4);
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::OnClose(wxCloseEvent& evt)
|
||||||
|
{
|
||||||
|
Hide();
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::OnMenuAuthor(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
wxTextEntryDialog* dlg = new wxTextEntryDialog(NULL, L"input author.");
|
||||||
|
if (dlg->ShowModal() != wxID_OK) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
g_InputRecordingHeader.setAuthor(dlg->GetValue());
|
||||||
|
g_InputRecordingData.writeHeader();
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::OnMenuInputRecordingInfo(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
wxString s = L"";
|
||||||
|
s += wxString::Format(L"Ver:%d\n", g_InputRecordingHeader.version);
|
||||||
|
s += wxString::Format(L"Author:%s\n", g_InputRecordingHeader.author);
|
||||||
|
s += wxString::Format(L"Emu:%s\n", g_InputRecordingHeader.emu);
|
||||||
|
s += wxString::Format(L"CD:%s\n", g_InputRecordingHeader.cdrom);
|
||||||
|
s += wxString::Format(L"MaxFrame:%d\n", g_InputRecordingData.getMaxFrame());
|
||||||
|
s += wxString::Format(L"UndoCount:%d\n", g_InputRecordingData.getUndoCount());
|
||||||
|
|
||||||
|
wxMessageBox(s, L"InputRecording file header info", wxOK | wxICON_INFORMATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------
|
||||||
|
// every frame
|
||||||
|
//-------------------------------
|
||||||
|
void InputRecordingEditor::FrameUpdate()
|
||||||
|
{
|
||||||
|
if (g_FrameCount == 0)return;
|
||||||
|
|
||||||
|
wxString pauseMessage = g_RecordingControls.getStopFlag() ? L"[pause]" : L"[run]";
|
||||||
|
wxString recordMessage = "";
|
||||||
|
if (g_InputRecording.getModeState() == InputRecording::RECORD) {
|
||||||
|
recordMessage = L"[record]";
|
||||||
|
}
|
||||||
|
else if (g_InputRecording.getModeState() == InputRecording::REPLAY) {
|
||||||
|
recordMessage = L"[replay]";
|
||||||
|
}
|
||||||
|
SetTitle(wxString::Format(L"%d / %d ", g_FrameCount, g_InputRecordingData.getMaxFrame())+ pauseMessage+ recordMessage );
|
||||||
|
}
|
||||||
|
|
||||||
|
//-------------------------------
|
||||||
|
// draw
|
||||||
|
//-------------------------------
|
||||||
|
void InputRecordingEditor::DrawKeyFrameList(long selectFrame)
|
||||||
|
{
|
||||||
|
// Decide the number of frames to display
|
||||||
|
// <20>\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><74><EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߂<EFBFBD>
|
||||||
|
int start = selectFrame - 100;
|
||||||
|
unsigned int end = selectFrame +100;
|
||||||
|
if (start < 0) {
|
||||||
|
start = 0;
|
||||||
|
}
|
||||||
|
frameListStartFrame = start;
|
||||||
|
wxString selectKeyStr = "";
|
||||||
|
frameList->Clear();
|
||||||
|
for (unsigned long i = start; i < end; i++)
|
||||||
|
{
|
||||||
|
PadData key;
|
||||||
|
g_InputRecordingData.getPadData(key, i);
|
||||||
|
frameList->Append(wxString::Format("%d [%s]", i, key.serialize()));
|
||||||
|
if (selectFrame == i) {
|
||||||
|
selectKeyStr = key.serialize();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// select
|
||||||
|
long selectIndex = selectFrame - start;
|
||||||
|
if (0 <= selectIndex && selectIndex < (signed)frameList->GetCount())
|
||||||
|
{
|
||||||
|
frameList->SetSelection(selectIndex);
|
||||||
|
keyTextView->ChangeValue(selectKeyStr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::DrawKeyButtonCheck()
|
||||||
|
{
|
||||||
|
PadData key;
|
||||||
|
key.deserialize(keyTextEdit->GetValue());
|
||||||
|
auto key1 = key.getNormalKeys(0);
|
||||||
|
for (int i = 0; i < PadDataNormalKeysSize;i++) {
|
||||||
|
keyCheckList1->Check( i , key1[PadDataNormalKeys[i]]);
|
||||||
|
}
|
||||||
|
auto key2 = key.getAnalogKeys(0);
|
||||||
|
for (int i = 0; i < PadDataAnalogKeysSize; i++) {
|
||||||
|
analogKeyText[i]->ChangeValue(wxString::Format(L"%d", key2.at(PadDataAnalogKeys[i])));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------
|
||||||
|
// event
|
||||||
|
// TODO: all of these need to be updated for the key editor window
|
||||||
|
//----------------------------------------------
|
||||||
|
void InputRecordingEditor::OnBtnUpdate(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
int select = frameList->GetSelection();
|
||||||
|
if (select == wxNOT_FOUND)return;
|
||||||
|
long frame = select + frameListStartFrame;
|
||||||
|
PadData key;
|
||||||
|
key.deserialize(keyTextEdit->GetValue());
|
||||||
|
if (g_InputRecordingData.UpdatePadData(frame, key))
|
||||||
|
{
|
||||||
|
frameTextFoeMove->ChangeValue(wxString::Format(L"%d", frame));
|
||||||
|
DrawKeyFrameList(frame);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::OnBtnInsert(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
int select = frameList->GetSelection();
|
||||||
|
if (select == wxNOT_FOUND)return;
|
||||||
|
long frame = select + frameListStartFrame;
|
||||||
|
PadData key;
|
||||||
|
key.deserialize(keyTextEdit->GetValue());
|
||||||
|
if (g_InputRecordingData.InsertPadData(frame,key))
|
||||||
|
{
|
||||||
|
frameTextFoeMove->ChangeValue(wxString::Format(L"%d", frame));
|
||||||
|
DrawKeyFrameList(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::OnBtnDelete(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
int select = frameList->GetSelection();
|
||||||
|
if (select == wxNOT_FOUND)return;
|
||||||
|
long frame = select + frameListStartFrame;
|
||||||
|
if (g_InputRecordingData.DeletePadData(frame))
|
||||||
|
{
|
||||||
|
frameTextFoeMove->ChangeValue(wxString::Format(L"%d",frame));
|
||||||
|
DrawKeyFrameList(frame);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::OnBtnCopy(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
keyTextEdit->ChangeValue(keyTextView->GetValue());
|
||||||
|
DrawKeyButtonCheck();
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::OnText_Edit(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
DrawKeyButtonCheck();
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::OnListBox(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
int select = frameList->GetSelection();
|
||||||
|
if (select == wxNOT_FOUND)return;
|
||||||
|
long frame = select + frameListStartFrame;
|
||||||
|
PadData key;
|
||||||
|
g_InputRecordingData.getPadData(key,frame);
|
||||||
|
keyTextView->ChangeValue(key.serialize());
|
||||||
|
frameTextFoeMove->ChangeValue(wxString::Format(L"%d", frame));
|
||||||
|
}
|
||||||
|
|
||||||
|
void InputRecordingEditor::OnBtnDrawFrame(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
long selectFrame;
|
||||||
|
if (frameTextFoeMove->GetValue().ToLong(&selectFrame))
|
||||||
|
{
|
||||||
|
DrawKeyFrameList(selectFrame);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::OnBtnDrawNowFrame(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
frameTextFoeMove->ChangeValue(wxString::Format(L"%d", g_FrameCount));
|
||||||
|
DrawKeyFrameList(g_FrameCount);
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::OnCheckList_NormalKey1(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
PadData key;
|
||||||
|
key.deserialize(keyTextEdit->GetValue());
|
||||||
|
if (!key.fExistKey)return;
|
||||||
|
|
||||||
|
auto tmpkey = key.getNormalKeys(0);
|
||||||
|
for (unsigned int i = 0; i < keyCheckList1->GetCount(); i++)
|
||||||
|
{
|
||||||
|
tmpkey[keyCheckList1->GetString(i)] = keyCheckList1->IsChecked(i);
|
||||||
|
}
|
||||||
|
key.setNormalKeys(0,tmpkey);
|
||||||
|
keyTextEdit->ChangeValue(key.serialize());
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::_OnText_Analog(int num)
|
||||||
|
{
|
||||||
|
PadData key;
|
||||||
|
key.deserialize(keyTextEdit->GetValue());
|
||||||
|
if (!key.fExistKey)return;
|
||||||
|
|
||||||
|
auto tmpkey = key.getAnalogKeys(0);
|
||||||
|
|
||||||
|
try {
|
||||||
|
tmpkey[PadDataAnalogKeys[num]] = std::stoi( analogKeyText[num]->GetValue().ToStdString(), NULL, 10);
|
||||||
|
}
|
||||||
|
catch (std::invalid_argument e) {/*none*/ }
|
||||||
|
catch (std::out_of_range e) {/*none*/ }
|
||||||
|
|
||||||
|
key.setAnalogKeys(0, tmpkey);
|
||||||
|
wxString s = key.serialize();
|
||||||
|
keyTextEdit->ChangeValue(s);
|
||||||
|
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::OnText_Analog1(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
_OnText_Analog(0);
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::OnText_Analog2(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
_OnText_Analog(1);
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::OnText_Analog3(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
_OnText_Analog(2);
|
||||||
|
}
|
||||||
|
void InputRecordingEditor::OnText_Analog4(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
_OnText_Analog(3);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
#pragma once
|
||||||
|
#ifndef __KEY_EDITOR_H__
|
||||||
|
#define __KEY_EDITOR_H__
|
||||||
|
|
||||||
|
#include <wx/wx.h>
|
||||||
|
#include <wx/listctrl.h>
|
||||||
|
|
||||||
|
#include "PadData.h"
|
||||||
|
|
||||||
|
class InputRecordingEditor : public wxFrame
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
InputRecordingEditor(wxWindow * parent);
|
||||||
|
|
||||||
|
public:
|
||||||
|
void FrameUpdate();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void DrawKeyFrameList(long frame);
|
||||||
|
void DrawKeyButtonCheck();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
long frameListStartFrame = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
wxListBox * frameList;
|
||||||
|
|
||||||
|
wxStatusBar* statusbar;
|
||||||
|
|
||||||
|
wxTextCtrl* keyTextView;
|
||||||
|
wxTextCtrl* keyTextEdit;
|
||||||
|
|
||||||
|
wxTextCtrl* frameTextFoeMove;
|
||||||
|
wxTextCtrl* analogKeyText[PadDataAnalogKeysSize];
|
||||||
|
|
||||||
|
wxCheckListBox* keyCheckList1;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void OnClose(wxCloseEvent& evt);
|
||||||
|
|
||||||
|
void OnMenuAuthor(wxCommandEvent& event);
|
||||||
|
void OnMenuInputRecordingInfo(wxCommandEvent& event);
|
||||||
|
|
||||||
|
void OnBtnUpdate(wxCommandEvent& event);
|
||||||
|
void OnBtnDelete(wxCommandEvent& event);
|
||||||
|
void OnBtnInsert(wxCommandEvent& event);
|
||||||
|
void OnBtnCopy(wxCommandEvent& event);
|
||||||
|
|
||||||
|
void OnBtnDrawFrame(wxCommandEvent& event);
|
||||||
|
void OnBtnDrawNowFrame(wxCommandEvent& event);
|
||||||
|
|
||||||
|
void OnListBox(wxCommandEvent& event);
|
||||||
|
void OnCheckList_NormalKey1(wxCommandEvent& event);
|
||||||
|
|
||||||
|
void OnText_Edit(wxCommandEvent& event);
|
||||||
|
|
||||||
|
void _OnText_Analog(int num);
|
||||||
|
void OnText_Analog1(wxCommandEvent& event);
|
||||||
|
void OnText_Analog2(wxCommandEvent& event);
|
||||||
|
void OnText_Analog3(wxCommandEvent& event);
|
||||||
|
void OnText_Analog4(wxCommandEvent& event);
|
||||||
|
|
||||||
|
|
||||||
|
wxDECLARE_EVENT_TABLE();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue