]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/CustomizedWidgets.cpp
Replay r36745
[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::Panel);
51         setFrameShadow(QFrame::Raised);
52         setLineWidth(3);
53         setFocusPolicy(Qt::StrongFocus);
54         setAlignment(Qt::AlignCenter);
55 }
56
57
58 void ShortcutWidget::reset()
59 {
60         clear();
61         keysequence_ = KeySequence();
62 }
63
64
65 bool ShortcutWidget::eventFilter(QObject * obj, QEvent * e)
66 {
67         if (!has_cursor_)
68                 return false;
69
70         switch (e->type()) {
71                 // swallow these if we have focus and they come from elsewhere
72                 case QEvent::Shortcut:
73                 case QEvent::ShortcutOverride:
74                         if (obj != this)
75                                 return true;
76                 default: 
77                         break;
78         }
79         return false;
80 }
81
82
83 KeySequence const ShortcutWidget::getKeySequence() const
84 {
85         return keysequence_;
86 }
87
88
89 void ShortcutWidget::setKeySequence(lyx::KeySequence const s)
90 {
91         keysequence_ = s;
92 }
93
94
95 void ShortcutWidget::keyPressEvent(QKeyEvent * e)
96 {
97         int const keyQt = e->key();
98         if (!keyQt)
99                 return;
100
101         switch(keyQt) {
102                 case Qt::Key_AltGr: //or else we get unicode salad
103                 case Qt::Key_Shift:
104                 case Qt::Key_Control:
105                 case Qt::Key_Alt:
106                 case Qt::Key_Meta:
107                         break;
108                 default:
109                         appendToSequence(e);
110                         setText(toqstr(keysequence_.print(KeySequence::ForGui)));
111         }
112 }
113
114
115 bool ShortcutWidget::event(QEvent * e)
116 {
117         switch (e->type()) {
118                 case QEvent::FocusOut:
119                         has_cursor_ = false;
120                         setFrameShadow(QFrame::Raised);
121                         break;
122                 case QEvent::FocusIn:
123                         has_cursor_ = true;
124                         setFrameShadow(QFrame::Sunken);
125                         break;
126                 case QEvent::ShortcutOverride:
127                         keyPressEvent(static_cast<QKeyEvent *>(e));
128                         return true;
129                 case QEvent::KeyRelease:
130                 case QEvent::Shortcut:
131                 case QEvent::KeyPress:
132                         return true;
133                 default: 
134                         break;
135         }
136         return QLabel::event(e);
137 }
138
139
140 void ShortcutWidget::appendToSequence(QKeyEvent * e)
141 {
142         KeySymbol sym;
143         setKeySymbol(&sym, e);
144         
145         if (sym.isOK()) {
146                 KeyModifier mod = lyx::q_key_state(e->modifiers());
147                 keysequence_.addkey(sym, mod, lyx::NoModifier);
148         }
149 }
150
151
152 void ShortcutWidget::removeFromSequence()
153 {
154         keysequence_.removeKey();
155         setText(toqstr(keysequence_.print(KeySequence::ForGui)));
156 }
157
158 } // namespace frontend
159 } // namespace lyx
160
161 #include "moc_CustomizedWidgets.cpp"