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