]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/CustomizedWidgets.cpp
Make the InsetInfo dialog a bit less esoteric.
[lyx.git] / src / frontends / qt4 / CustomizedWidgets.cpp
1 /**
2  * \file CustomizedWidgets.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         has_cursor_ = false;
49         setFrameShape(QFrame::Panel);
50         setFrameShadow(QFrame::Raised);
51         setLineWidth(3);
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 KeySequence const ShortcutWidget::getKeySequence() const
65 {
66         return keysequence_;
67 }
68
69
70 void ShortcutWidget::setKeySequence(lyx::KeySequence const & s)
71 {
72         keysequence_ = s;
73 }
74
75
76 void ShortcutWidget::keyPressEvent(QKeyEvent * e)
77 {
78         int const keyQt = e->key();
79         if (!keyQt)
80                 return;
81
82         switch(keyQt) {
83                 case Qt::Key_AltGr: //or else we get unicode salad
84                 case Qt::Key_Shift:
85                 case Qt::Key_Control:
86                 case Qt::Key_Alt:
87                 case Qt::Key_Meta:
88                         break;
89                 default:
90                         appendToSequence(e);
91                         setText(toqstr(keysequence_.print(KeySequence::ForGui)));
92         }
93 }
94
95
96 bool ShortcutWidget::event(QEvent * e)
97 {
98         switch (e->type()) {
99                 case QEvent::FocusOut:
100                         has_cursor_ = false;
101                         setFrameShadow(QFrame::Raised);
102                         break;
103                 case QEvent::FocusIn:
104                         has_cursor_ = true;
105                         setFrameShadow(QFrame::Sunken);
106                         break;
107                 case QEvent::ShortcutOverride:
108                         // accepting the ShortcutOverride event lets us override shortcuts
109                         // and capture them as keypress events instead
110                         e->accept();
111                         return true;
112                 case QEvent::KeyPress:
113                         keyPressEvent(static_cast<QKeyEvent *>(e));
114                         return true;
115                 case QEvent::KeyRelease:
116                 case QEvent::Shortcut:
117                         return true;
118                 default:
119                         break;
120         }
121         return QLabel::event(e);
122 }
123
124
125 void ShortcutWidget::appendToSequence(QKeyEvent * e)
126 {
127         KeySymbol sym;
128         setKeySymbol(&sym, e);
129
130         if (sym.isOK()) {
131                 KeyModifier mod = lyx::q_key_state(e->modifiers());
132                 keysequence_.addkey(sym, mod, lyx::NoModifier);
133         }
134 }
135
136
137 void ShortcutWidget::removeFromSequence()
138 {
139         keysequence_.removeKey();
140         setText(toqstr(keysequence_.print(KeySequence::ForGui)));
141 }
142
143 } // namespace frontend
144 } // namespace lyx
145
146 #include "moc_CustomizedWidgets.cpp"