From d5c2560212aadc41e5d8b86bb47c602aecbba1e2 Mon Sep 17 00:00:00 2001 From: Xele02 Date: Sat, 2 Feb 2013 00:36:35 +0100 Subject: [PATCH] Add window to config key bindings Save the bindings in the conf file in a map. --- Common/IniFile.cpp | 2 +- Common/IniFile.h | 37 ++++++++ Common/StringUtil.h | 8 ++ Core/Config.cpp | 2 + Core/Config.h | 4 + Qt/EmuThread.cpp | 25 ++---- Qt/PPSSPP.pro | 9 +- Qt/controls.cpp | 95 +++++++++++--------- Qt/controls.h | 21 ++++- Qt/controls.ui | 204 +++++++++++++++++++++++++++++++++++++------ Qt/mainwindow.cpp | 34 ++------ Qt/qkeyedit.cpp | 21 +++++ Qt/qkeyedit.h | 20 +++++ Qt/resources.qrc | 5 ++ Qt/resources/psp.png | Bin 0 -> 32685 bytes 15 files changed, 367 insertions(+), 120 deletions(-) create mode 100644 Qt/qkeyedit.cpp create mode 100644 Qt/qkeyedit.h create mode 100644 Qt/resources.qrc create mode 100644 Qt/resources/psp.png diff --git a/Common/IniFile.cpp b/Common/IniFile.cpp index ff867a01b2..40abe02806 100644 --- a/Common/IniFile.cpp +++ b/Common/IniFile.cpp @@ -148,7 +148,7 @@ void IniFile::Section::Set(const char* key, const std::vector& newV std::vector::const_iterator it; for (it = newValues.begin(); it != newValues.end(); ++it) { - temp = (*it) + ","; + temp += (*it) + ","; } // remove last , if (temp.length()) diff --git a/Common/IniFile.h b/Common/IniFile.h index 14c3bfeb31..09ce6ca0de 100644 --- a/Common/IniFile.h +++ b/Common/IniFile.h @@ -20,6 +20,7 @@ #include #include +#include #include "StringUtil.h" @@ -68,12 +69,48 @@ public: } void Set(const char* key, const std::vector& newValues); + template + void Set(const char* key, const std::map& newValues) + { + std::vector temp; + for(typename std::map::const_iterator it = newValues.begin(); it != newValues.end(); it++) + { + temp.push_back(ValueToString(it->first)+"_"+ValueToString(it->second)); + } + Set(key,temp); + } + bool Get(const char* key, int* value, int defaultValue = 0); bool Get(const char* key, u32* value, u32 defaultValue = 0); bool Get(const char* key, bool* value, bool defaultValue = false); bool Get(const char* key, float* value, float defaultValue = false); bool Get(const char* key, double* value, double defaultValue = false); bool Get(const char* key, std::vector& values); + template + bool Get(const char* key, std::map& values) + { + std::vector temp; + if(!Get(key,temp)) + { + return false; + } + values.clear(); + for(int i = 0; i < temp.size(); i++) + { + std::vector key_val; + SplitString(temp[i],'_',key_val); + if(key_val.size() < 2) + continue; + U mapKey; + V mapValue; + if(!TryParse(key_val[0],&mapKey)) + continue; + if(!TryParse(key_val[1],&mapValue)) + continue; + values[mapKey] = mapValue; + } + return true; + } bool operator < (const Section& other) const { return name < other.name; diff --git a/Common/StringUtil.h b/Common/StringUtil.h index 0b2ca1bd08..f27678ebf8 100644 --- a/Common/StringUtil.h +++ b/Common/StringUtil.h @@ -118,6 +118,14 @@ static bool TryParse(const std::string &str, N *const output) return false; } +template +static std::string ValueToString(const N value) +{ + std::stringstream string; + string << value; + return string.str(); +} + // TODO: kill this bool AsciiToHex(const char* _szValue, u32& result); diff --git a/Core/Config.cpp b/Core/Config.cpp index 270cdbb4a2..08ceab4dd0 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -83,6 +83,7 @@ void CConfig::Load(const char *iniFileName) false); #endif control->Get("LargeControls", &bLargeControls, false); + control->Get("KeyMapping",iMappingMap); IniFile::Section *pspConfig = iniFile.GetOrCreateSection("SystemParam"); pspConfig->Get("Language", &ilanguage, PSP_SYSTEMPARAM_LANGUAGE_ENGLISH); @@ -133,6 +134,7 @@ void CConfig::Save() control->Set("ShowStick", bShowAnalogStick); control->Set("ShowTouchControls", bShowTouchControls); control->Set("LargeControls", bLargeControls); + control->Set("KeyMapping",iMappingMap); IniFile::Section *pspConfig = iniFile.GetOrCreateSection("SystemParam"); pspConfig->Set("Language", ilanguage); diff --git a/Core/Config.h b/Core/Config.h index 6ff3b75136..5eeebf1b49 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -18,6 +18,7 @@ #pragma once #include +#include #define PPSSPP_VERSION_STR "0.6.1" @@ -73,6 +74,9 @@ public: bool bShowDebugStats; bool bLargeControls; + // Control + std::map iMappingMap; // Can be used differently depending on systems + // SystemParam int ilanguage; int itimeformat; diff --git a/Qt/EmuThread.cpp b/Qt/EmuThread.cpp index 4ffd52b3a7..935766b810 100644 --- a/Qt/EmuThread.cpp +++ b/Qt/EmuThread.cpp @@ -109,27 +109,12 @@ void EmuThread::run() UpdateInputState(input_state); - static const int mapping[12][2] = { - {PAD_BUTTON_A, CTRL_CROSS}, - {PAD_BUTTON_B, CTRL_CIRCLE}, - {PAD_BUTTON_X, CTRL_SQUARE}, - {PAD_BUTTON_Y, CTRL_TRIANGLE}, - {PAD_BUTTON_UP, CTRL_UP}, - {PAD_BUTTON_DOWN, CTRL_DOWN}, - {PAD_BUTTON_LEFT, CTRL_LEFT}, - {PAD_BUTTON_RIGHT, CTRL_RIGHT}, - {PAD_BUTTON_LBUMPER, CTRL_LTRIGGER}, - {PAD_BUTTON_RBUMPER, CTRL_RTRIGGER}, - {PAD_BUTTON_START, CTRL_START}, - {PAD_BUTTON_SELECT, CTRL_SELECT}, - }; - - for (int i = 0; i < 12; i++) { - if (input_state->pad_buttons_down & mapping[i][0]) { - __CtrlButtonDown(mapping[i][1]); + for (int i = 0; i < controllistCount; i++) { + if (input_state->pad_buttons_down & controllist[i].emu_id) { + __CtrlButtonDown(controllist[i].psp_id); } - if (input_state->pad_buttons_up & mapping[i][0]) { - __CtrlButtonUp(mapping[i][1]); + if (input_state->pad_buttons_up & controllist[i].emu_id) { + __CtrlButtonUp(controllist[i].psp_id); } } __CtrlSetAnalog(input_state->pad_lstick_x, input_state->pad_lstick_y); diff --git a/Qt/PPSSPP.pro b/Qt/PPSSPP.pro index 4f018883c9..c60866afbf 100755 --- a/Qt/PPSSPP.pro +++ b/Qt/PPSSPP.pro @@ -21,8 +21,10 @@ linux: LIBS += -L. -lCore -lCommon -lNative linux: PRE_TARGETDEPS += ./libCommon.a ./libCore.a ./libNative.a # Main -SOURCES += ../native/base/QtMain.cpp -HEADERS += ../native/base/QtMain.h +SOURCES += ../native/base/QtMain.cpp \ + qkeyedit.cpp +HEADERS += ../native/base/QtMain.h \ + qkeyedit.h # Native SOURCES += ../android/jni/EmuScreen.cpp \ @@ -73,4 +75,7 @@ linux:!mobile_platform { FORMS += mainwindow.ui \ debugger_disasm.ui \ controls.ui + + RESOURCES += \ + resources.qrc } diff --git a/Qt/controls.cpp b/Qt/controls.cpp index 82993f791b..ad1fa83566 100644 --- a/Qt/controls.cpp +++ b/Qt/controls.cpp @@ -1,29 +1,24 @@ #include "controls.h" #include "ui_controls.h" +#include "Core/Config.h" -struct Controls_ -{ - char* command; - char* key; -}; - -const Controls_ controllist[] = { - {"Start","1"}, - {"Select","2"}, - {"Square","Z"}, - {"Triangle","A"}, - {"Circle","S"}, - {"Cross","X"}, - {"Left Trigger","Q"}, - {"Right Trigger","W"}, - {"Up","Arrow Up"}, - {"Down","Arrow Down"}, - {"Left","Arrow Left"}, - {"Right","Arrow Right"}, - {"Analog Up","I"}, - {"Analog Down","K"}, - {"Analog Left","J"}, - {"Analog Right","L"}, +Controls_ controllist[] = { + {"Edit_Start", "Start", Qt::Key_1, PAD_BUTTON_START, CTRL_START}, + {"Edit_Select", "Select", Qt::Key_2, PAD_BUTTON_SELECT, CTRL_SELECT}, + {"Edit_S", "Square", Qt::Key_Z, PAD_BUTTON_X, CTRL_SQUARE}, + {"Edit_T", "Triangle", Qt::Key_A, PAD_BUTTON_Y, CTRL_TRIANGLE}, + {"Edit_O", "Circle", Qt::Key_S, PAD_BUTTON_B, CTRL_CIRCLE}, + {"Edit_X", "Cross", Qt::Key_X, PAD_BUTTON_A, CTRL_CROSS}, + {"Edit_LT", "Left Trigger", Qt::Key_Q, PAD_BUTTON_LBUMPER, CTRL_LTRIGGER}, + {"Edit_RT", "Right Trigger", Qt::Key_W, PAD_BUTTON_RBUMPER, CTRL_RTRIGGER}, + {"Edit_Up", "Up", Qt::Key_Up, PAD_BUTTON_UP, CTRL_UP}, + {"Edit_Down", "Down", Qt::Key_Down, PAD_BUTTON_DOWN, CTRL_DOWN}, + {"Edit_Left", "Left", Qt::Key_Left, PAD_BUTTON_LEFT, CTRL_LEFT}, + {"Edit_Right", "Right", Qt::Key_Right, PAD_BUTTON_RIGHT, CTRL_RIGHT}, + {"", "Analog Up", Qt::Key_I, PAD_BUTTON_JOY_UP, 0}, + {"", "Analog Down", Qt::Key_K, PAD_BUTTON_JOY_DOWN,0}, + {"", "Analog Left", Qt::Key_J, PAD_BUTTON_JOY_LEFT,0}, + {"", "Analog Right", Qt::Key_L, PAD_BUTTON_JOY_RIGHT,0}, }; Controls::Controls(QWidget *parent) : @@ -31,25 +26,47 @@ Controls::Controls(QWidget *parent) : ui(new Ui::Controls) { ui->setupUi(this); - - int numRows = sizeof(controllist)/sizeof(Controls_); - - ui->listControls->setRowCount(numRows); - - for(int i = 0; i < numRows; i++) - { - QTableWidgetItem* item = new QTableWidgetItem(); - item->setText(controllist[i].command); - ui->listControls->setItem(i,0,item); - - item = new QTableWidgetItem(); - item->setText(controllist[i].key); - ui->listControls->setItem(i,1,item); - ui->listControls->setRowHeight(i,15); - } } Controls::~Controls() { delete ui; } + +void Controls::showEvent(QShowEvent*) +{ + for(int i = 0; i < controllistCount; i++) + { + if(g_Config.iMappingMap.find(i) != g_Config.iMappingMap.end()) + { + controllist[i].key = (Qt::Key)g_Config.iMappingMap[i]; + } + + if(controllist[i].editName != "") + { + QLineEdit* edit = findChild(controllist[i].editName); + if(edit) + { + QKeySequence sec(controllist[i].key); + edit->setText(sec.toString()); + } + } + } +} + +void Controls::on_buttonBox_accepted() +{ + for(int i = 0; i < controllistCount; i++) + { + if(controllist[i].editName != "") + { + QLineEdit* edit = findChild(controllist[i].editName); + if(edit) + { + QKeySequence sec(edit->text()); + controllist[i].key = (Qt::Key)sec[0]; + g_Config.iMappingMap[i] = sec[0]; + } + } + } +} diff --git a/Qt/controls.h b/Qt/controls.h index fb5d1ad3ac..347fd8b250 100644 --- a/Qt/controls.h +++ b/Qt/controls.h @@ -2,11 +2,26 @@ #define CONTROLS_H #include +#include "native/input/input_state.h" +#include "Core/HLE/sceCtrl.h" namespace Ui { class Controls; } +struct Controls_ +{ +public: + QString editName; + QString command; + Qt::Key key; + int emu_id; + int psp_id; +}; + +const int controllistCount = 16; +extern Controls_ controllist[]; + class Controls : public QDialog { Q_OBJECT @@ -14,7 +29,11 @@ class Controls : public QDialog public: explicit Controls(QWidget *parent = 0); ~Controls(); - + + void showEvent(QShowEvent *); +private slots: + void on_buttonBox_accepted(); + private: Ui::Controls *ui; }; diff --git a/Qt/controls.ui b/Qt/controls.ui index 9215adf9f7..77de1e830d 100644 --- a/Qt/controls.ui +++ b/Qt/controls.ui @@ -6,43 +6,180 @@ 0 0 - 400 - 300 + 618 + 351 + + + 0 + 0 + + Dialog - - - Note : Currently controls are NOT configurable. + + + + 600 + 300 + - - - - - - QAbstractItemView::SingleSelection + + + 600 + 300 + - - QAbstractItemView::SelectRows - - - false - - - 2 - - - false - - - false - - - + + + + 50 + 50 + 501 + 191 + + + + + + + :/images/resources/psp.png + + + + + + 50 + 100 + 41 + 25 + + + + + + + 30 + 130 + 41 + 25 + + + + + + + 80 + 130 + 41 + 25 + + + + + + + 50 + 160 + 41 + 25 + + + + + + + 150 + 240 + 41 + 25 + + + + + + + 410 + 240 + 41 + 25 + + + + + + + 360 + 240 + 41 + 25 + + + + + + + 510 + 160 + 41 + 25 + + + + + + + 480 + 130 + 41 + 25 + + + + + + + 530 + 130 + 41 + 25 + + + + + + + 510 + 100 + 41 + 25 + + + + + + + 440 + 20 + 41 + 25 + + + + + + + 120 + 20 + 41 + 25 + + + @@ -57,7 +194,16 @@ - + + + QKeyEdit + QLineEdit +
qkeyedit.h
+
+
+ + + buttonBox diff --git a/Qt/mainwindow.cpp b/Qt/mainwindow.cpp index 4456555cbc..497a8178c8 100644 --- a/Qt/mainwindow.cpp +++ b/Qt/mainwindow.cpp @@ -20,28 +20,6 @@ #include "QtHost.h" #include "EmuThread.h" -// Input -const int buttonMappings[18] = { - Qt::Key_X, //A - Qt::Key_S, //B - Qt::Key_Z, //X - Qt::Key_A, //Y - Qt::Key_W, //LBUMPER - Qt::Key_Q, //RBUMPER - Qt::Key_1, //START - Qt::Key_2, //SELECT - Qt::Key_Up, //UP - Qt::Key_Down, //DOWN - Qt::Key_Left, //LEFT - Qt::Key_Right, //RIGHT - 0, //MENU (event) - Qt::Key_Backspace, //BACK - Qt::Key_I, //JOY UP - Qt::Key_K, //JOY DOWN - Qt::Key_J, //JOY LEFT - Qt::Key_L, //JOY RIGHT -}; - const char *stateToLoad = NULL; MainWindow::MainWindow(QWidget *parent) : @@ -673,20 +651,20 @@ void MainWindow::keyPressEvent(QKeyEvent *e) return; } - for (int b = 0; b < 14; b++) { - if (e->key() == buttonMappings[b]) + for (int b = 0; b < controllistCount; b++) { + if (e->key() == controllist[b].key) { - input_state.pad_buttons |= (1<key() == buttonMappings[b]) + for (int b = 0; b < controllistCount; b++) { + if (e->key() == controllist[b].key) { - input_state.pad_buttons &= ~(1< +#include + +QKeyEdit::QKeyEdit(QWidget *parent) : + QLineEdit(parent) +{ +} + +bool QKeyEdit::event(QEvent *e) +{ + if(e->type() == QEvent::KeyPress) + { + QKeyEvent *ke = static_cast(e); + QKeySequence seq(ke->key()); + setText(seq.toString()); + return true; + } + + return QLineEdit::event(e); +} diff --git a/Qt/qkeyedit.h b/Qt/qkeyedit.h new file mode 100644 index 0000000000..1beb9ac352 --- /dev/null +++ b/Qt/qkeyedit.h @@ -0,0 +1,20 @@ +#ifndef QKEYEDIT_H +#define QKEYEDIT_H + +#include + +class QKeyEdit : public QLineEdit +{ + Q_OBJECT +public: + explicit QKeyEdit(QWidget *parent = 0); + +protected: + bool event(QEvent *e); +signals: + +public slots: + +}; + +#endif // QKEYEDIT_H diff --git a/Qt/resources.qrc b/Qt/resources.qrc new file mode 100644 index 0000000000..b99c51d7c5 --- /dev/null +++ b/Qt/resources.qrc @@ -0,0 +1,5 @@ + + + resources/psp.png + + diff --git a/Qt/resources/psp.png b/Qt/resources/psp.png new file mode 100644 index 0000000000000000000000000000000000000000..aa6330b1b49d2a731aae3d2d4025aa4c919608b4 GIT binary patch literal 32685 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 F{~xFM>