]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/CustomizedWidgets.cpp
bf5d4a741374c96a544d4a0404b413f29ced8e8a
[lyx.git] / src / frontends / qt4 / CustomizedWidgets.cpp
1 /**
2  * \file GuiPrefs.cpp
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Bo Peng
7  * \author Edwin Leuven
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 /*
13         The code for the ShortcutWidget class was adapted from
14         kkeysequencewidget.cpp, which is part of the KDE libraries.
15         Copyright (C) 1998 Mark Donohoe <donohoe@kde.org>
16         Copyright (C) 2001 Ellis Whitehead <ellis@kde.org>
17         Copyright (C) 2007 Andreas Hartmetz <ahartmetz@gmail.com>
18         Licensed under version 2 of the General Public License and
19         used here in accordance with the terms of that license.
20 */
21
22 #include <config.h>
23
24 #include "CustomizedWidgets.h"
25 #include "FuncRequest.h"
26 #include "GuiKeySymbol.h"
27
28 #include <QApplication>
29 #include <QKeyEvent>
30 #include <QMouseEvent>
31 #include <QShowEvent>
32
33 #include "support/qstring_helpers.h"
34
35
36 using lyx::KeySymbol;
37 using lyx::KeySequence;
38 using lyx::KeyModifier;
39 using lyx::toqstr;
40
41 namespace lyx {
42 namespace frontend {
43
44 ShortcutWidget::ShortcutWidget(QWidget * parent)
45         : QLabel(parent), keysequence_()
46 {
47         QApplication::instance()->installEventFilter(this);
48         has_cursor_ = false;
49         setFrameShape(QFrame::StyledPanel);
50         setFrameShadow(QFrame::Raised);
51         setFocusPolicy(Qt::StrongFocus);
52         setAlignment(Qt::AlignCenter);
53 }
54
55
56 void ShortcutWidget::reset()
57 {
58         clear();
59         keysequence_ = KeySequence();
60 }
61
62
63 bool ShortcutWidget::eventFilter(QObject * obj, QEvent * e)
64 {
65         if (!has_cursor_)
66                 return false;
67
68         switch (e->type()) {
69                 // swallow these if we have focus and they come from elsewhere
70                 case QEvent::Shortcut:
71                 case QEvent::ShortcutOverride:
72                         if (obj != this)
73                                 return true;
74                 default: 
75                         break;
76         }
77         return false;
78 }
79
80
81 KeySequence const ShortcutWidget::getKeySequence() const
82 {
83         return keysequence_;
84 }
85
86
87 void ShortcutWidget::keyPressEvent(QKeyEvent * e)
88 {
89         int const keyQt = e->key();
90         if (!keyQt)
91                 return;
92
93         switch(keyQt) {
94                 case Qt::Key_AltGr: //or else we get unicode salad
95                 case Qt::Key_Shift:
96                 case Qt::Key_Control:
97                 case Qt::Key_Alt:
98                 case Qt::Key_Meta:
99                         break;
100                 default:
101                         appendToSequence(e);
102                         setText(toqstr(keysequence_.print(KeySequence::ForGui)));
103         }
104 }
105
106
107 bool ShortcutWidget::event(QEvent * e)
108 {
109         switch (e->type()) {
110                 case QEvent::FocusOut:
111                         has_cursor_ = false;
112                         setFrameShadow(QFrame::Raised);
113                         break;
114                 case QEvent::FocusIn:
115                         has_cursor_ = true;
116                         setFrameShadow(QFrame::Sunken);
117                         break;
118                 case QEvent::ShortcutOverride:
119                         keyPressEvent(static_cast<QKeyEvent *>(e));
120                         return true;
121                 case QEvent::KeyRelease:
122                 case QEvent::Shortcut:
123                 case QEvent::KeyPress:
124                         return true;
125                 default: 
126                         break;
127         }
128         return QLabel::event(e);
129 }
130
131
132 void ShortcutWidget::appendToSequence(QKeyEvent * e)
133 {
134         KeySymbol sym;
135         setKeySymbol(&sym, e);
136
137         KeyModifier mod = lyx::q_key_state(e->modifiers());
138         
139         keysequence_.addkey(sym, mod, lyx::NoModifier);
140 }
141
142 } // namespace frontend
143 } // namespace lyx
144
145 #include "CustomizedWidgets_moc.cpp"