input dialog progress.

This commit is contained in:
Arisotura 2020-05-19 12:06:25 +02:00
parent 19566178ba
commit 7026bb15f6
5 changed files with 286 additions and 8 deletions

View File

@ -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("&", "&&");
}

View File

@ -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

View File

@ -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">

View File

@ -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();
}

View File

@ -109,7 +109,7 @@ private slots:
void onOpenEmuSettings();
void onOpenInputConfig();
void onInputConfigFinished();
void onInputConfigFinished(int res);
private:
QString loadErrorStr(int error);