From 95114eccc774bbb0fbeade8904aafa4f9b6d143d Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sat, 25 Jul 2015 02:50:52 +0200 Subject: initial impl of arbitrary keybindings Issue: #118 Linux and OSX likely broken for now. --- facetracknoir/keyboard.h | 33 +++++++ facetracknoir/keyboard_listener.ui | 37 +++++++ facetracknoir/options-dialog.cpp | 50 ++++++---- facetracknoir/options-dialog.hpp | 1 + facetracknoir/settings.ui | 193 ++++++------------------------------- 5 files changed, 129 insertions(+), 185 deletions(-) create mode 100644 facetracknoir/keyboard.h create mode 100644 facetracknoir/keyboard_listener.ui (limited to 'facetracknoir') diff --git a/facetracknoir/keyboard.h b/facetracknoir/keyboard.h new file mode 100644 index 00000000..65f5c58e --- /dev/null +++ b/facetracknoir/keyboard.h @@ -0,0 +1,33 @@ +#pragma once +#include "ui_keyboard_listener.h" +#include +#include + +class KeyboardListener : public QLabel +{ + Q_OBJECT + Ui_keyboard_listener ui; +public: + KeyboardListener(QWidget* parent = nullptr) : QLabel(parent) + { + ui.setupUi(this); + setFocusPolicy(Qt::StrongFocus); + } + void keyPressEvent(QKeyEvent* event) override + { + { + switch (event->key() | event->modifiers()) + { + case 83886113: // ctrl + case 50331680: // shift + case 150994979: // alt + case 16777250: // meta + return; + default: break; + } + } + emit key_pressed(QKeySequence(event->key())); + } +signals: + void key_pressed(QKeySequence k); +}; diff --git a/facetracknoir/keyboard_listener.ui b/facetracknoir/keyboard_listener.ui new file mode 100644 index 00000000..69ec530d --- /dev/null +++ b/facetracknoir/keyboard_listener.ui @@ -0,0 +1,37 @@ + + + keyboard_listener + + + Qt::ApplicationModal + + + + 0 + 0 + 224 + 33 + + + + + 0 + 0 + + + + Bind a shortcut + + + <html><head/><body><p>Press a key or close this window to cancel.</p></body></html> + + + Qt::RichText + + + 10 + + + + + diff --git a/facetracknoir/options-dialog.cpp b/facetracknoir/options-dialog.cpp index ca4c6c3e..1d8e636a 100644 --- a/facetracknoir/options-dialog.cpp +++ b/facetracknoir/options-dialog.cpp @@ -7,6 +7,9 @@ */ #include "options-dialog.hpp" +#include "keyboard.h" +#include +#include OptionsDialog::OptionsDialog() { @@ -15,27 +18,6 @@ OptionsDialog::OptionsDialog() connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(doOK())); connect(ui.buttonBox, SIGNAL(rejected()), this, SLOT(doCancel())); - for ( int i = 0; i < global_key_sequences.size(); i++) { - ui.cbxCenterKey->addItem(global_key_sequences.at(i)); - ui.cbxToggleKey->addItem(global_key_sequences.at(i)); - ui.cbxZeroKey->addItem(global_key_sequences.at(i)); - } - - tie_setting(s.center.key_index, ui.cbxCenterKey); - tie_setting(s.center.alt, ui.chkCenterAlt); - tie_setting(s.center.shift, ui.chkCenterShift); - tie_setting(s.center.ctrl, ui.chkCenterCtrl); - - tie_setting(s.toggle.key_index, ui.cbxToggleKey); - tie_setting(s.toggle.alt, ui.chkToggleAlt); - tie_setting(s.toggle.shift, ui.chkToggleShift); - tie_setting(s.toggle.ctrl, ui.chkToggleCtrl); - - tie_setting(s.zero.key_index, ui.cbxZeroKey); - tie_setting(s.zero.alt, ui.chkZeroAlt); - tie_setting(s.zero.shift, ui.chkZeroShift); - tie_setting(s.zero.ctrl, ui.chkZeroCtrl); - tie_setting(s.s_main.tray_enabled, ui.trayp); tie_setting(s.s_main.center_at_startup, ui.center_at_startup); @@ -67,6 +49,32 @@ OptionsDialog::OptionsDialog() tie_setting(s.s_main.camera_yaw, ui.camera_yaw); tie_setting(s.s_main.camera_pitch, ui.camera_pitch); tie_setting(s.s_main.camera_roll, ui.camera_roll); + + connect(ui.bind_center, &QPushButton::pressed, [&]() -> void { bind_key(s.center.keycode, ui.center_text); }); + connect(ui.bind_zero, &QPushButton::pressed, [&]() -> void { bind_key(s.zero.keycode, ui.zero_text); }); + connect(ui.bind_toggle, &QPushButton::pressed, [&]() -> void { bind_key(s.toggle.keycode, ui.toggle_text); }); + + ui.center_text->setText(QKeySequence(s.center.keycode).toString()); + ui.zero_text->setText(QKeySequence(s.zero.keycode).toString()); + ui.toggle_text->setText(QKeySequence(s.toggle.keycode).toString()); +} + +void OptionsDialog::bind_key(value& ret, QLabel* label) +{ + ret = 0; + QDialog d; + auto l = new QHBoxLayout; + l->setMargin(0); + auto k = new KeyboardListener; + l->addWidget(k); + d.setLayout(l); + d.setFixedSize(QSize(500, 500)); + d.setWindowFlags(Qt::Dialog); + connect(k, &KeyboardListener::key_pressed, [&] (QKeySequence s) -> void { ret = static_cast(s).toInt(); d.close(); }); + d.exec(); + label->setText(QKeySequence(ret).toString()); + delete k; + delete l; } void OptionsDialog::doOK() { diff --git a/facetracknoir/options-dialog.hpp b/facetracknoir/options-dialog.hpp index 71a3acda..0ab9849d 100644 --- a/facetracknoir/options-dialog.hpp +++ b/facetracknoir/options-dialog.hpp @@ -18,4 +18,5 @@ private: private slots: void doOK(); void doCancel(); + void bind_key(value& ret, QLabel* label); }; diff --git a/facetracknoir/settings.ui b/facetracknoir/settings.ui index 34b15b47..5eea9e57 100644 --- a/facetracknoir/settings.ui +++ b/facetracknoir/settings.ui @@ -62,82 +62,48 @@ QGroupBox { border: 0; } - - + + - Toggle - - - false + - - - - - 50 - 16777215 - - + + - Shift + Center + + + false - - - - - 50 - 16777215 - - + + - Ctrl + - - - - - 90 - 0 - - - - Select Number - - - QComboBox::InsertAlphabetically + + + + - - + + - Center + Toggle false - - - - - 50 - 16777215 - - - - Alt - - - - + Zero @@ -147,113 +113,24 @@ - - - - - 50 - 16777215 - - - - Alt - - - - - - - - 50 - 16777215 - - - - Ctrl - - - - - - - - 50 - 16777215 - - - - Alt - - - - - - - - 50 - 16777215 - - + + - Ctrl + Bind - - - - - 50 - 16777215 - - + + - Shift + Bind - - - - - 90 - 0 - - - - Select Number - - - QComboBox::InsertAlphabetically - - - - - - - - 50 - 16777215 - - + + - Shift - - - - - - - - 90 - 0 - - - - Select Number - - - QComboBox::InsertAlphabetically + Bind @@ -1152,21 +1029,9 @@ - chkCenterShift tabWidget - chkCenterAlt - cbxCenterKey - chkToggleShift - chkToggleCtrl - chkToggleAlt - cbxToggleKey - chkZeroShift - chkZeroCtrl - chkZeroAlt - cbxZeroKey center_at_startup trayp - chkCenterCtrl camera_yaw camera_pitch camera_roll -- cgit v1.2.3