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