diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0790f1a..fe63ea2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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) diff --git a/src/keydialog.cpp b/src/keydialog.cpp new file mode 100644 index 0000000..f40fe18 --- /dev/null +++ b/src/keydialog.cpp @@ -0,0 +1,74 @@ +#include "keydialog.hpp" + +#include +#include + +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 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(); +} diff --git a/src/keydialog.hpp b/src/keydialog.hpp new file mode 100644 index 0000000..9637b04 --- /dev/null +++ b/src/keydialog.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include +#include +#include + +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 ); + +};