MythTV
master
mythtv
programs
mythfrontend
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
7
#include "
libmythbase/mythlogging.h
"
8
#include "
libmythui/mythuibutton.h
"
9
#include "
libmythui/mythuitext.h
"
10
11
// MythControls headers
12
#include "
keygrabber.h
"
13
14
bool
KeyGrabPopupBox::Create
(
void
)
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
25
if
(!
m_messageText
|| !
m_okButton
|| !
m_cancelButton
)
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
36
connect(
m_okButton
, &
MythUIButton::Clicked
,
this
, &
KeyGrabPopupBox::SendResult
);
37
connect(
m_cancelButton
, &
MythUIButton::Clicked
,
this
, &
MythScreenType::Close
);
38
39
m_okButton
->
SetEnabled
(
false
);
40
m_cancelButton
->
SetEnabled
(
false
);
41
42
BuildFocusList
();
43
44
SetFocusWidget
(
m_okButton
);
45
46
return
true
;
47
}
48
49
bool
KeyGrabPopupBox::keyPressEvent
(QKeyEvent *event)
50
{
51
// If no capturing has occurred yet, then start waiting for key release
52
m_waitingForKeyRelease
|= !
m_keyReleaseSeen
;
53
54
bool
handled =
false
;
55
56
if
(!
m_waitingForKeyRelease
)
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
73
m_waitingForKeyRelease
=
false
;
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
);
108
m_cancelButton
->
SetEnabled
(
true
);
109
110
handled =
true
;
111
}
112
113
if
(!handled &&
MythScreenType::keyPressEvent
(event))
114
handled =
true
;
115
116
return
handled;
117
}
118
119
void
KeyGrabPopupBox::SendResult
()
120
{
121
emit
HaveResult
(
m_capturedKey
);
122
Close
();
123
}
MythUIButton::Clicked
void Clicked()
KeyGrabPopupBox::SendResult
void SendResult()
Definition:
keygrabber.cpp:119
KeyGrabPopupBox::keyPressEvent
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
Definition:
keygrabber.cpp:49
mythuitext.h
MythScreenType::Close
virtual void Close()
Definition:
mythscreentype.cpp:383
MythUIType::GetChild
MythUIType * GetChild(const QString &name) const
Get a named child of this UIType.
Definition:
mythuitype.cpp:138
KeyGrabPopupBox::m_okButton
MythUIButton * m_okButton
Definition:
keygrabber.h:39
KeyGrabPopupBox::m_keyReleaseSeen
bool m_keyReleaseSeen
Definition:
keygrabber.h:35
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition:
mythlogging.h:39
KeyGrabPopupBox::m_messageText
MythUIText * m_messageText
Definition:
keygrabber.h:38
MythScreenType::GetFocusWidget
MythUIType * GetFocusWidget(void) const
Definition:
mythscreentype.cpp:110
KeyGrabPopupBox::m_cancelButton
MythUIButton * m_cancelButton
Definition:
keygrabber.h:40
mythlogging.h
MythScreenType::SetFocusWidget
bool SetFocusWidget(MythUIType *widget=nullptr)
Definition:
mythscreentype.cpp:115
MythScreenType::BuildFocusList
void BuildFocusList(void)
Definition:
mythscreentype.cpp:203
KeyGrabPopupBox::m_waitingForKeyRelease
bool m_waitingForKeyRelease
Definition:
keygrabber.h:34
MythUIButton
A single button widget.
Definition:
mythuibutton.h:21
KeyGrabPopupBox::HaveResult
void HaveResult(QString)
MythUIType::SetEnabled
void SetEnabled(bool enable)
Definition:
mythuitype.cpp:1128
KeyGrabPopupBox::Create
bool Create(void) override
Definition:
keygrabber.cpp:14
MythUIText
All purpose text widget, displays a text string.
Definition:
mythuitext.h:28
MythScreenType::keyPressEvent
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
Definition:
mythscreentype.cpp:401
XMLParseBase::LoadWindowFromXML
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
Definition:
xmlparsebase.cpp:687
MythUIText::SetText
virtual void SetText(const QString &text)
Definition:
mythuitext.cpp:115
mythuibutton.h
KeyGrabPopupBox::m_capturedKey
QString m_capturedKey
Definition:
keygrabber.h:36
keygrabber.h
Generated on Mon Nov 25 2024 03:16:18 for MythTV by
1.8.17