1 /* antimicro Gamepad to KB+M event mapper
2 * Copyright (C) 2015 Travis Nickles <nickles.travis@gmail.com>
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18 #include <QHashIterator>
19
20 #include "mousecontrolsticksettingsdialog.h"
21 #include "ui_mousesettingsdialog.h"
22
23 #include <QSpinBox>
24 #include <QComboBox>
25
26 #include <inputdevice.h>
27 #include <setjoystick.h>
28
MouseControlStickSettingsDialog(JoyControlStick * stick,QWidget * parent)29 MouseControlStickSettingsDialog::MouseControlStickSettingsDialog(JoyControlStick *stick, QWidget *parent) :
30 MouseSettingsDialog(parent),
31 helper(stick)
32 {
33 setAttribute(Qt::WA_DeleteOnClose);
34
35 this->stick = stick;
36 helper.moveToThread(stick->thread());
37
38 calculateMouseSpeedPreset();
39 selectCurrentMouseModePreset();
40 calculateSpringPreset();
41
42 if (stick->getButtonsPresetSensitivity() > 0.0)
43 {
44 ui->sensitivityDoubleSpinBox->setValue(stick->getButtonsPresetSensitivity());
45 }
46 updateAccelerationCurvePresetComboBox();
47
48 updateWindowTitleStickName();
49
50 if (ui->mouseModeComboBox->currentIndex() == 2)
51 {
52 springPreviewWidget = new SpringModeRegionPreview(ui->springWidthSpinBox->value(),
53 ui->springHeightSpinBox->value());
54 }
55 else
56 {
57 springPreviewWidget = new SpringModeRegionPreview(0, 0);
58 }
59
60 calculateWheelSpeedPreset();
61
62 if (stick->isRelativeSpring())
63 {
64 ui->relativeSpringCheckBox->setChecked(true);
65 }
66
67 double easingDuration = stick->getButtonsEasingDuration();
68 ui->easingDoubleSpinBox->setValue(easingDuration);
69
70 calculateExtraAccelrationStatus();
71 calculateExtraAccelerationMultiplier();
72 calculateStartAccelerationMultiplier();
73 calculateMinAccelerationThreshold();
74 calculateMaxAccelerationThreshold();
75 calculateAccelExtraDuration();
76 calculateReleaseSpringRadius();
77 calculateExtraAccelerationCurve();
78
79 changeSpringSectionStatus(ui->mouseModeComboBox->currentIndex());
80 changeSettingsWidgetStatus(ui->accelerationComboBox->currentIndex());
81
82 connect(this, SIGNAL(finished(int)), springPreviewWidget, SLOT(deleteLater()));
83
84 connect(ui->mouseModeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(changeMouseMode(int)));
85 connect(ui->accelerationComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(changeMouseCurve(int)));
86
87 connect(ui->horizontalSpinBox, SIGNAL(valueChanged(int)), this, SLOT(updateConfigHorizontalSpeed(int)));
88 connect(ui->verticalSpinBox, SIGNAL(valueChanged(int)), this, SLOT(updateConfigVerticalSpeed(int)));
89
90 connect(ui->springWidthSpinBox, SIGNAL(valueChanged(int)), this, SLOT(updateSpringWidth(int)));
91 connect(ui->springWidthSpinBox, SIGNAL(valueChanged(int)), springPreviewWidget, SLOT(setSpringWidth(int)));
92
93 connect(ui->springHeightSpinBox, SIGNAL(valueChanged(int)), this, SLOT(updateSpringHeight(int)));
94 connect(ui->springHeightSpinBox, SIGNAL(valueChanged(int)), springPreviewWidget, SLOT(setSpringHeight(int)));
95
96 connect(ui->relativeSpringCheckBox, SIGNAL(clicked(bool)), this, SLOT(updateSpringRelativeStatus(bool)));
97
98 connect(ui->sensitivityDoubleSpinBox, SIGNAL(valueChanged(double)), this, SLOT(updateSensitivity(double)));
99
100 connect(ui->wheelHoriSpeedSpinBox, SIGNAL(valueChanged(int)), this, SLOT(updateWheelSpeedHorizontalSpeed(int)));
101 connect(ui->wheelVertSpeedSpinBox, SIGNAL(valueChanged(int)), this, SLOT(updateWheelSpeedVerticalSpeed(int)));
102
103 connect(ui->easingDoubleSpinBox, SIGNAL(valueChanged(double)), stick, SLOT(setButtonsEasingDuration(double)));
104
105 connect(ui->extraAccelerationGroupBox, SIGNAL(clicked(bool)), &helper, SLOT(updateExtraAccelerationStatus(bool)));
106 connect(ui->extraAccelDoubleSpinBox, SIGNAL(valueChanged(double)), &helper, SLOT(updateExtraAccelerationMultiplier(double)));
107 connect(ui->minMultiDoubleSpinBox, SIGNAL(valueChanged(double)), &helper, SLOT(updateStartMultiPercentage(double)));
108 connect(ui->minThresholdDoubleSpinBox, SIGNAL(valueChanged(double)), &helper, SLOT(updateMinAccelThreshold(double)));
109 connect(ui->maxThresholdDoubleSpinBox, SIGNAL(valueChanged(double)), &helper, SLOT(updateMaxAccelThreshold(double)));
110 connect(ui->accelExtraDurationDoubleSpinBox, SIGNAL(valueChanged(double)), &helper, SLOT(updateAccelExtraDuration(double)));
111 connect(ui->releaseSpringRadiusspinBox, SIGNAL(valueChanged(int)), &helper, SLOT(updateReleaseSpringRadius(int)));
112
113 connect(ui->extraAccelCurveComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(updateExtraAccelerationCurve(int)));
114 }
115
changeMouseMode(int index)116 void MouseControlStickSettingsDialog::changeMouseMode(int index)
117 {
118 if (index == 1)
119 {
120 stick->setButtonsMouseMode(JoyButton::MouseCursor);
121 if (springPreviewWidget->isVisible())
122 {
123 springPreviewWidget->hide();
124 }
125 }
126 else if (index == 2)
127 {
128 stick->setButtonsMouseMode(JoyButton::MouseSpring);
129 if (!springPreviewWidget->isVisible())
130 {
131 springPreviewWidget->setSpringWidth(ui->springWidthSpinBox->value());
132 springPreviewWidget->setSpringHeight(ui->springHeightSpinBox->value());
133 }
134 stick->setButtonsExtraAccelerationStatus(false);
135 }
136 }
137
changeMouseCurve(int index)138 void MouseControlStickSettingsDialog::changeMouseCurve(int index)
139 {
140 JoyButton::JoyMouseCurve temp = MouseSettingsDialog::getMouseCurveForIndex(index);
141 stick->setButtonsMouseCurve(temp);
142 }
143
updateConfigHorizontalSpeed(int value)144 void MouseControlStickSettingsDialog::updateConfigHorizontalSpeed(int value)
145 {
146 QHashIterator<JoyControlStick::JoyStickDirections, JoyControlStickButton*> iter(*stick->getButtons());
147 while (iter.hasNext())
148 {
149 JoyControlStickButton *button = iter.next().value();
150 button->setMouseSpeedX(value);
151 }
152 }
153
updateConfigVerticalSpeed(int value)154 void MouseControlStickSettingsDialog::updateConfigVerticalSpeed(int value)
155 {
156 QHashIterator<JoyControlStick::JoyStickDirections, JoyControlStickButton*> iter(*stick->getButtons());
157 while (iter.hasNext())
158 {
159 JoyControlStickButton *button = iter.next().value();
160 button->setMouseSpeedY(value);
161 }
162 }
163
updateSpringWidth(int value)164 void MouseControlStickSettingsDialog::updateSpringWidth(int value)
165 {
166 stick->setButtonsSpringWidth(value);
167 }
168
updateSpringHeight(int value)169 void MouseControlStickSettingsDialog::updateSpringHeight(int value)
170 {
171 stick->setButtonsSpringHeight(value);
172 }
173
selectCurrentMouseModePreset()174 void MouseControlStickSettingsDialog::selectCurrentMouseModePreset()
175 {
176 bool presetDefined = stick->hasSameButtonsMouseMode();
177 if (presetDefined)
178 {
179 JoyButton::JoyMouseMovementMode mode = stick->getButtonsPresetMouseMode();
180 if (mode == JoyButton::MouseCursor)
181 {
182 ui->mouseModeComboBox->setCurrentIndex(1);
183 }
184 else if (mode == JoyButton::MouseSpring)
185 {
186 ui->mouseModeComboBox->setCurrentIndex(2);
187 }
188 }
189 else
190 {
191 ui->mouseModeComboBox->setCurrentIndex(0);
192 }
193 }
194
calculateSpringPreset()195 void MouseControlStickSettingsDialog::calculateSpringPreset()
196 {
197 int tempWidth = stick->getButtonsPresetSpringWidth();
198 int tempHeight = stick->getButtonsPresetSpringHeight();
199
200 if (tempWidth > 0)
201 {
202 ui->springWidthSpinBox->setValue(tempWidth);
203 }
204
205 if (tempHeight > 0)
206 {
207 ui->springHeightSpinBox->setValue(tempHeight);
208 }
209 }
210
calculateMouseSpeedPreset()211 void MouseControlStickSettingsDialog::calculateMouseSpeedPreset()
212 {
213 QHashIterator<JoyControlStick::JoyStickDirections, JoyControlStickButton*> iter(*stick->getButtons());
214 int tempMouseSpeedX = 0;
215 while (iter.hasNext())
216 {
217 JoyControlStickButton *button = iter.next().value();
218 tempMouseSpeedX = qMax(tempMouseSpeedX, button->getMouseSpeedX());
219 }
220
221 iter.toFront();
222 int tempMouseSpeedY = 0;
223 while (iter.hasNext())
224 {
225 JoyControlStickButton *button = iter.next().value();
226 tempMouseSpeedY = qMax(tempMouseSpeedY, button->getMouseSpeedY());
227 }
228
229 ui->horizontalSpinBox->setValue(tempMouseSpeedX);
230 ui->verticalSpinBox->setValue(tempMouseSpeedY);
231 }
232
updateSensitivity(double value)233 void MouseControlStickSettingsDialog::updateSensitivity(double value)
234 {
235 stick->setButtonsSensitivity(value);
236 }
237
updateAccelerationCurvePresetComboBox()238 void MouseControlStickSettingsDialog::updateAccelerationCurvePresetComboBox()
239 {
240 JoyButton::JoyMouseCurve temp = stick->getButtonsPresetMouseCurve();
241 MouseSettingsDialog::updateAccelerationCurvePresetComboBox(temp);
242 }
243
calculateWheelSpeedPreset()244 void MouseControlStickSettingsDialog::calculateWheelSpeedPreset()
245 {
246 QHashIterator<JoyControlStick::JoyStickDirections, JoyControlStickButton*> iter(*stick->getButtons());
247 int tempWheelSpeedX = 0;
248 int tempWheelSpeedY = 0;
249 while (iter.hasNext())
250 {
251 JoyControlStickButton *button = iter.next().value();
252 tempWheelSpeedX = qMax(tempWheelSpeedX, button->getWheelSpeedX());
253 tempWheelSpeedY = qMax(tempWheelSpeedY, button->getWheelSpeedY());
254 }
255
256 ui->wheelHoriSpeedSpinBox->setValue(tempWheelSpeedX);
257 ui->wheelVertSpeedSpinBox->setValue(tempWheelSpeedY);
258 }
259
updateWheelSpeedHorizontalSpeed(int value)260 void MouseControlStickSettingsDialog::updateWheelSpeedHorizontalSpeed(int value)
261 {
262 stick->setButtonsWheelSpeedX(value);
263 }
264
updateWheelSpeedVerticalSpeed(int value)265 void MouseControlStickSettingsDialog::updateWheelSpeedVerticalSpeed(int value)
266 {
267 stick->setButtonsWheelSpeedY(value);
268 }
269
updateSpringRelativeStatus(bool value)270 void MouseControlStickSettingsDialog::updateSpringRelativeStatus(bool value)
271 {
272 stick->setButtonsSpringRelativeStatus(value);
273 }
274
updateWindowTitleStickName()275 void MouseControlStickSettingsDialog::updateWindowTitleStickName()
276 {
277 QString temp = QString(tr("Mouse Settings")).append(" - ");
278
279 if (!stick->getStickName().isEmpty())
280 {
281 temp.append(stick->getPartialName(false, true));
282 }
283 else
284 {
285 temp.append(stick->getPartialName());
286 }
287
288 if (stick->getParentSet()->getIndex() != 0)
289 {
290 unsigned int setIndex = stick->getParentSet()->getRealIndex();
291 temp.append(" [").append(tr("Set %1").arg(setIndex));
292
293 QString setName = stick->getParentSet()->getName();
294 if (!setName.isEmpty())
295 {
296 temp.append(": ").append(setName);
297 }
298
299 temp.append("]");
300 }
301
302 setWindowTitle(temp);
303 }
304
305
calculateExtraAccelrationStatus()306 void MouseControlStickSettingsDialog::calculateExtraAccelrationStatus()
307 {
308 if (stick->getButtonsExtraAccelerationStatus())
309 {
310 ui->extraAccelerationGroupBox->setChecked(true);
311 }
312 }
313
calculateExtraAccelerationMultiplier()314 void MouseControlStickSettingsDialog::calculateExtraAccelerationMultiplier()
315 {
316 ui->extraAccelDoubleSpinBox->setValue(stick->getButtonsExtraAccelerationMultiplier());
317 }
318
calculateStartAccelerationMultiplier()319 void MouseControlStickSettingsDialog::calculateStartAccelerationMultiplier()
320 {
321 ui->minMultiDoubleSpinBox->setValue(stick->getButtonsStartAccelerationMultiplier());
322 }
323
calculateMinAccelerationThreshold()324 void MouseControlStickSettingsDialog::calculateMinAccelerationThreshold()
325 {
326 ui->minThresholdDoubleSpinBox->setValue(stick->getButtonsMinAccelerationThreshold());
327 }
328
calculateMaxAccelerationThreshold()329 void MouseControlStickSettingsDialog::calculateMaxAccelerationThreshold()
330 {
331 ui->maxThresholdDoubleSpinBox->setValue(stick->getButtonsMaxAccelerationThreshold());
332 }
333
calculateAccelExtraDuration()334 void MouseControlStickSettingsDialog::calculateAccelExtraDuration()
335 {
336 ui->accelExtraDurationDoubleSpinBox->setValue(stick->getButtonsAccelerationEasingDuration());
337 }
338
calculateReleaseSpringRadius()339 void MouseControlStickSettingsDialog::calculateReleaseSpringRadius()
340 {
341 ui->releaseSpringRadiusspinBox->setValue(stick->getButtonsSpringDeadCircleMultiplier());
342 }
343
calculateExtraAccelerationCurve()344 void MouseControlStickSettingsDialog::calculateExtraAccelerationCurve()
345 {
346 JoyButton::JoyExtraAccelerationCurve curve = stick->getButtonsExtraAccelerationCurve();
347 updateExtraAccelerationCurvePresetComboBox(curve);
348 }
349
updateExtraAccelerationCurve(int index)350 void MouseControlStickSettingsDialog::updateExtraAccelerationCurve(int index)
351 {
352 JoyButton::JoyExtraAccelerationCurve temp = getExtraAccelCurveForIndex(index);
353 if (index > 0)
354 {
355 //PadderCommon::lockInputDevices();
356
357 //InputDevice *device = stick->getParentSet()->getInputDevice();
358 //QMetaObject::invokeMethod(device, "haltServices", Qt::BlockingQueuedConnection);
359
360 PadderCommon::inputDaemonMutex.lock();
361 stick->setButtonsExtraAccelCurve(temp);
362 PadderCommon::inputDaemonMutex.unlock();
363
364 //PadderCommon::unlockInputDevices();
365 }
366 }
367