X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FCustomizedWidgets.cpp;h=4ae2fe6f94daedb9ac13d2a987edda37239049c0;hb=e029b216b7e56ce3a41ef0b853045c37c7d155d8;hp=d97c5a586eeba63d58fc5b17335275982573e0eb;hpb=e52c1ed1f90126b8ff3c5d2d6e95cb446b8e3e3f;p=lyx.git diff --git a/src/frontends/qt4/CustomizedWidgets.cpp b/src/frontends/qt4/CustomizedWidgets.cpp index d97c5a586e..4ae2fe6f94 100644 --- a/src/frontends/qt4/CustomizedWidgets.cpp +++ b/src/frontends/qt4/CustomizedWidgets.cpp @@ -5,12 +5,13 @@ * * \author Bo Peng * \author Edwin Leuven + * \author Jürgen Spitzmüller * * Full author contact details are available in file CREDITS. */ /* - The code for the ShortcutLineEdit class was adapted from + The code for the ShortcutWidget class was adapted from kkeysequencewidget.cpp, which is part of the KDE libraries. Copyright (C) 1998 Mark Donohoe Copyright (C) 2001 Ellis Whitehead @@ -22,18 +23,82 @@ #include #include "CustomizedWidgets.h" +#include "FuncRequest.h" #include "GuiKeySymbol.h" +#include +#include +#include +#include + #include "support/qstring_helpers.h" using lyx::KeySymbol; +using lyx::KeySequence; +using lyx::KeyModifier; using lyx::toqstr; -void ShortcutLineEdit::keyPressEvent(QKeyEvent * e) +namespace lyx { +namespace frontend { + +ShortcutWidget::ShortcutWidget(QWidget * parent) + : QLabel(parent), keysequence_() +{ + QApplication::instance()->installEventFilter(this); + has_cursor_ = false; + setFrameShape(QFrame::Panel); + setFrameShadow(QFrame::Raised); + setLineWidth(3); + setFocusPolicy(Qt::StrongFocus); + setAlignment(Qt::AlignCenter); +} + + +void ShortcutWidget::reset() +{ + clear(); + keysequence_ = KeySequence(); +} + + +bool ShortcutWidget::eventFilter(QObject * obj, QEvent * e) +{ + if (!has_cursor_) + return false; + + switch (e->type()) { + // swallow these if we have focus and they come from elsewhere + case QEvent::Shortcut: + case QEvent::ShortcutOverride: + if (obj != this) + return true; + default: + break; + } + return false; +} + + +KeySequence const ShortcutWidget::getKeySequence() const { - int keyQt = e->key(); - switch(e->key()) { + return keysequence_; +} + + +void ShortcutWidget::setKeySequence(lyx::KeySequence const s) +{ + keysequence_ = s; +} + + +void ShortcutWidget::keyPressEvent(QKeyEvent * e) +{ + int const keyQt = e->key(); + if (!keyQt) + return; + + switch(keyQt) { case Qt::Key_AltGr: //or else we get unicode salad case Qt::Key_Shift: case Qt::Key_Control: @@ -41,63 +106,55 @@ void ShortcutLineEdit::keyPressEvent(QKeyEvent * e) case Qt::Key_Meta: break; default: - if (keyQt) { - uint modifierKeys = e->modifiers(); - - QString txt; - if (modifierKeys & Qt::SHIFT) - txt += "S-"; - if (modifierKeys & Qt::CTRL) - txt += "C-"; - if (modifierKeys & Qt::ALT) - txt += "M-"; - - KeySymbol sym; - setKeySymbol(&sym, e); - txt += toqstr(sym.getSymbolName()); - - if (text().isEmpty()) - setText(txt); - else - setText(text() + " " + txt); - } + appendToSequence(e); + setText(toqstr(keysequence_.print(KeySequence::ForGui))); } } -//prevent Qt from special casing Tab and Backtab -bool ShortcutLineEdit::event(QEvent* e) +bool ShortcutWidget::event(QEvent * e) { - if (e->type() == QEvent::ShortcutOverride) - return false; - - if (e->type() == QEvent::KeyPress) { - keyPressEvent(static_cast(e)); - return true; + switch (e->type()) { + case QEvent::FocusOut: + has_cursor_ = false; + setFrameShadow(QFrame::Raised); + break; + case QEvent::FocusIn: + has_cursor_ = true; + setFrameShadow(QFrame::Sunken); + break; + case QEvent::ShortcutOverride: + keyPressEvent(static_cast(e)); + return true; + case QEvent::KeyRelease: + case QEvent::Shortcut: + case QEvent::KeyPress: + return true; + default: + break; } - - return QLineEdit::event(e); + return QLabel::event(e); } -QString const SearchLineEdit::hintMessage() +void ShortcutWidget::appendToSequence(QKeyEvent * e) { - return toqstr("Search ..."); -} + KeySymbol sym; + setKeySymbol(&sym, e); - -void SearchLineEdit::focusInEvent(QFocusEvent * e) -{ - if (text() == hintMessage()) - clear(); + KeyModifier mod = lyx::q_key_state(e->modifiers()); + + keysequence_.addkey(sym, mod, lyx::NoModifier); } -void SearchLineEdit::focusOutEvent(QFocusEvent * e) +void ShortcutWidget::removeFromSequence() { - if (text().isEmpty()) - setText(hintMessage()); + keysequence_.removeKey(); + setText(toqstr(keysequence_.print(KeySequence::ForGui))); } +} // namespace frontend +} // namespace lyx -#include "CustomizedWidgets_moc.cpp" +#include "moc_CustomizedWidgets.cpp"