Add KeyDialog class

This will take care of reading user input.
TODO: Correct mouse buttons values, they do not match Xtest values.
This commit is contained in:
Maciej Latocha
2016-03-31 17:32:53 +02:00
parent 0e9145f7a8
commit e633b10379
3 changed files with 103 additions and 0 deletions

View File

@ -17,6 +17,7 @@ set(qjoypad_SOURCES
joypadw.cpp
joyslider.cpp
keycode.cpp
keydialog.cpp
layout.cpp
layout_edit.cpp
main.cpp
@ -36,6 +37,7 @@ set(qjoypad_QOBJECT_HEADERS
joypadw.h
joyslider.h
keycode.h
keydialog.hpp
layout_edit.h
layout.h
quickset.h)

74
src/keydialog.cpp Normal file
View File

@ -0,0 +1,74 @@
#include "keydialog.hpp"
#include <QGuiApplication>
#include <QPointer>
KeyDialog::KeyDialog( const QString& button, bool m, QWidget* parent ) :
QDialog( parent ),
m_acceptMouse( m ),
m_text( this ),
m_isMouse( false ),
m_value( 0 )
{
setWindowTitle( "Choose a key" );
m_text.setText( QString( "Choose a new key %1for %2\n(Ctrl-X for no key)" ).
arg( m ? "or mouse button " : "" ).arg( button ) );
m_text.adjustSize();
setFixedSize( m_text.width() + 20, m_text.height() + 20 );
m_text.move( 10, 10 );
}
int KeyDialog::getKey( const QString& button, bool acceptMouse, bool* mouseOut, QWidget* parent ) {
bool isMouse = false;
quint32 value = 0;
QPointer<KeyDialog> dialog = new KeyDialog( button, acceptMouse, parent );
if ( dialog->exec() != QDialog::Accepted ) {
delete dialog;
return -1;
}
if ( !dialog ) {
return -1;
}
isMouse = dialog->m_isMouse;
value = dialog->m_value;
delete dialog;
if ( mouseOut ) {
*mouseOut = isMouse;
}
return value;
}
void KeyDialog::keyReleaseEvent( QKeyEvent* event ) {
if ( event->key() != Qt::Key_Control ) {
return;
}
m_value = event->nativeScanCode();
m_isMouse = false;
accept();
}
void KeyDialog::keyPressEvent( QKeyEvent* event ) {
if ( event->key() == Qt::Key_Control ) {
return;
}
if ( event->key() == Qt::Key_X && QGuiApplication::keyboardModifiers() == Qt::ControlModifier ) {
m_value = 0;
} else {
m_value = event->nativeScanCode();
}
m_isMouse = false;
accept();
}
void KeyDialog::mouseReleaseEvent( QMouseEvent* event ) {
if ( !m_acceptMouse ) {
return;
}
// TODO: correct Qt::MouseButton to XTst equivalent
m_value = event->button();
m_isMouse = true;
accept();
}

27
src/keydialog.hpp Normal file
View File

@ -0,0 +1,27 @@
#pragma once
#include <QDialog>
#include <QString>
#include <QLabel>
#include <QKeyEvent>
#include <QMouseEvent>
class KeyDialog : public QDialog {
Q_OBJECT
protected:
bool m_acceptMouse;
QLabel m_text;
bool m_isMouse;
quint32 m_value;
KeyDialog( const QString& button, bool m = false, QWidget* parent = 0 );
void keyPressEvent( QKeyEvent* );
void keyReleaseEvent( QKeyEvent* );
void mouseReleaseEvent( QMouseEvent* );
public:
static int getKey( const QString& button, bool acceptMouse = false, bool* mousePressed = 0, QWidget* parent = 0 );
};