]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/CustomizedWidgets.cpp
GuiTabular, InsetTabular: fix http://bugzilla.lyx.org/show_bug.cgi?id=5752
[lyx.git] / src / frontends / qt4 / CustomizedWidgets.cpp
index d97c5a586eeba63d58fc5b17335275982573e0eb..4ae2fe6f94daedb9ac13d2a987edda37239049c0 100644 (file)
@@ -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 <donohoe@kde.org>
        Copyright (C) 2001 Ellis Whitehead <ellis@kde.org>
 #include <config.h>
 
 #include "CustomizedWidgets.h"
+#include "FuncRequest.h"
 #include "GuiKeySymbol.h"
 
+#include <QApplication>
+#include <QKeyEvent>
+#include <QMouseEvent>
+#include <QShowEvent>
+
 #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<QKeyEvent *>(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<QKeyEvent *>(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"