aboutsummaryrefslogtreecommitdiff
path: root/src/frontend
diff options
context:
space:
mode:
authorArisotura <thetotalworm@gmail.com>2020-05-19 12:06:25 +0200
committerArisotura <thetotalworm@gmail.com>2020-05-19 12:06:25 +0200
commit7026bb15f6688d4148932a7624baf2f3d5d22d8f (patch)
treed41b4febc8967f93850bf2ee37ff951a02f498eb /src/frontend
parent19566178ba7ee1fcd4207139286707cc3896493a (diff)
input dialog progress.
Diffstat (limited to 'src/frontend')
-rw-r--r--src/frontend/qt_sdl/InputConfigDialog.cpp245
-rw-r--r--src/frontend/qt_sdl/InputConfigDialog.h32
-rw-r--r--src/frontend/qt_sdl/InputConfigDialog.ui11
-rw-r--r--src/frontend/qt_sdl/main.cpp4
-rw-r--r--src/frontend/qt_sdl/main.h2
5 files changed, 286 insertions, 8 deletions
diff --git a/src/frontend/qt_sdl/InputConfigDialog.cpp b/src/frontend/qt_sdl/InputConfigDialog.cpp
index f7c0ab2..3b006fd 100644
--- a/src/frontend/qt_sdl/InputConfigDialog.cpp
+++ b/src/frontend/qt_sdl/InputConfigDialog.cpp
@@ -16,7 +16,9 @@
with melonDS. If not, see http://www.gnu.org/licenses/.
*/
-//
+#include <QGroupBox>
+#include <QLabel>
+#include <QKeyEvent>
#include "types.h"
#include "Config.h"
@@ -28,13 +30,68 @@
InputConfigDialog* InputConfigDialog::currentDlg = nullptr;
+const int dskeyorder[12] = {0, 1, 10, 11, 5, 4, 6, 7, 9, 8, 2, 3};
+const char* dskeylabels[12] = {"A", "B", "X", "Y", "Left", "Right", "Up", "Down", "L", "R", "Select", "Start"};
+
+const int hk_addons[] =
+{
+ HK_SolarSensorIncrease,
+ HK_SolarSensorDecrease,
+};
+
+const char* hk_addons_labels[] =
+{
+ "[Boktai] Sunlight + ",
+ "[Boktai] Sunlight - ",
+};
+
+const int hk_general[] =
+{
+ HK_Pause,
+ HK_Reset,
+ HK_FastForward,
+ HK_FastForwardToggle,
+ HK_Lid,
+ HK_Mic,
+};
+
+const char* hk_general_labels[] =
+{
+ "Pause/resume",
+ "Reset",
+ "Fast forward",
+ "Toggle FPS limit",
+ "Close/open lid",
+ "Microphone",
+};
+
InputConfigDialog::InputConfigDialog(QWidget* parent) : QDialog(parent), ui(new Ui::InputConfigDialog)
{
ui->setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
- //
+ for (int i = 0; i < 12; i++)
+ {
+ keypadKeyMap[i] = Config::KeyMapping[dskeyorder[i]];
+ keypadJoyMap[i] = Config::JoyMapping[dskeyorder[i]];
+ }
+
+ for (int i = 0; i < 2; i++)
+ {
+ addonsKeyMap[i] = Config::HKKeyMapping[hk_addons[i]];
+ addonsJoyMap[i] = Config::HKJoyMapping[hk_addons[i]];
+ }
+
+ for (int i = 0; i < 6; i++)
+ {
+ hkGeneralKeyMap[i] = Config::HKKeyMapping[hk_general[i]];
+ hkGeneralJoyMap[i] = Config::HKJoyMapping[hk_general[i]];
+ }
+
+ populatePage(ui->tabInput, 12, dskeylabels, keypadKeyMap, keypadJoyMap);
+ populatePage(ui->tabAddons, 2, hk_addons_labels, addonsKeyMap, addonsJoyMap);
+ populatePage(ui->tabHotkeysGeneral, 6, hk_general_labels, hkGeneralKeyMap, hkGeneralJoyMap);
}
InputConfigDialog::~InputConfigDialog()
@@ -42,6 +99,109 @@ InputConfigDialog::~InputConfigDialog()
delete ui;
}
+void InputConfigDialog::populatePage(QWidget* page, int num, const char** labels, int* keymap, int* joymap)
+{
+ // kind of a hack
+ bool ishotkey = (page != ui->tabInput);
+
+ QHBoxLayout* main_layout = new QHBoxLayout();
+
+ QGroupBox* group;
+ QGridLayout* group_layout;
+
+ group = new QGroupBox("Keyboard mappings:");
+ main_layout->addWidget(group);
+ group_layout = new QGridLayout();
+ group_layout->setSpacing(1);
+ for (int i = 0; i < num; i++)
+ {
+ QLabel* label = new QLabel(QString(labels[i])+":");
+ KeyMapButton* btn = new KeyMapButton(nullptr, &keymap[i], ishotkey);
+
+ group_layout->addWidget(label, i, 0);
+ group_layout->addWidget(btn, i, 1);
+ }
+ group_layout->setRowStretch(num, 1);
+ group->setLayout(group_layout);
+ group->setMinimumWidth(275);
+
+ group = new QGroupBox("Joystick mappings:");
+ main_layout->addWidget(group);
+ group_layout = new QGridLayout();
+ group_layout->setSpacing(1);
+ for (int i = 0; i < num; i++)
+ {
+ QLabel* label = new QLabel(QString(labels[i])+":");
+ QPushButton* btn = new QPushButton();
+
+ group_layout->addWidget(label, i, 0);
+ group_layout->addWidget(btn, i, 1);
+
+ btn->setText(joyMappingName(joymap[i]));
+
+ //btn->setProperty("mapping", QVariant(&joymap[i]));
+ //btn->setProperty("isHotkey", QVariant(ishotkey));
+ }
+ group_layout->setRowStretch(num, 1);
+ group->setLayout(group_layout);
+ group->setMinimumWidth(275);
+
+ page->setLayout(main_layout);
+}
+
+QString InputConfigDialog::joyMappingName(int id)
+{
+ if (id < 0)
+ {
+ return "None";
+ }
+
+ bool hasbtn = ((id & 0xFFFF) != 0xFFFF);
+ QString str;
+
+ if (hasbtn)
+ {
+ if (id & 0x100)
+ {
+ int hatnum = ((id >> 4) & 0xF) + 1;
+
+ switch (id & 0xF)
+ {
+ case 0x1: str = "Hat %1 up"; break;
+ case 0x2: str = "Hat %1 right"; break;
+ case 0x4: str = "Hat %1 down"; break;
+ case 0x8: str = "Hat %1 left"; break;
+ }
+
+ str = str.arg(hatnum);
+ }
+ else
+ {
+ str = QString("Button %1").arg((id & 0xFFFF) + 1);
+ }
+ }
+ else
+ {
+ str = "";
+ }
+
+ if (id & 0x10000)
+ {
+ int axisnum = ((id >> 24) & 0xF) + 1;
+
+ if (hasbtn) str += " / ";
+
+ switch ((id >> 20) & 0xF)
+ {
+ case 0: str += QString("Axis %1 +").arg(axisnum); break;
+ case 1: str += QString("Axis %1 -").arg(axisnum); break;
+ case 2: str += QString("Trigger %1").arg(axisnum); break;
+ }
+ }
+
+ return str;
+}
+
void InputConfigDialog::on_InputConfigDialog_accepted()
{
closeDlg();
@@ -51,3 +211,84 @@ void InputConfigDialog::on_InputConfigDialog_rejected()
{
closeDlg();
}
+
+
+KeyMapButton::KeyMapButton(QWidget* parent, int* mapping, bool hotkey) : QPushButton(parent)
+{
+ this->mapping = mapping;
+ this->isHotkey = hotkey;
+
+ setCheckable(true);
+ setText(mappingText());
+
+ connect(this, &KeyMapButton::clicked, this, &KeyMapButton::onClick);
+}
+
+KeyMapButton::~KeyMapButton()
+{
+}
+
+void KeyMapButton::keyPressEvent(QKeyEvent* event)
+{
+ if (!isChecked()) return QPushButton::keyPressEvent(event);
+printf("KEY PRESSED = %08X %08X | %08X %08X %08X | %08X\n", event->key(), event->modifiers(), event->nativeVirtualKey(), event->nativeModifiers(), event->nativeScanCode(), Qt::SHIFT);
+ int key = event->key();
+ bool ismod = (key == Qt::Key_Control ||
+ key == Qt::Key_Alt ||
+ key == Qt::Key_Shift ||
+ key == Qt::Key_Meta);
+
+ if (isHotkey)
+ {
+ if (ismod)
+ return;
+ }
+
+ if (!ismod)
+ key |= event->modifiers();
+
+ *mapping = key;
+ click();
+}
+
+void KeyMapButton::focusOutEvent(QFocusEvent* event)
+{
+ if (isChecked())
+ {
+ // if we lost the focus while mapping, consider it 'done'
+ click();
+ }
+
+ QPushButton::focusOutEvent(event);
+}
+
+void KeyMapButton::onClick()
+{
+ if (isChecked())
+ {
+ setText("[press key]");
+ }
+ else
+ {
+ setText(mappingText());
+ }
+}
+
+QString KeyMapButton::mappingText()
+{
+ int key = *mapping;
+
+ switch (key)
+ {
+ case -1: return "None";
+
+ case Qt::Key_Control: return "Ctrl";
+ case Qt::Key_Alt: return "Alt";
+ case Qt::Key_Shift: return "Shift";
+ case Qt::Key_Meta: return "Meta";
+ }
+
+ QKeySequence seq(key);
+ QString ret = seq.toString();
+ return ret.replace("&", "&&");
+}
diff --git a/src/frontend/qt_sdl/InputConfigDialog.h b/src/frontend/qt_sdl/InputConfigDialog.h
index 2af73db..b2ca3f2 100644
--- a/src/frontend/qt_sdl/InputConfigDialog.h
+++ b/src/frontend/qt_sdl/InputConfigDialog.h
@@ -20,6 +20,7 @@
#define INPUTCONFIGDIALOG_H
#include <QDialog>
+#include <QPushButton>
namespace Ui { class InputConfigDialog; }
class InputConfigDialog;
@@ -57,7 +58,38 @@ private slots:
//
private:
+ void populatePage(QWidget* page, int num, const char** labels, int* keymap, int* joymap);
+
+ QString joyMappingName(int id);
+
Ui::InputConfigDialog* ui;
+
+ int keypadKeyMap[12], keypadJoyMap[12];
+ int addonsKeyMap[2], addonsJoyMap[2];
+ int hkGeneralKeyMap[6], hkGeneralJoyMap[6];
+};
+
+
+class KeyMapButton : public QPushButton
+{
+ Q_OBJECT
+
+public:
+ explicit KeyMapButton(QWidget* parent, int* mapping, bool hotkey);
+ ~KeyMapButton();
+
+protected:
+ void keyPressEvent(QKeyEvent* event) override;
+ void focusOutEvent(QFocusEvent* event) override;
+
+private slots:
+ void onClick();
+
+private:
+ QString mappingText();
+
+ int* mapping;
+ bool isHotkey;
};
#endif // INPUTCONFIGDIALOG_H
diff --git a/src/frontend/qt_sdl/InputConfigDialog.ui b/src/frontend/qt_sdl/InputConfigDialog.ui
index c1422e9..655da16 100644
--- a/src/frontend/qt_sdl/InputConfigDialog.ui
+++ b/src/frontend/qt_sdl/InputConfigDialog.ui
@@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
- <string>TDAH</string>
+ <string>Input and hotkeys - melonDS</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="sizeConstraint">
@@ -20,11 +20,16 @@
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
- <number>1</number>
+ <number>0</number>
</property>
<widget class="QWidget" name="tabInput">
<attribute name="title">
- <string>DS input</string>
+ <string>DS keypad</string>
+ </attribute>
+ </widget>
+ <widget class="QWidget" name="tabAddons">
+ <attribute name="title">
+ <string>Add-ons</string>
</attribute>
</widget>
<widget class="QWidget" name="tabHotkeysGeneral">
diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp
index cd7849d..d664172 100644
--- a/src/frontend/qt_sdl/main.cpp
+++ b/src/frontend/qt_sdl/main.cpp
@@ -862,8 +862,8 @@ void MainWindow::onOpenInputConfig()
connect(dlg, &InputConfigDialog::finished, this, &MainWindow::onInputConfigFinished);
}
-void MainWindow::onInputConfigFinished()
-{printf("FARTO\n");
+void MainWindow::onInputConfigFinished(int res)
+{
emuThread->emuUnpause();
}
diff --git a/src/frontend/qt_sdl/main.h b/src/frontend/qt_sdl/main.h
index 0324ecf..4553875 100644
--- a/src/frontend/qt_sdl/main.h
+++ b/src/frontend/qt_sdl/main.h
@@ -109,7 +109,7 @@ private slots:
void onOpenEmuSettings();
void onOpenInputConfig();
- void onInputConfigFinished();
+ void onInputConfigFinished(int res);
private:
QString loadErrorStr(int error);