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