diff --git a/Qt/PPSSPP.pro b/Qt/PPSSPP.pro index c60866afbf..9c6eaa8d1f 100755 --- a/Qt/PPSSPP.pro +++ b/Qt/PPSSPP.pro @@ -3,7 +3,7 @@ QT += core gui opengl include(Settings.pri) linux { - CONFIG += mobility + CONFIG += mobility link_pkgconfig MOBILITY += multimedia } else { @@ -17,14 +17,18 @@ blackberry: LIBS += -L. -lCore -lCommon -lNative -lscreen -lsocket -lstdc++ win32: LIBS += -L. -lCore -lCommon -lNative -lwinmm -lws2_32 -lkernel32 -luser32 -lgdi32 -lshell32 -lcomctl32 -ldsound -lxinput -linux: LIBS += -L. -lCore -lCommon -lNative -linux: PRE_TARGETDEPS += ./libCommon.a ./libCore.a ./libNative.a +linux { + LIBS += -L. -lCore -lCommon -lNative + PRE_TARGETDEPS += ./libCommon.a ./libCore.a ./libNative.a + packagesExist(sdl) { + DEFINES += QT_HAS_SDL + PKGCONFIG += sdl + } +} # Main -SOURCES += ../native/base/QtMain.cpp \ - qkeyedit.cpp -HEADERS += ../native/base/QtMain.h \ - qkeyedit.h +SOURCES += ../native/base/QtMain.cpp +HEADERS += ../native/base/QtMain.h # Native SOURCES += ../android/jni/EmuScreen.cpp \ @@ -44,7 +48,9 @@ linux:!mobile_platform { qtemugl.cpp \ ctrldisasmview.cpp \ ctrlregisterlist.cpp \ - controls.cpp + controls.cpp \ + qkeyedit.cpp \ + gamepaddialog.cpp HEADERS += mainwindow.h \ debugger_disasm.h \ EmuThread.h \ @@ -52,7 +58,9 @@ linux:!mobile_platform { qtemugl.h \ ctrldisasmview.h \ ctrlregisterlist.h \ - controls.h + controls.h \ + qkeyedit.h \ + gamepaddialog.h } else { SOURCES += ../android/jni/NativeApp.cpp } @@ -74,7 +82,8 @@ symbian { linux:!mobile_platform { FORMS += mainwindow.ui \ debugger_disasm.ui \ - controls.ui + controls.ui\ + gamepaddialog.ui RESOURCES += \ resources.qrc diff --git a/Qt/gamepaddialog.cpp b/Qt/gamepaddialog.cpp new file mode 100644 index 0000000000..da657ad470 --- /dev/null +++ b/Qt/gamepaddialog.cpp @@ -0,0 +1,378 @@ +#include "gamepaddialog.h" +#include "ui_gamepaddialog.h" +#include +#include "Core/Config.h" + +// Input +struct GamePadInfo +{ + int mapping_type; // 0 : pad button, 1 : pad axis, 2 : pad Hats + int mapping_in; + int mapping_sign; + QString ViewLabelName; + QString Name; +}; + +// Initial values are PS3 controller +GamePadInfo GamepadPadMapping[] = { + {0, 14, 0, "Prev_X", "Cross"}, //A + {0, 13, 0, "Prev_O", "Circle"}, //B + {0, 15, 0, "Prev_S", "Square"}, //X + {0, 12, 0, "Prev_T", "Triangle"}, //Y + {0, 10, 0, "Prev_LT", "Left Trigger"}, //LBUMPER + {0, 11, 0, "Prev_RT", "Right Trigger"}, //RBUMPER + {0, 3, 0, "Prev_Start", "Start"}, //START + {0, 0, 0, "Prev_Select", "Select"}, //SELECT + {0, 4, 0, "Prev_Up", "Up"}, //UP + {0, 6, 0, "Prev_Down", "Down"}, //DOWN + {0, 7, 0, "Prev_Left", "Left"}, //LEFT + {0, 5, 0, "Prev_Right", "Right"}, //RIGHT + {0, 0, 0, ""}, //MENU (event) + {0, 16, 0, "Prev_Home", "Home"}, //BACK + + // Special case for analog stick + {1, 0, -1, "Prev_ALeft", "Stick left"}, + {1, 0, 1, "Prev_ARight", "Stick right"}, + {1, 1, -1, "Prev_AUp", "Stick up"}, + {1, 1, 1, "Prev_ADown", "Stick bottom"} +}; + +// id for mapping in config start at offset 200 to not get over key mapping +const int configOffset = 200; + +GamePadDialog::GamePadDialog(InputState* state, QWidget *parent) : + QDialog(parent), + ui(new Ui::GamePadDialog), + m_inputState(state), +#if QT_HAS_SDL + m_joystick(0), +#endif + m_isInit(false) +{ + ui->setupUi(this); + SetViewMode(); + +#if QT_HAS_SDL + SDL_Init(SDL_INIT_JOYSTICK); +#endif + m_isInit = true; + + data_timer = new QTimer(); + data_timer->setInterval(50); + connect(data_timer,SIGNAL(timeout()),this,SLOT(pollJoystick())); + data_timer->start(); + + for(int i=0;i<18;i++) + { + QLabel* labelPreview = findChild(GamepadPadMapping[i].ViewLabelName); + if(labelPreview) + { + labelPreview->setVisible(false); + } + + if(g_Config.iMappingMap.find(i+configOffset) != g_Config.iMappingMap.end()) + { + GetMappingFromInt(g_Config.iMappingMap[i+configOffset], + GamepadPadMapping[i].mapping_in, + GamepadPadMapping[i].mapping_type, + GamepadPadMapping[i].mapping_sign); + } + } + + on_refreshListBtn_clicked(); +} + +GamePadDialog::~GamePadDialog() +{ + data_timer->stop(); + delete data_timer; + +#if QT_HAS_SDL + if(m_joystick) + SDL_JoystickClose(m_joystick); + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); +#endif + + delete ui; +} + +void GamePadDialog::on_refreshListBtn_clicked() +{ +#if QT_HAS_SDL + if(m_joystick) + { + SDL_JoystickClose(m_joystick); + ui->JoyName->setText("No GamePad"); + m_joystick = 0; + } + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); + SDL_Init(SDL_INIT_JOYSTICK); + + int numJoy = SDL_NumJoysticks(); + ui->GamePadList->clear(); + for(int i = 0; i < numJoy; i++) + { + QListWidgetItem* item = new QListWidgetItem(); + QString padName = SDL_JoystickName(i); + if(padName == "") padName = "Unknown GamePad"; + item->setText(padName); + item->setData(Qt::UserRole,i); + ui->GamePadList->addItem(item); + } + + if(numJoy > 0) + { + ui->GamePadList->setCurrentRow(0); + on_SelectPadBtn_clicked(); + } + +#endif +} + +void GamePadDialog::pollJoystick() +{ +#if QT_HAS_SDL + if(!m_joystick) + return; + SDL_JoystickUpdate(); + + // Update buttons state + for(int i=0;i<14;i++) + { + float val = 0; + if(GamepadPadMapping[i].mapping_type == 0) + val = SDL_JoystickGetButton(m_joystick,GamepadPadMapping[i].mapping_in); + else if(GamepadPadMapping[i].mapping_type == 1) + { + val = SDL_JoystickGetAxis(m_joystick,GamepadPadMapping[i].mapping_in); + if(val*GamepadPadMapping[i].mapping_sign > 16384) val = 1; + else val = 0; + } + else if(GamepadPadMapping[i].mapping_type == 2) + val = SDL_JoystickGetHat(m_joystick,GamepadPadMapping[i].mapping_in); + QLabel* labelPreview = findChild(GamepadPadMapping[i].ViewLabelName); + if(labelPreview) + { + labelPreview->setVisible(val != 0); + } + if(val) + { + m_inputState->pad_buttons |= (1<pad_buttons &= ~(1<pad_lstick_x = 0; + m_inputState->pad_lstick_y = 0; + for(int i = 14; i < 18; i++) + { + float val = 0; + if(GamepadPadMapping[i].mapping_type == 0) + val = SDL_JoystickGetButton(m_joystick,GamepadPadMapping[i].mapping_in); + else if(GamepadPadMapping[i].mapping_type == 1) + { + val = SDL_JoystickGetAxis(m_joystick,GamepadPadMapping[i].mapping_in); + if((val <= 0 && GamepadPadMapping[i].mapping_sign < 0) || (val >= 0 && GamepadPadMapping[i].mapping_sign > 0)) + val = abs(val) * 1.0f / 32767; + else + val = 0; + } + else if(GamepadPadMapping[i].mapping_type == 2) + val = SDL_JoystickGetHat(m_joystick,GamepadPadMapping[i].mapping_in); + QLabel* labelPreview = findChild(GamepadPadMapping[i].ViewLabelName); + if(labelPreview) + { + labelPreview->setVisible(val != 0); + } + switch(i) + { + case 14: + m_inputState->pad_lstick_x -= val; + break; + case 15: + m_inputState->pad_lstick_x += val; + break; + case 16: + m_inputState->pad_lstick_y -= val; + break; + default: + m_inputState->pad_lstick_y += val; + break; + } + } + + if(isVisible()) + { + for(int i = 0; i < ui->padValues->topLevelItemCount(); i++) + { + QTreeWidgetItem* item = ui->padValues->topLevelItem(i); + for(int j = 0; j < item->childCount(); j++) + { + QTreeWidgetItem* item2 = item->child(j); + if(item2->data(0,Qt::UserRole).toInt() == 0) + { + item2->setText(1,QVariant(SDL_JoystickGetButton(m_joystick,item2->data(0,Qt::UserRole+1).toInt())).toString()); + } + else if(item2->data(0,Qt::UserRole).toInt() == 1) + { + int val = SDL_JoystickGetAxis(m_joystick,item2->data(0,Qt::UserRole+1).toInt()); + if((val <= 0 && item2->data(0,Qt::UserRole+2).toInt() < 0) || (val >= 0 && item2->data(0,Qt::UserRole+2).toInt() > 0)) + item2->setText(1,QVariant(val).toString()); + } + else if(item2->data(0,Qt::UserRole).toInt() == 2) + { + item2->setText(1,QVariant(SDL_JoystickGetHat(m_joystick,item2->data(0,Qt::UserRole+1).toInt())).toString()); + } + } + } + } +#endif +} + + +void GamePadDialog::on_SelectPadBtn_clicked() +{ +#if QT_HAS_SDL + int selectedJoy = -1; + if(ui->GamePadList->currentItem() == 0) + { + return; + } + selectedJoy = ui->GamePadList->currentItem()->data(Qt::UserRole).toInt(); + m_joyId = selectedJoy; + m_joystick = SDL_JoystickOpen(selectedJoy); + + ui->padValues->clear(); + ui->padValues->setColumnCount(3); + ui->padValues->setColumnWidth(0,100); + ui->padValues->setColumnWidth(1,50); + ui->padValues->setColumnWidth(2,50); + + ui->comboPadInput->clear(); + ui->comboPSPButton->clear(); + + QTreeWidgetItem* buttonItem = new QTreeWidgetItem(); + buttonItem->setText(0,"Buttons"); + ui->padValues->addTopLevelItem(buttonItem); + + for(int i = 0; i < SDL_JoystickNumButtons(m_joystick); i++) + { + QTreeWidgetItem* item = new QTreeWidgetItem(); + item->setText(0,QVariant(i).toString()); + item->setText(1,QVariant(0).toString()); + item->setData(0, Qt::UserRole,0); + item->setData(0, Qt::UserRole+1,i); + item->setData(0, Qt::UserRole+2,0); + buttonItem->addChild(item); + + int id = i << 8; + ui->comboPadInput->addItem("Button "+QVariant(i).toString(),GetIntFromMapping(i,0,0)); + } + QTreeWidgetItem* axesItem = new QTreeWidgetItem(); + axesItem->setText(0,"Axes"); + ui->padValues->addTopLevelItem(axesItem); + + for(int i = 0; i < SDL_JoystickNumAxes(m_joystick); i++) + { + QTreeWidgetItem* item = new QTreeWidgetItem(); + item->setText(0,QVariant(i).toString()+" Neg"); + item->setText(1,QVariant(0).toString()); + item->setData(0, Qt::UserRole,1); + item->setData(0, Qt::UserRole+1,i); + item->setData(0, Qt::UserRole+2,-1); + axesItem->addChild(item); + + ui->comboPadInput->addItem("Axes "+QVariant(i).toString()+" Neg",GetIntFromMapping(i,1,-1)); + + item = new QTreeWidgetItem(); + item->setText(0,QVariant(i).toString()+" Pos"); + item->setText(1,QVariant(0).toString()); + item->setData(0, Qt::UserRole,1); + item->setData(0, Qt::UserRole+1,i); + item->setData(0, Qt::UserRole+2,1); + axesItem->addChild(item); + + ui->comboPadInput->addItem("Axes "+QVariant(i).toString()+" Pos",GetIntFromMapping(i,1,1)); + } + + QTreeWidgetItem* hatsItem = new QTreeWidgetItem(); + hatsItem->setText(0,"Hats"); + ui->padValues->addTopLevelItem(hatsItem); + + for(int i = 0; i < SDL_JoystickNumHats(m_joystick); i++) + { + QTreeWidgetItem* item = new QTreeWidgetItem(); + item->setText(0,QVariant(i).toString()); + item->setText(1,QVariant(0).toString()); + item->setData(0, Qt::UserRole,2); + item->setData(0, Qt::UserRole+1,i); + item->setData(0, Qt::UserRole+2,0); + hatsItem->addChild(item); + + ui->comboPadInput->addItem("Button "+QVariant(i).toString(),GetIntFromMapping(i,2,0)); + } + + for(int i = 0; i < 18; i++) + { + if(GamepadPadMapping[i].Name != "") + { + ui->comboPSPButton->addItem(GamepadPadMapping[i].Name,i); + } + } + + SetViewMode(); +#endif +} + +void GamePadDialog::SetViewMode() +{ +#if QT_HAS_SDL + ui->buttonBox->setEnabled(true); + ui->refreshListBtn->setEnabled(true); + ui->SelectPadBtn->setEnabled(true); + if(!m_joystick) + ui->JoyName->setText("No GamePad"); + else + ui->JoyName->setText(QString("Current gamepad : ")+SDL_JoystickName(m_joyId)+""); +#endif +} + +void GamePadDialog::on_AssignBtn_clicked() +{ + int idxPad = ui->comboPadInput->currentIndex(); + int idxPSP = ui->comboPSPButton->currentIndex(); + + int pspButton = ui->comboPSPButton->itemData(idxPSP).toInt(); + int padInfo = ui->comboPadInput->itemData(idxPad).toInt(); + + GetMappingFromInt(padInfo, GamepadPadMapping[pspButton].mapping_in, + GamepadPadMapping[pspButton].mapping_type, + GamepadPadMapping[pspButton].mapping_sign); +} + +int GamePadDialog::GetIntFromMapping(int inputId, int type, int sign) +{ + sign = (sign == -1 ? 1 : (sign == 1 ? 2 : 0)); + return inputId << 8 | sign << 2 | type; +} + +void GamePadDialog::GetMappingFromInt(int padInfo, int& inputId, int& type, int& sign) +{ + inputId = padInfo >> 8; + type = padInfo & 0x3; + sign = (padInfo >> 2) & 0x3; + sign = (sign == 1 ? -1 : (sign == 2 ? 1 : 0)); +} + +void GamePadDialog::on_buttonBox_accepted() +{ + for(int i = 0; i < 18; i++) + { + g_Config.iMappingMap[i+configOffset] = GetIntFromMapping(GamepadPadMapping[i].mapping_in, + GamepadPadMapping[i].mapping_type, + GamepadPadMapping[i].mapping_sign); + } +} diff --git a/Qt/gamepaddialog.h b/Qt/gamepaddialog.h new file mode 100644 index 0000000000..dabae24b4a --- /dev/null +++ b/Qt/gamepaddialog.h @@ -0,0 +1,51 @@ +#ifndef GAMEPADDIALOG_H +#define GAMEPADDIALOG_H + +#include +#if QT_HAS_SDL +#include "SDL/SDL.h" +#endif +#include "native/input/input_state.h" + +namespace Ui { +class GamePadDialog; +} +class QTimer; + +class GamePadDialog : public QDialog +{ + Q_OBJECT + +public: + explicit GamePadDialog(InputState* inputState, QWidget *parent = 0); + ~GamePadDialog(); + + void SetViewMode(); + void SetCalibMode(); + void CalibNextButton(); +private slots: + void on_refreshListBtn_clicked(); + + void on_SelectPadBtn_clicked(); + + void pollJoystick(); + + void on_AssignBtn_clicked(); + + void on_buttonBox_accepted(); + +private: + int GetIntFromMapping(int inputId, int type, int sign); + void GetMappingFromInt(int value, int &inputId, int &type, int &sign); + + Ui::GamePadDialog *ui; +#if QT_HAS_SDL + SDL_Joystick* m_joystick; + int m_joyId; +#endif + InputState* m_inputState; + bool m_isInit; + QTimer *data_timer; +}; + +#endif // GAMEPADDIALOG_H diff --git a/Qt/gamepaddialog.ui b/Qt/gamepaddialog.ui new file mode 100644 index 0000000000..737cca89a5 --- /dev/null +++ b/Qt/gamepaddialog.ui @@ -0,0 +1,512 @@ + + + GamePadDialog + + + + 0 + 0 + 850 + 501 + + + + Gamepad Configuration + + + + + + + + GamePad List + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Refresh + + + + + + + Select + + + + + + + + + Gamepad Values : + + + + + + + false + + + + 1 + + + + + + + + + + + + + TextLabel + + + Qt::AlignCenter + + + + + + + + + Assign Gamepad input + + + + + + + + + + to PSP button/axis + + + + + + + + + + Assign + + + + + + + + + Press buttons on your gamePad to verify mapping : + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 500 + 218 + + + + + + 0 + 0 + 500 + 218 + + + + + + + :/images/resources/psp.png + + + + + + 110 + 78 + 21 + 21 + + + + + + + :/images/resources/psp_up_red.png + + + + + + 92 + 93 + 21 + 20 + + + + + + + :/images/resources/psp_left_red.png + + + + + + 122 + 94 + 20 + 20 + + + + + + + :/images/resources/psp_right_red.png + + + + + + 109 + 105 + 21 + 30 + + + + + + + :/images/resources/psp_down_red.png + + + + + + 141 + 165 + 30 + 21 + + + + + + + :/images/resources/psp_smallbtn_red.png + + + + + + 312 + 166 + 21 + 16 + + + + + + + :/images/resources/psp_smallbtn_red.png + + + + + + 339 + 166 + 21 + 16 + + + + + + + :/images/resources/psp_smallbtn_red.png + + + + + + 351 + 92 + 21 + 21 + + + + + + + :/images/resources/psp_rightbtn_red.png + + + + + + 374 + 114 + 21 + 21 + + + + + + + :/images/resources/psp_rightbtn_red.png + + + + + + 396 + 93 + 21 + 21 + + + + + + + :/images/resources/psp_rightbtn_red.png + + + + + + 374 + 71 + 21 + 21 + + + + + + + :/images/resources/psp_rightbtn_red.png + + + + + + 351 + 32 + 61 + 21 + + + + + + + :/images/resources/psp_rt_red.png + + + + + + 93 + 32 + 60 + 21 + + + + + + + :/images/resources/psp_lt_red.png + + + + + + 107 + 144 + 21 + 21 + + + + + + + :/images/resources/psp_adown.png + + + + + + 107 + 139 + 16 + 21 + + + + + + + :/images/resources/psp_aleft.png + + + + + + 108 + 134 + 21 + 21 + + + + + + + :/images/resources/psp_aup.png + + + + + + 118 + 138 + 21 + 21 + + + + + + + :/images/resources/psp_aright.png + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + GamePadDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + GamePadDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/Qt/mainwindow.cpp b/Qt/mainwindow.cpp index 497a8178c8..36e828bce8 100644 --- a/Qt/mainwindow.cpp +++ b/Qt/mainwindow.cpp @@ -32,6 +32,10 @@ MainWindow::MainWindow(QWidget *parent) : qApp->installEventFilter(this); controls = new Controls(this); +#if QT_HAS_SDL + gamePadDlg = new GamePadDialog(&input_state, this); +#endif + host = new QtHost(this); w = ui->widget; w->init(&input_state); @@ -765,3 +769,12 @@ void MainWindow::on_actionLogDefError_triggered() } UpdateMenus(); } + +void MainWindow::on_action_OptionsGamePadControls_triggered() +{ +#if QT_HAS_SDL + gamePadDlg->show(); +#else + QMessageBox::information(this,"Gamepad","You need to compile with SDL to have Gamepad support.", QMessageBox::Ok); +#endif +} diff --git a/Qt/mainwindow.h b/Qt/mainwindow.h index 4fffe2d1c9..d8a41a0e99 100644 --- a/Qt/mainwindow.h +++ b/Qt/mainwindow.h @@ -7,6 +7,7 @@ #include "input/input_state.h" #include "debugger_disasm.h" #include "controls.h" +#include "gamepaddialog.h" class QtEmuGL; namespace Ui { @@ -132,6 +133,8 @@ private slots: void on_actionLogDefError_triggered(); + void on_action_OptionsGamePadControls_triggered(); + private: Ui::MainWindow *ui; @@ -139,10 +142,10 @@ private: CoreState nextState; InputState input_state; - bool g_bFullScreen; Debugger_Disasm *dialogDisasm; Controls* controls; + GamePadDialog* gamePadDlg; }; #endif // MAINWINDOW_H diff --git a/Qt/mainwindow.ui b/Qt/mainwindow.ui index eda55d0f63..1a563fe407 100644 --- a/Qt/mainwindow.ui +++ b/Qt/mainwindow.ui @@ -136,6 +136,7 @@ + @@ -320,7 +321,7 @@ - &Controls + Keyboard &Controls @@ -556,6 +557,11 @@ Error + + + GamePad Controls + + diff --git a/Qt/resources.qrc b/Qt/resources.qrc index 80d141a427..4bcd4f9d3d 100644 --- a/Qt/resources.qrc +++ b/Qt/resources.qrc @@ -2,5 +2,17 @@ resources/psp.png resources/psp_map.png + resources/psp_rightbtn_red.png + resources/psp_smallbtn_red.png + resources/psp_down_red.png + resources/psp_up_red.png + resources/psp_right_red.png + resources/psp_left_red.png + resources/psp_rt_red.png + resources/psp_lt_red.png + resources/psp_aright.png + resources/psp_adown.png + resources/psp_aleft.png + resources/psp_aup.png diff --git a/Qt/resources/psp_adown.png b/Qt/resources/psp_adown.png new file mode 100644 index 0000000000..141664b2a4 Binary files /dev/null and b/Qt/resources/psp_adown.png differ diff --git a/Qt/resources/psp_aleft.png b/Qt/resources/psp_aleft.png new file mode 100644 index 0000000000..60545be238 Binary files /dev/null and b/Qt/resources/psp_aleft.png differ diff --git a/Qt/resources/psp_aright.png b/Qt/resources/psp_aright.png new file mode 100644 index 0000000000..f951c2bb93 Binary files /dev/null and b/Qt/resources/psp_aright.png differ diff --git a/Qt/resources/psp_aup.png b/Qt/resources/psp_aup.png new file mode 100644 index 0000000000..8028261674 Binary files /dev/null and b/Qt/resources/psp_aup.png differ diff --git a/Qt/resources/psp_down_red.png b/Qt/resources/psp_down_red.png new file mode 100644 index 0000000000..0ec28673b2 Binary files /dev/null and b/Qt/resources/psp_down_red.png differ diff --git a/Qt/resources/psp_left_red.png b/Qt/resources/psp_left_red.png new file mode 100644 index 0000000000..353d9be44b Binary files /dev/null and b/Qt/resources/psp_left_red.png differ diff --git a/Qt/resources/psp_lt_red.png b/Qt/resources/psp_lt_red.png new file mode 100644 index 0000000000..a44504f1f2 Binary files /dev/null and b/Qt/resources/psp_lt_red.png differ diff --git a/Qt/resources/psp_right_red.png b/Qt/resources/psp_right_red.png new file mode 100644 index 0000000000..81b809e055 Binary files /dev/null and b/Qt/resources/psp_right_red.png differ diff --git a/Qt/resources/psp_rightbtn_red.png b/Qt/resources/psp_rightbtn_red.png new file mode 100644 index 0000000000..258822507a Binary files /dev/null and b/Qt/resources/psp_rightbtn_red.png differ diff --git a/Qt/resources/psp_rt_red.png b/Qt/resources/psp_rt_red.png new file mode 100644 index 0000000000..ce9b87163c Binary files /dev/null and b/Qt/resources/psp_rt_red.png differ diff --git a/Qt/resources/psp_smallbtn_red.png b/Qt/resources/psp_smallbtn_red.png new file mode 100644 index 0000000000..4239c46fc5 Binary files /dev/null and b/Qt/resources/psp_smallbtn_red.png differ diff --git a/Qt/resources/psp_up_red.png b/Qt/resources/psp_up_red.png new file mode 100644 index 0000000000..dd6f718a79 Binary files /dev/null and b/Qt/resources/psp_up_red.png differ