00001 // -*- Mode: c++ -*- 00002 // Qt headers 00003 #include <QKeyEvent> 00004 #include <QString> 00005 00006 // MythTV headers 00007 #include "mythlogging.h" 00008 00009 // MythUI headers 00010 #include "mythuitext.h" 00011 #include "mythuibutton.h" 00012 00013 // MythControls headers 00014 #include "keygrabber.h" 00015 00016 KeyGrabPopupBox::KeyGrabPopupBox(MythScreenStack *parent) 00017 : MythScreenType (parent, "keygrabberdialog") 00018 { 00019 m_waitingForKeyRelease = m_keyReleaseSeen = false; 00020 m_okButton = m_cancelButton = NULL; 00021 m_messageText = NULL; 00022 } 00023 00024 KeyGrabPopupBox::~KeyGrabPopupBox() 00025 { 00026 } 00027 00028 bool KeyGrabPopupBox::Create(void) 00029 { 00030 bool foundtheme = false; 00031 00032 // Load the theme for this screen 00033 foundtheme = LoadWindowFromXML("controls-ui.xml", "keygrabpopup", this); 00034 00035 if (!foundtheme) 00036 return false; 00037 00038 m_messageText = dynamic_cast<MythUIText *> (GetChild("message")); 00039 m_okButton = dynamic_cast<MythUIButton *> (GetChild("ok")); 00040 m_cancelButton = dynamic_cast<MythUIButton *> (GetChild("cancel")); 00041 00042 if (!m_messageText || !m_okButton || !m_cancelButton) 00043 { 00044 LOG(VB_GENERAL, LOG_ERR, "Theme is missing critical elements."); 00045 return false; 00046 } 00047 00048 QString label = QString("%1\n\n%2").arg(tr("Press A Key")) 00049 .arg(tr("Waiting for key press")); 00050 00051 m_messageText->SetText(label); 00052 00053 connect(m_okButton, SIGNAL(Clicked()), SLOT(SendResult())); 00054 connect(m_cancelButton, SIGNAL(Clicked()), SLOT(Close())); 00055 00056 m_okButton->SetEnabled(false); 00057 m_cancelButton->SetEnabled(false); 00058 00059 BuildFocusList(); 00060 00061 SetFocusWidget(m_okButton); 00062 00063 return true; 00064 } 00065 00066 bool KeyGrabPopupBox::keyPressEvent(QKeyEvent *event) 00067 { 00068 // If no capturing has occurred yet, then start waiting for key release 00069 m_waitingForKeyRelease |= !m_keyReleaseSeen; 00070 00071 bool handled = false; 00072 00073 if (!m_waitingForKeyRelease) 00074 { 00075 if (GetFocusWidget()->keyPressEvent(event)) 00076 handled = true; 00077 } 00078 else 00079 { 00080 int keycode = event->key(); 00081 00082 // Modifier keypress, ignore until we see the complete combo 00083 if ((keycode == Qt::Key_Shift ) || (keycode == Qt::Key_Control) || 00084 (keycode == Qt::Key_Meta ) || (keycode == Qt::Key_Alt ) || 00085 (keycode == Qt::Key_Super_L ) || (keycode == Qt::Key_Super_R) || 00086 (keycode == Qt::Key_Hyper_L ) || (keycode == Qt::Key_Hyper_R) || 00087 (keycode == Qt::Key_AltGr )) 00088 return true; 00089 00090 m_waitingForKeyRelease = false; 00091 m_keyReleaseSeen = true; 00092 00093 QString key_name = QString(QKeySequence(event->key())); 00094 if (!key_name.isEmpty()) 00095 { 00096 QString modifiers; 00097 00098 /* key modifier strings as defined by the QT docs */ 00099 if (event->modifiers() & Qt::ShiftModifier) 00100 modifiers += "Shift+"; 00101 if (event->modifiers() & Qt::ControlModifier) 00102 modifiers += "Ctrl+"; 00103 if (event->modifiers() & Qt::AltModifier) 00104 modifiers += "Alt+"; 00105 if (event->modifiers() & Qt::MetaModifier) 00106 modifiers += "Meta+"; 00107 00108 key_name = modifiers + key_name; 00109 } 00110 00111 if (key_name.isEmpty()) 00112 { 00113 m_messageText->SetText(tr("Pressed key not recognized")); 00114 } 00115 else 00116 { 00117 m_capturedKey = key_name; 00118 m_messageText->SetText(tr("Add key '%1'?").arg(key_name)); 00119 } 00120 00121 m_okButton->SetEnabled(true); 00122 m_cancelButton->SetEnabled(true); 00123 00124 handled = true; 00125 } 00126 00127 if (!handled && MythScreenType::keyPressEvent(event)) 00128 handled = true; 00129 00130 return handled; 00131 } 00132 00133 void KeyGrabPopupBox::SendResult() 00134 { 00135 emit HaveResult(m_capturedKey); 00136 Close(); 00137 }
1.6.3