1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7
8 #include <QDebug>
9 #include <QEvent>
10 #include <QToolTip>
11 #include <QKeyEvent>
12
13 #include "shortcutwidget.h"
14
15
ShortcutWidget(QWidget * parent)16 ShortcutWidget::ShortcutWidget(QWidget *parent)
17 : QWidget(parent)
18 {
19 setupUi(this);
20
21 Part0 = "";
22 Part1 = "";
23 Part2 = "";
24 Part3 = "";
25 keyCode = 0;
26 setKeyButton->setCheckable(true);
27 requiredModifiers=0;
28 allowedModifiers=0;
29
30 languageChange();
31
32 connect(noKey, SIGNAL(clicked()), this, SLOT(setNoKey()));
33 connect(setKeyButton, SIGNAL(clicked()), this, SLOT(setKeyText()));
34 }
35
setAllowedModifiers(int allowed,int required)36 void ShortcutWidget::setAllowedModifiers(int allowed, int required)
37 {
38 allowedModifiers=allowed;
39 requiredModifiers=required;
40 }
41
changeEvent(QEvent * e)42 void ShortcutWidget::changeEvent(QEvent *e)
43 {
44 if (e->type() == QEvent::LanguageChange)
45 {
46 languageChange();
47 }
48 else
49 QWidget::changeEvent(e);
50 }
51
languageChange()52 void ShortcutWidget::languageChange()
53 {
54 noKey->setToolTip( tr("No shortcut for the style")); // set no shortcut for this style
55 userDef->setToolTip( tr("Style has user defined shortcut")); // not sure what this thing does
56 setKeyButton->setToolTip( tr("Assign a shortcut for the style")); // activate shorcut assigning
57 }
58
event(QEvent * ev)59 bool ShortcutWidget::event( QEvent* ev )
60 {
61 bool ret = QWidget::event( ev );
62 if ( ev->type() == QEvent::KeyPress )
63 keyPressEvent((QKeyEvent*)ev);
64 if ( ev->type() == QEvent::KeyRelease )
65 keyReleaseEvent((QKeyEvent*)ev);
66 return ret;
67 }
68
keyPressEvent(QKeyEvent * k)69 void ShortcutWidget::keyPressEvent(QKeyEvent *k)
70 {
71 if (setKeyButton->isChecked())
72 {
73 QStringList tl;
74 if (!keyDisplay->text().isEmpty())
75 {
76 tl = keyDisplay->text().split("+", Qt::SkipEmptyParts);
77 Part4 = tl.last();
78 if (Part4 == tr("Alt") || Part4 == tr("Ctrl") || Part4 == tr("Shift") || Part4 == tr("Meta"))
79 Part4 = "";
80 }
81 else
82 Part4 = "";
83 switch (k->key())
84 {
85 case Qt::Key_Meta:
86 if ((allowedModifiers&Qt::META)==Qt::META)
87 {
88 Part0 = tr("Meta+");
89 keyCode |= Qt::META;
90 }
91 break;
92 case Qt::Key_Shift:
93 if ((allowedModifiers&Qt::SHIFT)==Qt::SHIFT)
94 {
95 Part3 = tr("Shift+");
96 keyCode |= Qt::SHIFT;
97 }
98 break;
99 case Qt::Key_Alt:
100 if ((allowedModifiers&Qt::ALT)==Qt::ALT)
101 {
102 Part2 = tr("Alt+");
103 keyCode |= Qt::ALT;
104 }
105 break;
106 case Qt::Key_Control:
107 if ((allowedModifiers&Qt::CTRL)==Qt::CTRL)
108 {
109 Part1 = tr("Ctrl+");
110 keyCode |= Qt::CTRL;
111 }
112 break;
113 default:
114 keyCode |= k->key();
115 keyDisplay->setText(getKeyText(keyCode));
116 setKeyButton->setChecked(false);
117 userDef->setChecked(true);
118 releaseKeyboard();
119 emit newKey(keyDisplay->text());
120 }
121 }
122 if (setKeyButton->isChecked())
123 {
124 keyDisplay->setText(Part0+Part1+Part2+Part3+Part4);
125 }
126 }
127
keyReleaseEvent(QKeyEvent * k)128 void ShortcutWidget::keyReleaseEvent(QKeyEvent *k)
129 {
130 if (setKeyButton->isChecked())
131 {
132 if (!keyDisplay->text().isEmpty())
133 {
134 QStringList tl;
135 tl = keyDisplay->text().split("+", Qt::SkipEmptyParts);
136 Part4 = tl.last();
137 if (Part4 == tr("Alt") || Part4 == tr("Ctrl") || Part4 == tr("Shift") || Part4 == tr("Meta"))
138 Part4 = "";
139 }
140 else
141 Part4 = "";
142 if (k->key() == Qt::Key_Meta)
143 {
144 Part0 = "";
145 keyCode &= ~Qt::META;
146 }
147 if (k->key() == Qt::Key_Shift)
148 {
149 Part3 = "";
150 keyCode &= ~Qt::SHIFT;
151 }
152 if (k->key() == Qt::Key_Alt)
153 {
154 Part2 = "";
155 keyCode &= ~Qt::ALT;
156 }
157 if (k->key() == Qt::Key_Control)
158 {
159 Part1 = "";
160 keyCode &= ~Qt::CTRL;
161 }
162 keyDisplay->setText(Part0+Part1+Part2+Part3+Part4);
163 }
164 }
165
getKeyText(int KeyC)166 QString ShortcutWidget::getKeyText(int KeyC)
167 {
168 if ((KeyC & ~(Qt::META | Qt::CTRL | Qt::ALT | Qt::SHIFT)) == 0)
169 return "";
170 // on OSX Qt translates modifiers to forsaken symbols, arrows and the like
171 // we prefer plain English
172 QString res;
173 if ((KeyC & Qt::META) != 0)
174 res += "Meta+";
175 if ((KeyC & Qt::CTRL) != 0)
176 res += "Ctrl+";
177 if ((KeyC & Qt::ALT) != 0)
178 res += "Alt+";
179 if ((KeyC & Qt::SHIFT) != 0)
180 res += "Shift+";
181 return res + QString(QKeySequence(KeyC & ~(Qt::META | Qt::CTRL | Qt::ALT | Qt::SHIFT)).toString());
182 }
183
setKeyText()184 void ShortcutWidget::setKeyText()
185 {
186 if (setKeyButton->isChecked())
187 {
188 keyCode = 0;
189 Part0 = "";
190 Part1 = "";
191 Part2 = "";
192 Part3 = "";
193 Part4 = "";
194 grabKeyboard();
195 }
196 else
197 releaseKeyboard();
198 }
199
setShortcut(const QString & shortcut)200 void ShortcutWidget::setShortcut(const QString &shortcut)
201 {
202 disconnect(noKey, SIGNAL(clicked()), this, SLOT(setNoKey()));
203 disconnect(setKeyButton, SIGNAL(clicked()), this, SLOT(setKeyText()));
204
205 setKeyButton->setChecked(false);
206 if (shortcut.length() > 0)
207 {
208 userDef->setChecked(true);
209 keyDisplay->setText(shortcut);
210 }
211 else
212 {
213 noKey->setChecked(true);
214 keyDisplay->setText("");
215 }
216
217 connect(noKey, SIGNAL(clicked()), this, SLOT(setNoKey()));
218 connect(setKeyButton, SIGNAL(clicked()), this, SLOT(setKeyText()));
219 }
220
setNoKey()221 void ShortcutWidget::setNoKey()
222 {
223 if (noKey->isChecked())
224 {
225 keyDisplay->setText("");
226 emit newKey(QString());
227 }
228 }
229
~ShortcutWidget()230 ShortcutWidget::~ShortcutWidget()
231 {
232
233 }
234