MythTV master
keygrabber.cpp
Go to the documentation of this file.
1// -*- Mode: c++ -*-
2// Qt headers
3#include <QKeyEvent>
4#include <QString>
5
6// MythTV headers
10
11// MythControls headers
12#include "keygrabber.h"
13
15{
16 // Load the theme for this screen
17 bool foundtheme = LoadWindowFromXML("controls-ui.xml", "keygrabpopup", this);
18 if (!foundtheme)
19 return false;
20
21 m_messageText = dynamic_cast<MythUIText *> (GetChild("message"));
22 m_okButton = dynamic_cast<MythUIButton *> (GetChild("ok"));
23 m_cancelButton = dynamic_cast<MythUIButton *> (GetChild("cancel"));
24
26 {
27 LOG(VB_GENERAL, LOG_ERR, "Theme is missing critical elements.");
28 return false;
29 }
30
31 QString label = QString("%1\n\n%2").arg(tr("Press A Key"),
32 tr("Waiting for key press"));
33
34 m_messageText->SetText(label);
35
38
39 m_okButton->SetEnabled(false);
41
43
45
46 return true;
47}
48
49bool KeyGrabPopupBox::keyPressEvent(QKeyEvent *event)
50{
51 // If no capturing has occurred yet, then start waiting for key release
53
54 bool handled = false;
55
57 {
58 if (GetFocusWidget()->keyPressEvent(event))
59 handled = true;
60 }
61 else
62 {
63 int keycode = event->key();
64
65 // Modifier keypress, ignore until we see the complete combo
66 if ((keycode == Qt::Key_Shift ) || (keycode == Qt::Key_Control) ||
67 (keycode == Qt::Key_Meta ) || (keycode == Qt::Key_Alt ) ||
68 (keycode == Qt::Key_Super_L ) || (keycode == Qt::Key_Super_R) ||
69 (keycode == Qt::Key_Hyper_L ) || (keycode == Qt::Key_Hyper_R) ||
70 (keycode == Qt::Key_AltGr ))
71 return true;
72
74 m_keyReleaseSeen = true;
75
76 QString key_name = QKeySequence(keycode).toString();
77 if (!key_name.isEmpty())
78 {
79 QString modifiers;
80
81 /* key modifier strings as defined by the QT docs */
82 if (((event->modifiers() & Qt::ShiftModifier) != 0U)
83 && keycode > 0x7f
84 && keycode != Qt::Key_Backtab)
85 modifiers += "Shift+";
86 if ((event->modifiers() & Qt::ControlModifier) != 0U)
87 modifiers += "Ctrl+";
88 if ((event->modifiers() & Qt::AltModifier) != 0U)
89 modifiers += "Alt+";
90 if ((event->modifiers() & Qt::MetaModifier) != 0U)
91 modifiers += "Meta+";
92
93 key_name = modifiers + key_name;
94 }
95
96 if (key_name.isEmpty())
97 {
98 m_messageText->SetText(tr("Pressed key not recognized"));
99 LOG(VB_GENERAL, LOG_ERR, QString("Pressed key not recognized: '%1' (keycode %2)").arg(event->text()).arg(event->nativeScanCode()) );
100 }
101 else
102 {
103 m_capturedKey = key_name;
104 m_messageText->SetText(tr("Add key '%1'?").arg(key_name));
105 }
106
107 m_okButton->SetEnabled(true);
109
110 handled = true;
111 }
112
113 if (!handled && MythScreenType::keyPressEvent(event))
114 handled = true;
115
116 return handled;
117}
118
120{
122 Close();
123}
QString m_capturedKey
Definition: keygrabber.h:36
MythUIButton * m_cancelButton
Definition: keygrabber.h:40
bool m_keyReleaseSeen
Definition: keygrabber.h:35
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
Definition: keygrabber.cpp:49
bool m_waitingForKeyRelease
Definition: keygrabber.h:34
void HaveResult(QString)
MythUIText * m_messageText
Definition: keygrabber.h:38
bool Create(void) override
Definition: keygrabber.cpp:14
MythUIButton * m_okButton
Definition: keygrabber.h:39
void BuildFocusList(void)
MythUIType * GetFocusWidget(void) const
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
bool SetFocusWidget(MythUIType *widget=nullptr)
virtual void Close()
A single button widget.
Definition: mythuibutton.h:22
void Clicked()
All purpose text widget, displays a text string.
Definition: mythuitext.h:29
virtual void SetText(const QString &text)
Definition: mythuitext.cpp:115
void SetEnabled(bool enable)
MythUIType * GetChild(const QString &name) const
Get a named child of this UIType.
Definition: mythuitype.cpp:138
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39