diff --git a/companion/src/constants.h b/companion/src/constants.h
index 2fd97f7a7..bfa6a3afb 100644
--- a/companion/src/constants.h
+++ b/companion/src/constants.h
@@ -59,10 +59,10 @@ enum BoardEnum {
#define CPN_MAX_KEYS 32
#define CPN_MAX_MOUSE_ANALOGS 2
-const char * const ARROW_LEFT = "\xE2\x86\x90";
-const char * const ARROW_UP = "\xE2\x86\x91";
-const char * const ARROW_RIGHT = "\xE2\x86\x92";
-const char * const ARROW_DOWN = "\xE2\x86\x93";
+const char * const ARROW_LEFT = "\u2190";
+const char * const ARROW_UP = "\u2191";
+const char * const ARROW_RIGHT = "\u2192";
+const char * const ARROW_DOWN = "\u2193";
#if defined(DEBUG)
#define HORUS_READY_FOR_RELEASE() true
diff --git a/companion/src/simulation/CMakeLists.txt b/companion/src/simulation/CMakeLists.txt
index fb91a5bdf..00507c363 100644
--- a/companion/src/simulation/CMakeLists.txt
+++ b/companion/src/simulation/CMakeLists.txt
@@ -4,6 +4,7 @@ set(simulation_SRCS
trainersimu.cpp
debugoutput.cpp
simulatorinterface.cpp
+ virtualjoystickwidget.cpp
)
set(simulation_UIS
@@ -24,6 +25,7 @@ set(simulation_HDRS
telemetrysimu.h
trainersimu.h
debugoutput.h
+ virtualjoystickwidget.h
)
if(SDL_FOUND)
diff --git a/companion/src/simulation/simulatordialog-9x.ui b/companion/src/simulation/simulatordialog-9x.ui
index 825337da2..7a365fdf6 100644
--- a/companion/src/simulation/simulatordialog-9x.ui
+++ b/companion/src/simulation/simulatordialog-9x.ui
@@ -6,8 +6,8 @@
0
0
- 739
- 613
+ 587
+ 457
@@ -16,12 +16,6 @@
0
-
-
- 739
- 16777215
-
-
Companion Simulator
@@ -53,12 +47,6 @@
0
-
-
- 0
- 0
-
-
16777215
@@ -74,57 +62,117 @@
2
-
+
5
-
- 5
-
5
- 5
+ 4
6
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ 0
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ 0
+
+
+
+
+
+
-
-
-
-
-
-
-
- 220
- 220
-
-
-
- Qt::ScrollBarAlwaysOff
-
-
- Qt::ScrollBarAlwaysOff
-
-
-
- -
-
-
- 0
-
-
-
-
-
-
- 8
-
-
-
- false
-
-
- QPushButton {
+
+
+
+ 0
+ 0
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
-
+
+
+
+ 8
+
+
+
+ QPushButton {
background-color: #EEEEEE;
border-style: outset;
border-width: 1px;
@@ -137,24 +185,24 @@ QPushButton:checked {
background-color: #4CC417;
border-style: inset;
}
-
-
- THR
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
+
+
+ AIL
+
+
+ true
+
+
+
+ -
+
+
+
+ 8
+
+
+
+ QPushButton {
background-color: #EEEEEE;
border-style: outset;
border-width: 1px;
@@ -167,24 +215,24 @@ QPushButton:checked {
background-color: #4CC417;
border-style: inset;
}
-
-
- RUD
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
+
+
+ ELE
+
+
+ true
+
+
+
+ -
+
+
+
+ 8
+
+
+
+ QPushButton {
background-color: #EEEEEE;
border-style: outset;
border-width: 1px;
@@ -197,24 +245,27 @@ QPushButton:checked {
background-color: #4CC417;
border-style: inset;
}
-
-
- ELE
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
+
+
+ RUD
+
+
+ true
+
+
+
+ -
+
+
+
+ 8
+
+
+
+ false
+
+
+ QPushButton {
background-color: #EEEEEE;
border-style: outset;
border-width: 1px;
@@ -227,330 +278,449 @@ QPushButton:checked {
background-color: #4CC417;
border-style: inset;
}
-
-
- AIL
-
-
- true
-
-
-
-
-
- -
-
-
-
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold X
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix X
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix Y
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold Y
-
-
- true
-
-
-
-
-
- -
-
-
- 20
-
-
- 20
-
-
-
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- <-
-
-
- false
-
-
-
- -
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ->
-
-
- false
-
-
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ^
-
-
- false
-
-
-
- -
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Vertical
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- v
-
-
- false
-
-
-
-
-
-
+
+
+ THR
+
+
+ true
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ true
+
+
+ QFrame::Panel
+
+
+ QFrame::Raised
+
+
+ 2
+
+
+
+ 2
+
+
+ 2
+
+
+ 2
+
+
+ 2
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ BEEP
+
+
+ Qt::AlignCenter
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 3
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ 2
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 42
+ 42
+
+
+
+ P1
+
+
+ -1024
+
+
+ 1024
+
+
+ 128
+
+
+ 64.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 0 %
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ -
+
+
+ 2
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 42
+ 42
+
+
+
+ P3
+
+
+ -1024
+
+
+ 1024
+
+
+ 128
+
+
+ 64.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 0 %
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ -
+
+
+ 2
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 42
+ 42
+
+
+
+ P2
+
+
+ -1024
+
+
+ 1024
+
+
+ 128
+
+
+ false
+
+
+ 64.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ 0 %
+
+
+ Qt::AlignCenter
+
+
+
+
+
+
+
-
-
-
-
-
-
-
- 220
- 220
-
-
-
- Qt::ScrollBarAlwaysOff
-
-
- Qt::ScrollBarAlwaysOff
-
-
-
- -
-
-
-
-
-
-
- 8
-
-
-
- QPushButton {
+
+
+
+ 0
+ 0
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
-
+
+
+
+ 8
+
+
+
+ QPushButton {
+ background-color: #EEEEEE;
+ border-style: outset;
+ border-width: 1px;
+ border-radius: 4px;
+ border-color: black;
+ padding: 2px;
+ }
+
+QPushButton:checked {
+ background-color: #4CC417;
+ border-style: inset;
+ }
+
+
+ ID2
+
+
+ true
+
+
+ true
+
+
+
+ -
+
+
+
+ 8
+
+
+
+ QPushButton {
+ background-color: #EEEEEE;
+ border-style: outset;
+ border-width: 1px;
+ border-radius: 4px;
+ border-color: black;
+ padding: 2px;
+
+ }
+
+QPushButton:checked {
+ background-color: #4CC417;
+ border-style: inset;
+ }
+
+
+ ID1
+
+
+ true
+
+
+ true
+
+
+
+ -
+
+
+
+ 8
+
+
+
+ QPushButton {
+ background-color: #EEEEEE;
+ border-style: outset;
+ border-width: 1px;
+ border-radius: 4px;
+ border-color: black;
+ padding: 2px;
+ }
+
+QPushButton:checked {
+ background-color: #4CC417;
+ border-style: inset;
+ }
+
+
+ ID0
+
+
+ true
+
+
+ true
+
+
+ true
+
+
+
+ -
+
+
+
+ 8
+
+
+
+ QPushButton {
+ background-color: #EEEEEE;
+ border-style: outset;
+ border-width: 1px;
+ border-radius: 4px;
+ border-color: black;
+ padding: 2px;
+ }
+
+QPushButton:checked {
+ background-color: #4CC417;
+ border-style: inset;
+ }
+
+
+ GEA
+
+
+ true
+
+
+ false
+
+
+
+ -
+
+
+
+ 8
+
+
+
+ QPushButton {
background-color: #EEEEEE;
border-style: outset;
border-width: 1px;
@@ -563,685 +733,25 @@ QPushButton:pressed {
background-color: #4CC417;
border-style: inset;
}
-
-
- TRN
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- GEA
-
-
- true
-
-
- false
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- ID0
-
-
- true
-
-
- true
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
-
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- ID1
-
-
- true
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- ID2
-
-
- true
-
-
- true
-
-
-
-
-
- -
-
-
-
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold X
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix X
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix Y
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold Y
-
-
- true
-
-
-
-
-
- -
-
-
- 20
-
-
- 20
-
-
-
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- <-
-
-
- false
-
-
-
- -
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ->
-
-
- false
-
-
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ^
-
-
- false
-
-
-
- -
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Vertical
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- v
-
-
- false
-
-
-
-
-
-
-
- -
-
-
-
-
-
- true
-
-
- QFrame::Panel
-
-
- QFrame::Raised
-
-
- 2
-
-
-
- 2
-
- 2
+
+ TRN
-
- 2
-
-
- 2
-
-
-
-
-
- BEEP
-
-
- Qt::AlignCenter
-
-
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 50
- 50
-
-
-
- P1
-
-
- -1024
-
-
- 1024
-
-
- 128
-
-
- 64.000000000000000
-
-
- true
-
-
-
- -
-
-
- 0 %
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 50
- 50
-
-
-
- P2
-
-
- -1024
-
-
- 1024
-
-
- 128
-
-
- false
-
-
- 64.000000000000000
-
-
- true
-
-
-
- -
-
-
- 0 %
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 50
- 50
-
-
-
- P3
-
-
- -1024
-
-
- 1024
-
-
- 128
-
-
- 64.000000000000000
-
-
- true
-
-
-
- -
-
-
- 0 %
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
-
+
+
+
+
+ rightStickWidget
+ leftStickWidget
+ knobsWidget
+ switchesLeft
+ switchesRight
+ beep_frame
- -
-
-
- Qt::Horizontal
-
-
- QSizePolicy::Minimum
-
-
-
- 570
- 5
-
-
-
-
- -
+
-
true
@@ -1252,12 +762,6 @@ QPushButton:checked {
0
-
-
- 16777215
- 16777215
-
-
0
@@ -1266,6 +770,21 @@ QPushButton:checked {
9x Simulator
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
-
@@ -1416,7 +935,7 @@ QPushButton:checked {
- 40
+ 0
20
@@ -1429,65 +948,12 @@ QPushButton:checked {
- 40
+ 0
20
- -
-
-
-
-
-
- Qt::Horizontal
-
-
-
- 438
- 6
-
-
-
-
-
-
-
-
-
-
- Outputs
-
-
- -
-
-
- -
-
-
-
-
-
-
- Outputs2
-
-
- -
-
-
- -
-
-
-
-
-
-
- Gvars
-
-
- -
-
-
@@ -1502,21 +968,16 @@ QPushButton:checked {
1
- SliderWidget
- QSlider
-
+ ButtonsWidget
+ QWidget
+
+ 1
DialWidget
QDial
-
- ButtonsWidget
- QWidget
-
- 1
-
diff --git a/companion/src/simulation/simulatordialog-flamenco.ui b/companion/src/simulation/simulatordialog-flamenco.ui
index 34145282d..321927744 100644
--- a/companion/src/simulation/simulatordialog-flamenco.ui
+++ b/companion/src/simulation/simulatordialog-flamenco.ui
@@ -6,8 +6,8 @@
0
0
- 726
- 708
+ 608
+ 546
@@ -16,12 +16,6 @@
0
-
-
- 739
- 16777215
-
-
Companion Simulator
@@ -42,26 +36,13 @@
5
-
+
0
- -
-
-
- Qt::Horizontal
-
-
- QSizePolicy::Minimum
-
-
-
- 570
- 5
-
-
-
-
- -
+
+ 3
+
+
-
true
@@ -86,6 +67,19 @@
Flamenco Simulator
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 0
+ 20
+
+
+
+
-
@@ -160,86 +154,14 @@
- 40
+ 0
20
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
-
-
- Qt::Horizontal
-
-
-
- 438
- 6
-
-
-
-
-
-
-
-
- Outputs
-
-
- -
-
-
- -
-
-
-
-
-
-
- Outputs2
-
-
- -
-
-
- -
-
-
-
-
-
-
- Gvars
-
-
-
-
- 10
- 10
- 691
- 231
-
-
-
-
-
-
@@ -250,18 +172,6 @@
0
-
-
- 0
- 0
-
-
-
-
- 16777215
- 16777215
-
-
QFrame::Panel
@@ -271,1378 +181,698 @@
2
-
+
- 5
+ 0
- 5
+ 0
- 5
+ 0
- 5
+ 0
-
- 6
+
+ 7
- -
-
-
-
-
-
-
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ^
-
-
- false
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Vertical
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- v
-
-
- false
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
- QSizePolicy::MinimumExpanding
-
-
-
- 5
- 20
-
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold Y
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix Y
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix X
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold X
-
-
- true
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 42
- 42
-
-
-
-
-
-
- -1024
-
-
- 1024
-
-
- 128
-
-
- 64.000000000000000
-
-
- true
-
-
-
- -
-
-
- 20
-
-
- 20
-
-
-
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
-
- 245
- 245
-
-
-
- Qt::ScrollBarAlwaysOff
-
-
- Qt::ScrollBarAlwaysOff
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
- SF
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
-
-
-
- 1
-
-
- 1
-
-
- 0
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 42
- 42
-
-
-
-
-
-
- -1024
-
-
- 1024
-
-
- 128
-
-
- 64.000000000000000
-
-
- true
-
-
-
- -
-
-
- SA
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- SB
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- SE
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- LS
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- S1
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- <-
-
-
- false
-
-
-
- -
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ->
-
-
- false
-
-
-
-
-
-
+
+ 0
+
+ -
+
+
+
+ 0
+
+
+ 7
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 0
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 42
+ 42
+
+
+
+
+
+
+ -1024
+
+
+ 1024
+
+
+ 128
+
+
+ 64.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 42
+ 42
+
+
+
+
+
+
+ -1024
+
+
+ 1024
+
+
+ 128
+
+
+ 64.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 42
+ 42
+
+
+
+
+
+
+ -1024
+
+
+ 1024
+
+
+ 128
+
+
+ 64.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ false
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 42
+ 42
+
+
+
+
+
+
+ -1024
+
+
+ 1024
+
+
+ 128
+
+
+ 64.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ 0
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+ SF
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ LS
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SE
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SA
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SB
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ S1
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ S2
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SC
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SD
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SG
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ RS
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SH
+
+
+ Qt::AlignCenter
+
+
+
+
+
- -
-
-
- QLayout::SetDefaultConstraint
+
-
+
+
+
+ 0
+ 0
+
-
-
-
-
-
-
-
- Qt::Horizontal
-
-
- QSizePolicy::MinimumExpanding
-
-
-
- 5
- 20
-
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ^
-
-
- false
-
-
-
- -
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Vertical
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- v
-
-
- false
-
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 42
- 42
-
-
-
-
-
-
- -1024
-
-
- 1024
-
-
- 128
-
-
- 64.000000000000000
-
-
- true
-
-
-
- -
-
-
- S2
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 245
- 245
-
-
-
- Qt::ScrollBarAlwaysOff
-
-
- Qt::ScrollBarAlwaysOff
-
-
-
- -
-
-
-
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold Y
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix Y
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix X
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold X
-
-
- true
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- false
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 42
- 42
-
-
-
-
-
-
- -1024
-
-
- 1024
-
-
- 128
-
-
- 64.000000000000000
-
-
- true
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
-
-
-
- 1
-
-
- 0
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
- SC
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- SD
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- SG
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- SH
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- RS
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- 20
-
-
- 20
-
-
-
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- <-
-
-
- false
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ->
-
-
- false
-
-
-
-
-
-
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+ 0
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ 0
+
+
+
+
+
@@ -1662,11 +892,6 @@ QPushButton:checked {
1
-
- SliderWidget
- QSlider
-
-
diff --git a/companion/src/simulation/simulatordialog-horus.ui b/companion/src/simulation/simulatordialog-horus.ui
index f89d35f1b..adb756852 100644
--- a/companion/src/simulation/simulatordialog-horus.ui
+++ b/companion/src/simulation/simulatordialog-horus.ui
@@ -6,8 +6,8 @@
0
0
- 960
- 850
+ 843
+ 636
@@ -16,18 +16,6 @@
0
-
-
- 960
- 850
-
-
-
-
- 960
- 850
-
-
Companion Simulator
@@ -36,12 +24,24 @@
:/icon.png:/icon.png
-
+
5
-
+
+ 5
+
+
+ 5
+
+
+ 5
+
+
0
+
+ 3
+
-
@@ -50,18 +50,6 @@
0
-
-
- 0
- 0
-
-
-
-
- 16777215
- 16777215
-
-
QFrame::Panel
@@ -71,1369 +59,698 @@
2
-
-
+
+
+ 4
+
+
5
-
+
+ 4
+
+
+ 2
+
+
6
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ^
-
-
- false
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Vertical
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- v
-
-
- false
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
- QSizePolicy::MinimumExpanding
-
-
-
- 5
- 20
-
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold Y
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix Y
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix X
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold X
-
-
- true
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 42
- 42
-
-
-
-
-
-
- -1024
-
-
- 1024
-
-
- 128
-
-
- 64.000000000000000
-
-
- true
-
-
-
- -
-
-
- 20
-
-
- 20
-
-
-
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
-
- 245
- 245
-
-
-
- Qt::ScrollBarAlwaysOff
-
-
- Qt::ScrollBarAlwaysOff
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
- SF
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
-
-
-
- 1
-
-
- 1
-
-
- 0
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 42
- 42
-
-
-
-
-
-
- -1024
-
-
- 1024
-
-
- 128
-
-
- 64.000000000000000
-
-
- true
-
-
-
- -
-
-
- SA
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- SB
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- SE
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- LS
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- S1
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- <-
-
-
- false
-
-
-
- -
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ->
-
-
- false
-
-
-
-
-
-
+
+ 0
+
+ -
+
+
+
+ 0
+
+
+ 7
+
+
+ 0
+
+
+ 5
+
+
+ 6
+
+
+ 4
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 0
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 42
+ 42
+
+
+
+
+
+
+ -1024
+
+
+ 1024
+
+
+ 128
+
+
+ 64.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 42
+ 42
+
+
+
+
+
+
+ -1024
+
+
+ 1024
+
+
+ 128
+
+
+ 64.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 42
+ 42
+
+
+
+
+
+
+ -1024
+
+
+ 1024
+
+
+ 128
+
+
+ 64.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ false
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 42
+ 42
+
+
+
+
+
+
+ -1024
+
+
+ 1024
+
+
+ 128
+
+
+ 64.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 1
+
+
+ 0
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+ SF
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ LS
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SE
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SA
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SB
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ S1
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ S2
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SC
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SD
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SG
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ RS
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SH
+
+
+ Qt::AlignCenter
+
+
+
+
+
- -
-
-
- QLayout::SetDefaultConstraint
+
-
+
+
+
+ 0
+ 0
+
-
-
-
-
-
-
-
- Qt::Horizontal
-
-
- QSizePolicy::MinimumExpanding
-
-
-
- 5
- 20
-
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ^
-
-
- false
-
-
-
- -
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Vertical
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- v
-
-
- false
-
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 42
- 42
-
-
-
-
-
-
- -1024
-
-
- 1024
-
-
- 128
-
-
- 64.000000000000000
-
-
- true
-
-
-
- -
-
-
- S2
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 245
- 245
-
-
-
- Qt::ScrollBarAlwaysOff
-
-
- Qt::ScrollBarAlwaysOff
-
-
-
- -
-
-
-
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold Y
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix Y
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix X
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold X
-
-
- true
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- false
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 42
- 42
-
-
-
-
-
-
- -1024
-
-
- 1024
-
-
- 128
-
-
- 64.000000000000000
-
-
- true
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
-
-
-
- 1
-
-
- 0
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
- SC
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- SD
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- SG
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- SH
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- RS
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- 20
-
-
- 20
-
-
-
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- <-
-
-
- false
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ->
-
-
- false
-
-
-
-
-
-
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+ 0
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ 0
+
+
+
+
+
@@ -1442,6 +759,12 @@ QPushButton:checked {
-
+
+
+ 0
+ 0
+
+
PF4 - Telemetry Simulator
@@ -1449,6 +772,12 @@ QPushButton:checked {
-
+
+
+ 0
+ 0
+
+
PF5 - Trainer Simulator
@@ -1456,21 +785,33 @@ QPushButton:checked {
-
+
+
+ 0
+ 0
+
+
PF6 - Debug Console Window
- -
-
-
- PF7 - Reload Lua Scripts
-
-
-
+ -
+
+
+
+ 0
+ 0
+
+
+
+ PF7 - Reload Lua Scripts
+
+
+
- -
+
-
true
@@ -1481,12 +822,6 @@ QPushButton:checked {
0
-
-
- 16777215
- 16777215
-
-
0
@@ -1495,13 +830,19 @@ QPushButton:checked {
Horus Simulator
+
+ 0
+
- 5
+ 0
+
+
+ 0
- 5
+ 0
-
+
0
-
@@ -1712,8 +1053,8 @@ QPushButton:checked {
- 20
- 292
+ 0
+ 20
@@ -1725,74 +1066,16 @@ QPushButton:checked {
- 20
- 292
+ 0
+ 20
-
-
- O&utputs
-
-
- -
-
-
- -
-
-
-
-
-
-
- Ou&tputs2
-
-
- -
-
-
- -
-
-
-
-
-
-
- &Gvars
-
-
-
-
- 10
- 10
- 691
- 231
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
- QSizePolicy::Minimum
-
-
-
- 700
- 5
-
-
-
-
@@ -1809,13 +1092,30 @@ QPushButton:checked {
1
- SliderWidget
- QSlider
-
+ DialWidget
+ QDial
+
+
+
+ 5
+
+
+ 5
+
+
+ false
+
+
+ false
+
+
+ true
+
+
diff --git a/companion/src/simulation/simulatordialog-taranis.ui b/companion/src/simulation/simulatordialog-taranis.ui
index 7ca2e9b31..2eed724ff 100644
--- a/companion/src/simulation/simulatordialog-taranis.ui
+++ b/companion/src/simulation/simulatordialog-taranis.ui
@@ -6,8 +6,8 @@
0
0
- 739
- 695
+ 682
+ 575
@@ -16,12 +16,6 @@
0
-
-
- 739
- 16777215
-
-
Companion Simulator
@@ -30,12 +24,24 @@
:/icon.png:/icon.png
-
+
5
-
+
+ 5
+
+
+ 5
+
+
+ 5
+
+
0
+
+ 3
+
-
@@ -44,18 +50,6 @@
0
-
-
- 0
- 0
-
-
-
-
- 16777215
- 16777215
-
-
QFrame::Panel
@@ -65,1460 +59,879 @@
2
-
-
-
-
-
-
-
-
- Qt::Horizontal
-
-
-
- 13
- 47
-
-
-
-
- -
-
-
- SB
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- SA
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 13
- 47
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 13
- 47
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
- SC
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- SE
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- RS
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
-
-
-
- 1
-
-
- 1
-
-
- 0
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 13
- 47
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
- LS
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 13
- 47
-
-
-
-
- -
-
-
- SH
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
-
-
-
- 1
-
-
- 0
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 13
- 47
-
-
-
-
- -
-
-
- SG
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- false
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
- SF
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 16777215
- 50
-
-
-
-
-
-
- 2
-
-
- 1
-
-
- 0
-
-
- Qt::Vertical
-
-
- true
-
-
- QSlider::TicksBothSides
-
-
- 1
-
-
-
- -
-
-
- SD
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
-
- 16777215
- 50
-
-
-
- -1024
-
-
- 1024
-
-
- Qt::Vertical
-
-
-
- -
-
-
-
- 16777215
- 50
-
-
-
- -1024
-
-
- 1024
-
-
- Qt::Vertical
-
-
-
- -
-
-
- Qt::Horizontal
-
-
- QSizePolicy::Fixed
-
-
-
- 84
- 1
-
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 0
- 50
-
-
-
-
- 42
- 42
-
-
-
-
-
-
- -1024
-
-
- 1024
-
-
- 128
-
-
- 64.000000000000000
-
-
- true
-
-
-
- -
-
-
-
- 0
- 50
-
-
-
-
- 42
- 42
-
-
-
- -1024
-
-
- 1024
-
-
- 128
-
-
- 64.000000000000000
-
-
- true
-
-
-
- -
-
-
-
- 0
- 50
-
-
-
-
- 42
- 42
-
-
-
- -1024
-
-
- 1024
-
-
- 128
-
-
- 64.000000000000000
-
-
- true
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 0
- 50
-
-
-
-
- 42
- 42
-
-
-
-
-
-
- -1024
-
-
- 1024
-
-
- 128
-
-
- 64.000000000000000
-
-
- true
-
-
-
- -
-
-
-
- 42
- 0
-
-
-
- S1
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
-
- 42
- 0
-
-
-
- S2
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
-
- 42
- 0
-
-
-
- S3
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
-
- 42
- 0
-
-
-
- S4
-
-
- Qt::AlignCenter
-
-
-
-
-
-
+
+
+ 5
+
+
+ 7
+
+
+ 5
+
+
+ 6
+
+
+ 6
+
+
+ 5
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 5
+
+
+ 4
+
+
-
+
+
+ 5
+
+
+ 4
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 50
+
+
+
+
+ 42
+ 42
+
+
+
+
+
+
+ -1024
+
+
+ 1024
+
+
+ 128
+
+
+ 64.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 50
+
+
+
+
+ 42
+ 42
+
+
+
+ -1024
+
+
+ 1024
+
+
+ 128
+
+
+ 64.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 50
+
+
+
+
+ 42
+ 42
+
+
+
+ -1024
+
+
+ 1024
+
+
+ 128
+
+
+ 64.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+ 50
+
+
+
+
+ 42
+ 42
+
+
+
+
+
+
+ -1024
+
+
+ 1024
+
+
+ 128
+
+
+ 64.000000000000000
+
+
+ true
+
+
+
+ -
+
+
+
+ 42
+ 0
+
+
+
+ S1
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 42
+ 0
+
+
+
+ S2
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 42
+ 0
+
+
+
+ S3
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 42
+ 0
+
+
+
+ S4
+
+
+ Qt::AlignCenter
+
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 13
+ 47
+
+
+
+
+ -
+
+
+ SB
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 16777215
+ 50
+
+
+
+ -1024
+
+
+ 1024
+
+
+ Qt::Vertical
+
+
+
+ -
+
+
+ SE
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SF
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 13
+ 47
+
+
+
+
+ -
+
+
+ SD
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ LS
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ SG
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 13
+ 47
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ false
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 13
+ 47
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 0
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ 0
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+ SC
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ RS
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 13
+ 47
+
+
+
+
+ -
+
+
+ SH
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 50
+
+
+
+
+
+
+ 2
+
+
+ 1
+
+
+ 0
+
+
+ Qt::Vertical
+
+
+ true
+
+
+ QSlider::TicksBothSides
+
+
+ 1
+
+
+
+ -
+
+
+
+ 16777215
+ 50
+
+
+
+ -1024
+
+
+ 1024
+
+
+ Qt::Vertical
+
+
+
+ -
+
+
+ SA
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 13
+ 47
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold Y
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix Y
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix X
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold X
-
-
- true
-
-
-
-
-
- -
-
-
-
- 245
- 245
-
-
-
-
- 16777215
- 16777215
-
-
-
- Qt::ScrollBarAlwaysOff
-
-
- Qt::ScrollBarAlwaysOff
-
-
-
- -
-
-
-
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ^
-
-
- false
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Vertical
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- v
-
-
- false
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- <-
-
-
- false
-
-
-
- -
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ->
-
-
- false
-
-
-
-
-
- -
-
-
- 20
-
-
- 20
-
-
-
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ^
-
-
- false
-
-
-
- -
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Vertical
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- v
-
-
- false
-
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 245
- 245
-
-
-
-
- 16777215
- 16777215
-
-
-
- Qt::ScrollBarAlwaysOff
-
-
- Qt::ScrollBarAlwaysOff
-
-
-
- -
-
-
-
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold Y
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix Y
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Fix X
-
-
- true
-
-
-
- -
-
-
-
- 8
-
-
-
- QPushButton {
- background-color: #EEEEEE;
- border-style: outset;
- border-width: 1px;
- border-radius: 4px;
- border-color: black;
- padding: 2px;
- }
-
-QPushButton:checked {
- background-color: #4CC417;
- border-style: inset;
- }
-
-
- Hold X
-
-
- true
-
-
-
-
-
- -
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- <-
-
-
- false
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Right Double Click to Reset
-
-
- -125
-
-
- 125
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 23
- 23
-
-
-
- ->
-
-
- false
-
-
-
-
-
- -
-
-
- 20
-
-
- 20
-
-
-
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
- -
-
-
- TextLabel
-
-
- Qt::AlignCenter
-
-
-
-
-
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+ -
+
+
+ 0
+
+
+
+
+
-
-
-
- Qt::Horizontal
+
+
+
+ 0
+ 0
+
-
-
- 20
- 20
-
-
-
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ 0
+
+
+
+
+
- -
-
-
- Qt::Horizontal
-
-
- QSizePolicy::Minimum
-
-
-
- 570
- 5
-
-
-
-
- -
+
-
true
@@ -1529,12 +942,6 @@ QPushButton:checked {
0
-
-
- 16777215
- 16777215
-
-
0
@@ -1543,6 +950,34 @@ QPushButton:checked {
Taranis Simulator
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ Qt::Horizontal
+
+
+
+ 0
+ 20
+
+
+
+
-
@@ -1655,20 +1090,7 @@ QPushButton:checked {
- 40
- 20
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
+ 0
20
@@ -1676,6 +1098,9 @@ QPushButton:checked {
-
+
+ 0
+
-
@@ -1683,8 +1108,8 @@ QPushButton:checked {
- 438
- 6
+ 5
+ 0
@@ -1693,42 +1118,6 @@ QPushButton:checked {
-
-
- Outputs
-
-
- -
-
-
- -
-
-
-
-
-
-
- Outputs2
-
-
- -
-
-
- -
-
-
-
-
-
-
- Gvars
-
-
- -
-
-
-
-
-
@@ -1760,7 +1149,7 @@ QPushButton:checked {
PF7 - Reload Lua Scripts
-
+
@@ -1778,11 +1167,6 @@ QPushButton:checked {
1
-
- SliderWidget
- QSlider
-
-
DialWidget
QDial
diff --git a/companion/src/simulation/simulatordialog.cpp b/companion/src/simulation/simulatordialog.cpp
index 90018265c..e0d5281fd 100644
--- a/companion/src/simulation/simulatordialog.cpp
+++ b/companion/src/simulation/simulatordialog.cpp
@@ -24,10 +24,7 @@
#include
#include "helpers.h"
#include "simulatorinterface.h"
-#include "sliderwidget.h"
-
-#define GBALL_SIZE 20
-#define RESX 1024
+#include "virtualjoystickwidget.h"
int SimulatorDialog::screenshotIdx = 0;
SimulatorDialog * traceCallbackInstance = 0;
@@ -87,9 +84,10 @@ SimulatorDialog::SimulatorDialog(QWidget * parent, SimulatorInterface *simulator
TrainerSimu(0),
DebugOut(0),
buttonPressed(0),
- trimPressed (TRIM_NONE),
+ trimPressed(TRIM_NONE),
middleButtonPressed(false)
{
+ setWindowFlags(Qt::Window);
//shorcut for telemetry simulator
// new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_T), this, SLOT(openTelemetrySimulator()));
new QShortcut(QKeySequence(Qt::Key_F4), this, SLOT(openTelemetrySimulator()));
@@ -110,6 +108,23 @@ void SimulatorDialog::closeEvent (QCloseEvent *)
{
simulator->stop();
timer->stop();
+ //g.simuWinGeo(GetCurrentFirmware()->getId(), saveGeometry());
+}
+
+void SimulatorDialog::showEvent(QShowEvent * event)
+{
+ static bool firstShow = true;
+ if (firstShow) {
+ if (flags & SIMULATOR_FLAGS_STICK_MODE_LEFT) {
+ vJoyLeft->setStickConstraint(VirtualJoystickWidget::HOLD_Y, true);
+ vJoyLeft->setStickY(1);
+ }
+ else {
+ vJoyRight->setStickConstraint(VirtualJoystickWidget::HOLD_Y, true);
+ vJoyRight->setStickY(1);
+ }
+ firstShow = false;
+ }
}
void SimulatorDialog::mousePressEvent(QMouseEvent *event)
@@ -126,24 +141,9 @@ void SimulatorDialog::mouseReleaseEvent(QMouseEvent *event)
}
}
-void SimulatorDialog::onTrimPressed()
+void SimulatorDialog::onTrimPressed(int which)
{
- if (sender()->objectName() == QString("trimHL_L"))
- trimPressed = TRIM_LH_L;
- else if (sender()->objectName() == QString("trimHL_R"))
- trimPressed = TRIM_LH_R;
- else if (sender()->objectName() == QString("trimVL_D"))
- trimPressed = TRIM_LV_DN;
- else if (sender()->objectName() == QString("trimVL_U"))
- trimPressed = TRIM_LV_UP;
- else if (sender()->objectName() == QString("trimVR_D"))
- trimPressed = TRIM_RV_DN;
- else if (sender()->objectName() == QString("trimVR_U"))
- trimPressed = TRIM_RV_UP;
- else if (sender()->objectName() == QString("trimHR_L"))
- trimPressed = TRIM_RH_L;
- else if (sender()->objectName() == QString("trimHR_R"))
- trimPressed = TRIM_RH_R;
+ trimPressed = which;
}
void SimulatorDialog::onTrimReleased()
@@ -151,6 +151,11 @@ void SimulatorDialog::onTrimReleased()
trimPressed = TRIM_NONE;
}
+void SimulatorDialog::onTrimSliderMoved(int which, int value)
+{
+ simulator->setTrim(which, value);
+}
+
void SimulatorDialog::openTelemetrySimulator()
{
// allow only one instance
@@ -264,28 +269,34 @@ void SimulatorDialog::initUi(T * ui)
{
ui->setupUi(this);
+ windowName = tr("Simulating Radio (%1)").arg(GetCurrentFirmware()->getName());
+ setWindowTitle(windowName);
+
+ simulator->setSdPath(g.profile[g.id()].sdPath());
+ simulator->setVolumeGain(g.profile[g.id()].volumeGain());
+
lcd = ui->lcd;
- leftStick = ui->leftStick;
- rightStick = ui->rightStick;
+ lcd->setData(simulator->getLcd(), lcdWidth, lcdHeight, lcdDepth);
+
+ tabWidget = ui->tabWidget;
pots = findWidgets(this, "pot%1");
potLabels = findWidgets(this, "potLabel%1");
potValues = findWidgets(this, "potValue%1");
sliders = findWidgets(this, "slider%1");
- trimHLeft = ui->trimHLeft;
- trimVLeft = ui->trimVLeft;
- trimHRight = ui->trimHRight;
- trimVRight = ui->trimVRight;
- tabWidget = ui->tabWidget;
- leftXPerc = ui->leftXPerc;
- leftYPerc = ui->leftYPerc;
- rightXPerc = ui->rightXPerc;
- rightYPerc = ui->rightYPerc;
+ vJoyLeft = new VirtualJoystickWidget(this, 'L');
+ ui->leftStickLayout->addWidget(vJoyLeft);
- setupSticks();
+ vJoyRight = new VirtualJoystickWidget(this, 'R');
+ ui->rightStickLayout->addWidget(vJoyRight);
- resize(0, 0); // to force min height, min width
- setFixedSize(width(), height());
+ connect(vJoyLeft, SIGNAL(trimButtonPressed(int)), this, SLOT(onTrimPressed(int)));
+ connect(vJoyLeft, SIGNAL(trimButtonReleased()), this, SLOT(onTrimReleased()));
+ connect(vJoyLeft, SIGNAL(trimSliderMoved(int,int)), this, SLOT(onTrimSliderMoved(int,int)));
+
+ connect(vJoyRight, SIGNAL(trimButtonPressed(int)), this, SLOT(onTrimPressed(int)));
+ connect(vJoyRight, SIGNAL(trimButtonReleased()), this, SLOT(onTrimReleased()));
+ connect(vJoyRight, SIGNAL(trimSliderMoved(int,int)), this, SLOT(onTrimSliderMoved(int,int)));
#ifdef JOYSTICKS
if (g.jsSupport()) {
@@ -313,14 +324,11 @@ void SimulatorDialog::initUi(T * ui)
joystick->sensitivities[j] = 0;
joystick->deadzones[j]=0;
}
- nodeRight->setCenteringY(false); //mode 1,3 -> THR on right
- ui->holdRightY->setChecked(true);
- nodeRight->setCenteringX(false); //mode 1,3 -> THR on right
- ui->holdRightX->setChecked(true);
- nodeLeft->setCenteringY(false); //mode 1,3 -> THR on right
- ui->holdLeftY->setChecked(true);
- nodeLeft->setCenteringX(false); //mode 1,3 -> THR on right
- ui->holdLeftX->setChecked(true);
+ //mode 1,3 -> THR on right
+ vJoyRight->setStickConstraint(VirtualJoystickWidget::HOLD_Y, true);
+ vJoyRight->setStickConstraint(VirtualJoystickWidget::HOLD_X, true);
+ vJoyLeft->setStickConstraint(VirtualJoystickWidget::HOLD_Y, true);
+ vJoyLeft->setStickConstraint(VirtualJoystickWidget::HOLD_X, true);
connect(joystick, SIGNAL(axisValueChanged(int, int)), this, SLOT(onjoystickAxisValueChanged(int, int)));
}
else {
@@ -331,126 +339,15 @@ void SimulatorDialog::initUi(T * ui)
}
#endif
- windowName = tr("Simulating Radio (%1)").arg(GetCurrentFirmware()->getName());
- setWindowTitle(windowName);
-
- simulator->setSdPath(g.profile[g.id()].sdPath());
- simulator->setVolumeGain(g.profile[g.id()].volumeGain());
- lcd->setData(simulator->getLcd(), lcdWidth, lcdHeight, lcdDepth);
-
- if (flags & SIMULATOR_FLAGS_STICK_MODE_LEFT) {
- nodeLeft->setCenteringY(false);
- ui->holdLeftY->setChecked(true);
- }
- else {
- nodeRight->setCenteringY(false);
- ui->holdRightY->setChecked(true);
- }
-
+ setupOutputsDisplay();
+ setupGVarsDisplay();
setTrims();
- int outputs = std::min(32, GetCurrentFirmware()->getCapability(Outputs));
- if (outputs <= 16) {
- // hide second Outputs tab
- tabWidget->removeTab(tabWidget->indexOf(ui->outputs2));
- }
- else {
- tabWidget->setTabText(tabWidget->indexOf(ui->outputs), tr("Outputs") + QString(" 1-%1").arg(16));
- tabWidget->setTabText(tabWidget->indexOf(ui->outputs2), tr("Outputs") + QString(" 17-%1").arg(outputs));
- }
- for (int i=0; ichannelsLayout;
- int column = i / (std::min(16,outputs)/2);
- int line = i % (std::min(16,outputs)/2);
- if (i >= 16 ) {
- outputTab = ui->channelsLayout2;
- column = (i-16) / (std::min(16,outputs-16)/2);
- line = (i-16) % (std::min(16,outputs-16)/2);
- }
- QLabel * label = new QLabel(tabWidget);
- label->setText(RawSource(SOURCE_TYPE_CH, i).toString());
- outputTab->addWidget(label, line, column == 0 ? 0 : 5, 1, 1);
+ //restoreGeometry(g.simuWinGeo(GetCurrentFirmware()->getId()));
- QSlider * slider = new QSlider(tabWidget);
- slider->setEnabled(false);
- /*slider->setMaximumSize(QSize(16777215, 18));
- slider->setStyleSheet(QString::fromUtf8("QSlider::sub-page:horizontal:disabled {\n"
- "border-color: #999;\n"
- "}\n"
- "\n"
- "QSlider::add-page:horizontal:disabled {\n"
- "border-color: #999;\n"
- "}\n"
- "\n"
- "QSlider::handle:horizontal:disabled {\n"
- "background: #0000CC;\n"
- "border: 1px solid #aaa;\n"
- "border-radius: 4px;\n"
- "}")); */
- slider->setMinimum(-1024);
- slider->setMaximum(1024);
- slider->setPageStep(128);
- slider->setTracking(false);
- slider->setOrientation(Qt::Horizontal);
- slider->setInvertedAppearance(false);
- slider->setTickPosition(QSlider::TicksBelow);
- channelSliders << slider;
- outputTab->addWidget(slider, line, column == 0 ? 1 : 4, 1, 1);
+ if (flags & SIMULATOR_FLAGS_NOTX)
+ tabWidget->setCurrentIndex(1);
- QLabel * value = new QLabel(tabWidget);
- value->setMinimumSize(QSize(50, 0));
- value->setAlignment(Qt::AlignCenter);
- channelValues << value;
- outputTab->addWidget(value, line, column == 0 ? 2 : 3, 1, 1);
- }
-
- int switches = GetCurrentFirmware()->getCapability(LogicalSwitches);
- for (int i=0; ilogicalSwitchesLayout->addWidget(swtch, i / (switches/2), i % (switches/2), 1, 1);
- if (outputs > 16) {
- // repeat logical switches on second outputs tab
- swtch = createLogicalSwitch(tabWidget, i, logicalSwitchLabels2);
- ui->logicalSwitchesLayout2->addWidget(swtch, i / (switches/2), i % (switches/2), 1, 1);
- }
- }
-
- int fmodes = GetCurrentFirmware()->getCapability(FlightModes);
- int gvars = GetCurrentFirmware()->getCapability(Gvars);
- if (gvars>0) {
- for (int fm=0; fmsetText(QString("FM%1").arg(fm));
- label->setAlignment(Qt::AlignCenter);
- ui->gvarsLayout->addWidget(label, 0, fm+1);
- }
- for (int i=0; isetText(QString("GV%1").arg(i+1));
- label->setAutoFillBackground(true);
- if ((i % 2) ==0 ) {
- label->setStyleSheet("QLabel { background-color: rgb(220, 220, 220) }");
- }
- ui->gvarsLayout->addWidget(label, i+1, 0);
- for (int fm=0; fmsetAutoFillBackground(true);
- value->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
- if ((i % 2) ==0 ) {
- value->setStyleSheet("QLabel { background-color: rgb(220, 220, 220) }");
- }
- gvarValues << value;
- ui->gvarsLayout->addWidget(value, i+1, fm+1);
- }
- }
- }
-
- if (flags & SIMULATOR_FLAGS_NOTX) {
- ui->tabWidget->setCurrentWidget(ui->outputs);
- }
- else {
- ui->tabWidget->setCurrentWidget(ui->simu);
- }
}
QFrame * SimulatorDialog::createLogicalSwitch(QWidget * parent, int switchNo, QVector & labels)
@@ -459,17 +356,135 @@ QFrame * SimulatorDialog::createLogicalSwitch(QWidget * parent, int switchNo, QV
swtch->setAutoFillBackground(true);
swtch->setFrameShape(QFrame::Panel);
swtch->setFrameShadow(QFrame::Raised);
- swtch->setLineWidth(2);
+ swtch->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+ swtch->setMaximumHeight(18);
QVBoxLayout * layout = new QVBoxLayout(swtch);
- layout->setContentsMargins(2, 2, 2, 2);
+ layout->setContentsMargins(2, 0, 2, 0);
+ QFont font;
+ font.setPointSize(8);
QLabel * label = new QLabel(swtch);
+ label->setFont(font);
label->setText(RawSwitch(SWITCH_TYPE_VIRTUAL, switchNo+1).toString());
label->setAlignment(Qt::AlignCenter);
+ label->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
labels << label;
layout->addWidget(label);
return swtch;
}
+void SimulatorDialog::setupOutputsDisplay()
+{
+ // setup Outputs tab
+ QWidget * outputsWidget = new QWidget();
+ QGridLayout * gridLayout = new QGridLayout(outputsWidget);
+ gridLayout->setHorizontalSpacing(0);
+ gridLayout->setVerticalSpacing(3);
+ gridLayout->setContentsMargins(5, 3, 5, 3);
+ // logical switches area
+ QWidget * logicalSwitches = new QWidget(outputsWidget);
+ logicalSwitches->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
+ QGridLayout * logicalSwitchesLayout = new QGridLayout(logicalSwitches);
+ logicalSwitchesLayout->setHorizontalSpacing(3);
+ logicalSwitchesLayout->setVerticalSpacing(2);
+ logicalSwitchesLayout->setContentsMargins(0, 0, 0, 0);
+ gridLayout->addWidget(logicalSwitches, 0, 0, 1, 1);
+ // channels area
+ QScrollArea * scrollArea = new QScrollArea(outputsWidget);
+ QSizePolicy sp(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ sp.setHorizontalStretch(0);
+ sp.setVerticalStretch(0);
+ scrollArea->setSizePolicy(sp);
+ scrollArea->setWidgetResizable(true);
+ QWidget * channelsWidget = new QWidget();
+ QGridLayout * channelsLayout = new QGridLayout(channelsWidget);
+ channelsLayout->setHorizontalSpacing(4);
+ channelsLayout->setVerticalSpacing(3);
+ channelsLayout->setContentsMargins(0, 0, 0, 3);
+ scrollArea->setWidget(channelsWidget);
+ gridLayout->addWidget(scrollArea, 1, 0, 1, 1);
+
+ tabWidget->insertTab(1, outputsWidget, QString(tr("Outputs")));
+
+ // populate outputs
+ int outputs = std::min(32, GetCurrentFirmware()->getCapability(Outputs));
+ int column = 0;
+ for (int i=0; isetText(" " + RawSource(SOURCE_TYPE_CH, i).toString() + " ");
+ label->setAlignment(Qt::AlignCenter);
+ label->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+ channelsLayout->addWidget(label, 0, column, 1, 1);
+
+ QSlider * slider = new QSlider(tabWidget);
+ slider->setEnabled(false);
+ slider->setMinimum(-1024);
+ slider->setMaximum(1024);
+ slider->setPageStep(128);
+ slider->setTracking(false);
+ slider->setOrientation(Qt::Vertical);
+ slider->setInvertedAppearance(false);
+ slider->setTickPosition(QSlider::TicksRight);
+ slider->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
+
+ QLabel * value = new QLabel(tabWidget);
+ value->setMinimumSize(QSize(value->fontMetrics().size(Qt::TextSingleLine, "-100.0").width(), 0));
+ value->setAlignment(Qt::AlignCenter);
+ value->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+ channelValues << value;
+ channelsLayout->addWidget(value, 1, column, 1, 1);
+
+ channelSliders << slider;
+ channelsLayout->addWidget(slider, 2, column++, 1, 1);
+ channelsLayout->setAlignment(slider, Qt::AlignHCenter);
+ }
+
+ // populate logical switches
+ int switches = GetCurrentFirmware()->getCapability(LogicalSwitches);
+ int rows = switches / (switches > 16 ? 4 : 2);
+ for (int i=0; iaddWidget(swtch, i / rows, i % rows, 1, 1);
+ }
+}
+
+void SimulatorDialog::setupGVarsDisplay()
+{
+ int fmodes = GetCurrentFirmware()->getCapability(FlightModes);
+ int gvars = GetCurrentFirmware()->getCapability(Gvars);
+ if (gvars>0) {
+ // setup GVars tab
+ QWidget * gvarsWidget = new QWidget();
+ QGridLayout * gvarsLayout = new QGridLayout(gvarsWidget);
+ tabWidget->addTab(gvarsWidget, QString(tr("GVars")));
+
+ for (int fm=0; fmsetText(QString("FM%1").arg(fm));
+ label->setAlignment(Qt::AlignCenter);
+ gvarsLayout->addWidget(label, 0, fm+1);
+ }
+ for (int i=0; isetText(QString("GV%1").arg(i+1));
+ label->setAutoFillBackground(true);
+ if ((i % 2) ==0 ) {
+ label->setStyleSheet("QLabel { background-color: rgb(220, 220, 220) }");
+ }
+ gvarsLayout->addWidget(label, i+1, 0);
+ for (int fm=0; fmsetAutoFillBackground(true);
+ value->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
+ if ((i % 2) ==0 ) {
+ value->setStyleSheet("QLabel { background-color: rgb(220, 220, 220) }");
+ }
+ gvarValues << value;
+ gvarsLayout->addWidget(value, i+1, fm+1);
+ }
+ }
+ }
+}
+
void SimulatorDialog::onButtonPressed(int value)
{
if (value == Qt::Key_Print) {
@@ -533,6 +548,7 @@ void SimulatorDialog::onTimerEvent()
beepVal = 0;
QApplication::beep();
}
+
}
updateDebugOutput();
@@ -540,11 +556,11 @@ void SimulatorDialog::onTimerEvent()
void SimulatorDialog::centerSticks()
{
- if (leftStick->scene())
- nodeLeft->stepToCenter();
+ if (vJoyLeft)
+ vJoyLeft->centerStick();
- if (rightStick->scene())
- nodeRight->stepToCenter();
+ if (vJoyRight)
+ vJoyRight->centerStick();
}
void SimulatorDialog::start(QByteArray & eeprom)
@@ -569,18 +585,32 @@ void SimulatorDialog::start(const char * filename)
void SimulatorDialog::setTrims()
{
+ typedef VirtualJoystickWidget VJW;
+ static Trims lastTrims;
Trims trims;
simulator->getTrims(trims);
- int trimMin = -125, trimMax = +125;
- if (trims.extended) {
- trimMin = -500;
- trimMax = +500;
+ if (trims.values[VJW::TRIM_AXIS_L_X] != lastTrims.values[VJW::TRIM_AXIS_L_X])
+ vJoyLeft->setTrimValue(VJW::TRIM_AXIS_L_X, trims.values[VJW::TRIM_AXIS_L_X]);
+ if (trims.values[VJW::TRIM_AXIS_L_Y] != lastTrims.values[VJW::TRIM_AXIS_L_Y])
+ vJoyLeft->setTrimValue(VJW::TRIM_AXIS_L_Y, trims.values[VJW::TRIM_AXIS_L_Y]);
+ if (trims.values[VJW::TRIM_AXIS_R_Y] != lastTrims.values[VJW::TRIM_AXIS_R_Y])
+ vJoyRight->setTrimValue(VJW::TRIM_AXIS_R_Y, trims.values[VJW::TRIM_AXIS_R_Y]);
+ if (trims.values[VJW::TRIM_AXIS_R_X] != lastTrims.values[VJW::TRIM_AXIS_R_X])
+ vJoyRight->setTrimValue(VJW::TRIM_AXIS_R_X, trims.values[VJW::TRIM_AXIS_R_X]);
+
+ if (trims.extended != lastTrims.extended) {
+ int trimMin = -125, trimMax = +125;
+ if (trims.extended) {
+ trimMin = -500;
+ trimMax = +500;
+ }
+ vJoyLeft->setTrimRange(VJW::TRIM_AXIS_L_X, trimMin, trimMax);
+ vJoyLeft->setTrimRange(VJW::TRIM_AXIS_L_Y, trimMin, trimMax);
+ vJoyRight->setTrimRange(VJW::TRIM_AXIS_R_Y, trimMin, trimMax);
+ vJoyRight->setTrimRange(VJW::TRIM_AXIS_R_X, trimMin, trimMax);
}
- trimHLeft->setRange(trimMin, trimMax); trimHLeft->setValue(trims.values[0]);
- trimVLeft->setRange(trimMin, trimMax); trimVLeft->setValue(trims.values[1]);
- trimVRight->setRange(trimMin, trimMax); trimVRight->setValue(trims.values[2]);
- trimHRight->setRange(trimMin, trimMax); trimHRight->setValue(trims.values[3]);
+ lastTrims = trims;
}
inline int chVal(int val)
@@ -588,26 +618,6 @@ inline int chVal(int val)
return qMin(1024, qMax(-1024, val));
}
-void SimulatorDialog::on_trimHLeft_valueChanged(int value)
-{
- simulator->setTrim(0, value);
-}
-
-void SimulatorDialog::on_trimVLeft_valueChanged(int value)
-{
- simulator->setTrim(1, value);
-}
-
-void SimulatorDialog::on_trimVRight_valueChanged(int value)
-{
- simulator->setTrim(2, value);
-}
-
-void SimulatorDialog::on_trimHRight_valueChanged(int value)
-{
- simulator->setTrim(3, value);
-}
-
void SimulatorDialog::setValues()
{
TxOutputs outputs;
@@ -622,20 +632,11 @@ void SimulatorDialog::setValues()
}
}
- leftXPerc->setText(QString("X %1%").arg((qreal)nodeLeft->getX()*100+trims.values[0]/5, 2, 'f', 0));
- leftYPerc->setText(QString("Y %1%").arg((qreal)nodeLeft->getY()*-100+trims.values[1]/5, 2, 'f', 0));
-
- rightXPerc->setText(QString("X %1%").arg((qreal)nodeRight->getX()*100+trims.values[3]/5, 2, 'f', 0));
- rightYPerc->setText(QString("Y %1%").arg((qreal)nodeRight->getY()*-100+trims.values[2]/5, 2, 'f', 0));
-
QString CSWITCH_ON = "QLabel { background-color: #4CC417 }";
QString CSWITCH_OFF = "QLabel { }";
for (int i=0; igetCapability(LogicalSwitches); i++) {
logicalSwitchLabels[i]->setStyleSheet(outputs.vsw[i] ? CSWITCH_ON : CSWITCH_OFF);
- if (!logicalSwitchLabels2.isEmpty()) {
- logicalSwitchLabels2[i]->setStyleSheet(outputs.vsw[i] ? CSWITCH_ON : CSWITCH_OFF);
- }
}
for (unsigned int gv=0; gvsetItemIndexMethod(QGraphicsScene::NoIndex);
- leftStick->setScene(leftScene);
-
- // leftStick->scene()->addLine(0,10,20,30);
-
- QGraphicsScene *rightScene = new QGraphicsScene(rightStick);
- rightScene->setItemIndexMethod(QGraphicsScene::NoIndex);
- rightStick->setScene(rightScene);
-
- // rightStick->scene()->addLine(0,10,20,30);
-
- nodeLeft = new Node();
- nodeLeft->setPos(-GBALL_SIZE/2,-GBALL_SIZE/2);
- nodeLeft->setBallSize(GBALL_SIZE);
- leftScene->addItem(nodeLeft);
-
- nodeRight = new Node();
- nodeRight->setPos(-GBALL_SIZE/2,-GBALL_SIZE/2);
- nodeRight->setBallSize(GBALL_SIZE);
- rightScene->addItem(nodeRight);
-}
-
-void SimulatorDialog::resizeEvent(QResizeEvent *event)
-{
- if (leftStick->scene()) {
- QRect qr = leftStick->contentsRect();
- qreal w = (qreal)qr.width() - GBALL_SIZE;
- qreal h = (qreal)qr.height() - GBALL_SIZE;
- qreal cx = (qreal)qr.width()/2;
- qreal cy = (qreal)qr.height()/2;
- leftStick->scene()->setSceneRect(-cx,-cy,w,h);
-
- QPointF p = nodeLeft->pos();
- p.setX(qMin(cx, qMax(p.x(), -cx)));
- p.setY(qMin(cy, qMax(p.y(), -cy)));
- nodeLeft->setPos(p);
- }
-
- if (rightStick->scene()) {
- QRect qr = rightStick->contentsRect();
- qreal w = (qreal)qr.width() - GBALL_SIZE;
- qreal h = (qreal)qr.height() - GBALL_SIZE;
- qreal cx = (qreal)qr.width()/2;
- qreal cy = (qreal)qr.height()/2;
- rightStick->scene()->setSceneRect(-cx,-cy,w,h);
-
- QPointF p = nodeRight->pos();
- p.setX(qMin(cx, qMax(p.x(), -cx)));
- p.setY(qMin(cy, qMax(p.y(), -cy)));
- nodeRight->setPos(p);
- }
- QDialog::resizeEvent(event);
-}
-
-void SimulatorDialog::on_holdLeftX_clicked(bool checked)
-{
- nodeLeft->setCenteringX(!checked);
-}
-
-void SimulatorDialog::on_holdLeftY_clicked(bool checked)
-{
- nodeLeft->setCenteringY(!checked);
-}
-
-void SimulatorDialog::on_holdRightX_clicked(bool checked)
-{
- nodeRight->setCenteringX(!checked);
-}
-
-void SimulatorDialog::on_holdRightY_clicked(bool checked)
-{
- nodeRight->setCenteringY(!checked);
-}
-
-void SimulatorDialog::on_FixLeftX_clicked(bool checked)
-{
- nodeLeft->setFixedX(checked);
-}
-
-void SimulatorDialog::on_FixLeftY_clicked(bool checked)
-{
- nodeLeft->setFixedY(checked);
-}
-
-void SimulatorDialog::on_FixRightX_clicked(bool checked)
-{
- nodeRight->setFixedX(checked);
-}
-
-void SimulatorDialog::on_FixRightY_clicked(bool checked)
-{
- nodeRight->setFixedY(checked);
-}
-
#ifdef JOYSTICKS
void SimulatorDialog::onjoystickAxisValueChanged(int axis, int value)
{
@@ -764,19 +668,19 @@ void SimulatorDialog::onjoystickAxisValueChanged(int axis, int value)
stickval=(1024*(value-jscal[axis][1]))/(jscal[axis][1]-jscal[axis][0]);
}
if (jscal[axis][3]==1) {
- stickval*=-1;
+ stickval*=-1;
}
if (stick==1 ) {
- nodeRight->setY(-stickval/1024.0);
+ vJoyRight->setStickY(-stickval/1024.0);
}
else if (stick==2) {
- nodeRight->setX(stickval/1024.0);
+ vJoyRight->setStickX(stickval/1024.0);
}
else if (stick==3) {
- nodeLeft->setY(-stickval/1024.0);
+ vJoyLeft->setStickY(-stickval/1024.0);
}
else if (stick==4) {
- nodeLeft->setX(stickval/1024.0);
+ vJoyLeft->setStickX(stickval/1024.0);
}
else if (stick >= 5 && stick < 5+pots.count()) {
pots[stick-5]->setValue(stickval);
diff --git a/companion/src/simulation/simulatordialog.h b/companion/src/simulation/simulatordialog.h
index 60c5657e1..74cba69ed 100644
--- a/companion/src/simulation/simulatordialog.h
+++ b/companion/src/simulation/simulatordialog.h
@@ -47,6 +47,7 @@ namespace Ui {
// TODO rename + move?
class LcdWidget;
class SliderWidget;
+class VirtualJoystickWidget;
#define SIMULATOR_FLAGS_NOTX 1
#define SIMULATOR_FLAGS_STICK_MODE_LEFT 2
@@ -73,6 +74,7 @@ class SimulatorDialog : public QDialog
void start(QByteArray & eeprom);
virtual void traceCallback(const char * text);
+
protected:
template void initUi(T * ui);
virtual void setLightOn(bool enable) { }
@@ -80,24 +82,19 @@ class SimulatorDialog : public QDialog
unsigned int flags;
LcdWidget * lcd;
- QGraphicsView * leftStick, * rightStick;
QVector pots;
QVector potLabels;
QVector potValues;
QVector sliders;
-
- SliderWidget * trimHLeft, * trimVLeft, * trimHRight, * trimVRight;
- QLabel * leftXPerc, * rightXPerc, * leftYPerc, * rightYPerc;
QTabWidget * tabWidget;
QVector logicalSwitchLabels;
- QVector logicalSwitchLabels2;
QVector channelSliders;
QVector channelValues;
QVector gvarValues;
void init();
- Node *nodeLeft;
- Node *nodeRight;
+ VirtualJoystickWidget *vJoyLeft;
+ VirtualJoystickWidget *vJoyRight;
QTimer *timer;
QString windowName;
unsigned int backLight;
@@ -114,18 +111,18 @@ class SimulatorDialog : public QDialog
SimulatorInterface *simulator;
unsigned int lastPhase;
- void setupSticks();
void setupTimer();
- void resizeEvent(QResizeEvent *event = 0);
+ QFrame * createLogicalSwitch(QWidget * parent, int switchNo, QVector & labels);
+ void setupOutputsDisplay();
+ void setupGVarsDisplay();
- virtual void getValues() = 0;
- void setValues();
void centerSticks();
+ void setTrims();
+ void setValues();
+ virtual void getValues() = 0;
int getValue(qint8 i);
bool getSwitch(int swtch, bool nc, qint8 level=0);
- void setTrims();
- QFrame * createLogicalSwitch(QWidget * parent, int switchNo, QVector & labels);
int beepVal;
@@ -141,8 +138,8 @@ class SimulatorDialog : public QDialog
QList traceList;
void updateDebugOutput();
- protected:
virtual void closeEvent(QCloseEvent *);
+ virtual void showEvent(QShowEvent *event);
virtual void mousePressEvent(QMouseEvent *);
virtual void mouseReleaseEvent(QMouseEvent *);
virtual void wheelEvent(QWheelEvent *);
@@ -155,21 +152,10 @@ class SimulatorDialog : public QDialog
private slots:
void onButtonPressed(int value);
- void on_FixRightY_clicked(bool checked);
- void on_FixRightX_clicked(bool checked);
- void on_FixLeftY_clicked(bool checked);
- void on_FixLeftX_clicked(bool checked);
- void on_holdRightY_clicked(bool checked);
- void on_holdRightX_clicked(bool checked);
- void on_holdLeftY_clicked(bool checked);
- void on_holdLeftX_clicked(bool checked);
- void on_trimHLeft_valueChanged(int);
- void on_trimVLeft_valueChanged(int);
- void on_trimHRight_valueChanged(int);
- void on_trimVRight_valueChanged(int);
void onTimerEvent();
- void onTrimPressed();
+ void onTrimPressed(int which);
void onTrimReleased();
+ void onTrimSliderMoved(int which, int value);
void openTelemetrySimulator();
void openTrainerSimulator();
void openDebugOutput();
diff --git a/companion/src/simulation/simulatordialog9x.cpp b/companion/src/simulation/simulatordialog9x.cpp
index 8d9a69140..db4278c69 100644
--- a/companion/src/simulation/simulatordialog9x.cpp
+++ b/companion/src/simulation/simulatordialog9x.cpp
@@ -75,36 +75,12 @@ SimulatorDialog9X::SimulatorDialog9X(QWidget * parent, SimulatorInterface *simul
if (g.simuSW())
restoreSwitches();
- ui->trimHR_L->setText(QString::fromUtf8(ARROW_LEFT));
- ui->trimHR_R->setText(QString::fromUtf8(ARROW_RIGHT));
- ui->trimVR_U->setText(QString::fromUtf8(ARROW_UP));
- ui->trimVR_D->setText(QString::fromUtf8(ARROW_DOWN));
- ui->trimHL_L->setText(QString::fromUtf8(ARROW_LEFT));
- ui->trimHL_R->setText(QString::fromUtf8(ARROW_RIGHT));
- ui->trimVL_U->setText(QString::fromUtf8(ARROW_UP));
- ui->trimVL_D->setText(QString::fromUtf8(ARROW_DOWN));
for (int i=0; isetProperty("index", i);
connect(pots[i], SIGNAL(valueChanged(int)), this, SLOT(dialChanged(int)));
}
connect(ui->leftbuttons, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
connect(ui->rightbuttons, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
- connect(ui->trimHR_L, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHR_R, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVR_U, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVR_D, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHL_R, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHL_L, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVL_U, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVL_D, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHR_L, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimHR_R, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVR_U, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVR_D, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimHL_R, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimHL_L, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVL_U, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVL_D, SIGNAL(released()), this, SLOT(onTrimReleased()));
}
SimulatorDialog9X::~SimulatorDialog9X()
@@ -154,10 +130,10 @@ void SimulatorDialog9X::getValues()
{
TxInputs inputs = {
{
- int(1024*nodeLeft->getX()), // LEFT HORZ
- int(-1024*nodeLeft->getY()), // LEFT VERT
- int(-1024*nodeRight->getY()), // RGHT VERT
- int(1024*nodeRight->getX()) // RGHT HORZ
+ int(1024 * vJoyLeft->getStickX()), // LEFT HORZ
+ int(-1024 * vJoyLeft->getStickY()), // LEFT VERT
+ int(-1024 * vJoyRight->getStickY()), // RGHT VERT
+ int(1024 * vJoyRight->getStickX()) // RGHT HORZ
},
{
diff --git a/companion/src/simulation/simulatordialogflamenco.cpp b/companion/src/simulation/simulatordialogflamenco.cpp
index a52406eab..58d23b8b2 100644
--- a/companion/src/simulation/simulatordialogflamenco.cpp
+++ b/companion/src/simulation/simulatordialogflamenco.cpp
@@ -45,33 +45,8 @@ SimulatorDialogFlamenco::SimulatorDialogFlamenco(QWidget * parent, SimulatorInte
if (g.simuSW())
restoreSwitches();
- ui->trimHR_L->setText(QString::fromUtf8(ARROW_LEFT));
- ui->trimHR_R->setText(QString::fromUtf8(ARROW_RIGHT));
- ui->trimVR_U->setText(QString::fromUtf8(ARROW_UP));
- ui->trimVR_D->setText(QString::fromUtf8(ARROW_DOWN));
- ui->trimHL_L->setText(QString::fromUtf8(ARROW_LEFT));
- ui->trimHL_R->setText(QString::fromUtf8(ARROW_RIGHT));
- ui->trimVL_U->setText(QString::fromUtf8(ARROW_UP));
- ui->trimVL_D->setText(QString::fromUtf8(ARROW_DOWN));
-
connect(ui->leftbuttons, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
connect(ui->rightbuttons, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
- connect(ui->trimHR_L, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHR_R, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVR_U, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVR_D, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHL_R, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHL_L, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVL_U, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVL_D, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHR_L, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimHR_R, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVR_U, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVR_D, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimHL_R, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimHL_L, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVL_U, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVL_D, SIGNAL(released()), this, SLOT(onTrimReleased()));
}
SimulatorDialogFlamenco::~SimulatorDialogFlamenco()
@@ -94,10 +69,10 @@ void SimulatorDialogFlamenco::getValues()
{
TxInputs inputs = {
{
- int(1024*nodeLeft->getX()), // LEFT HORZ
- int(-1024*nodeLeft->getY()), // LEFT VERT
- int(-1024*nodeRight->getY()), // RGHT VERT
- int(1024*nodeRight->getX()) // RGHT HORZ
+ int(1024 * vJoyLeft->getStickX()), // LEFT HORZ
+ int(-1024 * vJoyLeft->getStickY()), // LEFT VERT
+ int(-1024 * vJoyRight->getStickY()), // RGHT VERT
+ int(1024 * vJoyRight->getStickX()) // RGHT HORZ
},
{
diff --git a/companion/src/simulation/simulatordialoghorus.cpp b/companion/src/simulation/simulatordialoghorus.cpp
index b8b2245a6..f2f16bc33 100644
--- a/companion/src/simulation/simulatordialoghorus.cpp
+++ b/companion/src/simulation/simulatordialoghorus.cpp
@@ -63,33 +63,8 @@ SimulatorDialogHorus::SimulatorDialogHorus(QWidget * parent, SimulatorInterface
if (g.simuSW())
restoreSwitches();
- ui->trimHR_L->setText(QString::fromUtf8(ARROW_LEFT));
- ui->trimHR_R->setText(QString::fromUtf8(ARROW_RIGHT));
- ui->trimVR_U->setText(QString::fromUtf8(ARROW_UP));
- ui->trimVR_D->setText(QString::fromUtf8(ARROW_DOWN));
- ui->trimHL_L->setText(QString::fromUtf8(ARROW_LEFT));
- ui->trimHL_R->setText(QString::fromUtf8(ARROW_RIGHT));
- ui->trimVL_U->setText(QString::fromUtf8(ARROW_UP));
- ui->trimVL_D->setText(QString::fromUtf8(ARROW_DOWN));
-
connect(ui->leftbuttons, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
connect(ui->rightbuttons, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
- connect(ui->trimHR_L, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHR_R, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVR_U, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVR_D, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHL_R, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHL_L, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVL_U, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVL_D, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHR_L, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimHR_R, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVR_U, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVR_D, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimHL_R, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimHL_L, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVL_U, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVL_D, SIGNAL(released()), this, SLOT(onTrimReleased()));
connect(ui->teleSim, SIGNAL(released()), this, SLOT(openTelemetrySimulator()));
connect(ui->trainerSim, SIGNAL(released()), this, SLOT(openTrainerSimulator()));
connect(ui->debugConsole, SIGNAL(released()), this, SLOT(openDebugOutput()));
@@ -116,10 +91,10 @@ void SimulatorDialogHorus::getValues()
{
TxInputs inputs = {
{
- int(1024*nodeLeft->getX()), // LEFT HORZ
- int(-1024*nodeLeft->getY()), // LEFT VERT
- int(-1024*nodeRight->getY()), // RGHT VERT
- int(1024*nodeRight->getX()) // RGHT HORZ
+ int(1024 * vJoyLeft->getStickX()), // LEFT HORZ
+ int(-1024 * vJoyLeft->getStickY()), // LEFT VERT
+ int(-1024 * vJoyRight->getStickY()), // RGHT VERT
+ int(1024 * vJoyRight->getStickX()) // RGHT HORZ
},
{
diff --git a/companion/src/simulation/simulatordialogtaranis.cpp b/companion/src/simulation/simulatordialogtaranis.cpp
index d52880f82..04cc4f12e 100644
--- a/companion/src/simulation/simulatordialogtaranis.cpp
+++ b/companion/src/simulation/simulatordialogtaranis.cpp
@@ -70,33 +70,8 @@ SimulatorDialogTaranis::SimulatorDialogTaranis(QWidget * parent, SimulatorInterf
}
}
- ui->trimHR_L->setText(QString::fromUtf8(ARROW_LEFT));
- ui->trimHR_R->setText(QString::fromUtf8(ARROW_RIGHT));
- ui->trimVR_U->setText(QString::fromUtf8(ARROW_UP));
- ui->trimVR_D->setText(QString::fromUtf8(ARROW_DOWN));
- ui->trimHL_L->setText(QString::fromUtf8(ARROW_LEFT));
- ui->trimHL_R->setText(QString::fromUtf8(ARROW_RIGHT));
- ui->trimVL_U->setText(QString::fromUtf8(ARROW_UP));
- ui->trimVL_D->setText(QString::fromUtf8(ARROW_DOWN));
-
connect(ui->leftbuttons, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
connect(ui->rightbuttons, SIGNAL(buttonPressed(int)), this, SLOT(onButtonPressed(int)));
- connect(ui->trimHR_L, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHR_R, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVR_U, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVR_D, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHL_R, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHL_L, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVL_U, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimVL_D, SIGNAL(pressed()), this, SLOT(onTrimPressed()));
- connect(ui->trimHR_L, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimHR_R, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVR_U, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVR_D, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimHL_R, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimHL_L, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVL_U, SIGNAL(released()), this, SLOT(onTrimReleased()));
- connect(ui->trimVL_D, SIGNAL(released()), this, SLOT(onTrimReleased()));
connect(ui->teleSim, SIGNAL(released()), this, SLOT(openTelemetrySimulator()));
connect(ui->trainerSim, SIGNAL(released()), this, SLOT(openTrainerSimulator()));
connect(ui->debugConsole, SIGNAL(released()), this, SLOT(openDebugOutput()));
@@ -131,10 +106,10 @@ void SimulatorDialogTaranis::getValues()
TxInputs inputs = {
{
- int(1024*nodeLeft->getX()), // LEFT HORZ
- int(-1024*nodeLeft->getY()), // LEFT VERT
- int(-1024*nodeRight->getY()), // RGHT VERT
- int(1024*nodeRight->getX()) // RGHT HORZ
+ int(1024 * vJoyLeft->getStickX()), // LEFT HORZ
+ int(-1024 * vJoyLeft->getStickY()), // LEFT VERT
+ int(-1024 * vJoyRight->getStickY()), // RGHT VERT
+ int(1024 * vJoyRight->getStickX()) // RGHT HORZ
},
{
diff --git a/companion/src/simulation/sliderwidget.h b/companion/src/simulation/sliderwidget.h
index a44af43e0..3c4c1c2f5 100644
--- a/companion/src/simulation/sliderwidget.h
+++ b/companion/src/simulation/sliderwidget.h
@@ -31,7 +31,7 @@ class SliderWidget : public QSlider
public:
- explicit SliderWidget(QFrame * parent = 0):
+ explicit SliderWidget(QWidget * parent = 0):
QSlider(parent)
{
}
diff --git a/companion/src/simulation/virtualjoystickwidget.cpp b/companion/src/simulation/virtualjoystickwidget.cpp
new file mode 100644
index 000000000..6b9205b27
--- /dev/null
+++ b/companion/src/simulation/virtualjoystickwidget.cpp
@@ -0,0 +1,496 @@
+/*
+ * Copyright (C) OpenTX
+ *
+ * Based on code named
+ * th9x - http://code.google.com/p/th9x
+ * er9x - http://code.google.com/p/er9x
+ * gruvin9x - http://code.google.com/p/gruvin9x
+ *
+ * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include "virtualjoystickwidget.h"
+#include "../constants.h"
+#include "sliderwidget.h"
+#include "modeledit/node.h"
+#include "helpers.h"
+
+VirtualJoystickWidget::VirtualJoystickWidget(QWidget *parent, QChar side, bool showTrims, bool showBtns, bool showValues, QSize size) :
+ QWidget(parent),
+ stickSide(side),
+ prefSize(size),
+ hTrimSlider(NULL),
+ vTrimSlider(NULL),
+ btnHoldX(NULL),
+ btnHoldY(NULL),
+ btnFixX(NULL),
+ btnFixY(NULL),
+ nodeLabelX(NULL),
+ nodeLabelY(NULL)
+{
+ ar = (float)size.width() / size.height();
+ extraSize = QSize(0, 0);
+
+ // 5 col x 4 rows
+ layout = new QGridLayout(this);
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->setSpacing(0);
+
+ QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ setSizePolicy(sizePolicy);
+
+ gv = new QGraphicsView(this);
+ gv->setSizePolicy(sizePolicy);
+ gv->setMinimumSize(QSize(150, 150));
+ gv->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ gv->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+
+ scene = new QGraphicsScene(gv);
+ scene->setItemIndexMethod(QGraphicsScene::NoIndex);
+ gv->setScene(scene);
+
+ node = new Node();
+ node->setPos(-GBALL_SIZE / 2, -GBALL_SIZE / 2);
+ node->setBallSize(GBALL_SIZE);
+ scene->addItem(node);
+
+ int colvt, colbb, colvx, colvy;
+ if (stickSide == 'L') {
+ colvt = 3;
+ colbb = 1;
+ colvx = 1;
+ colvy = 3;
+ }
+ else {
+ colvt = 1;
+ colbb = 3;
+ colvx = 3;
+ colvy = 1;
+ }
+
+ if (showTrims) {
+ QWidget * hTrimWidget = createTrimWidget('H');
+ QWidget * vTrimWidget = createTrimWidget('V');
+
+ layout->addWidget(vTrimWidget, 1, colvt, 1, 1);
+ layout->addWidget(hTrimWidget, 2, 2, 1, 1);
+
+ hTrimSlider = hTrimWidget->findChild();
+ vTrimSlider = vTrimWidget->findChild();
+ extraSize += QSize(vTrimWidget->sizeHint().width(), hTrimWidget->sizeHint().height());
+ }
+
+ if (showBtns) {
+ QVBoxLayout * btnbox = new QVBoxLayout();
+ btnbox->setContentsMargins(9, 9, 9, 9);
+ btnbox->setSpacing(2);
+ btnbox->addWidget(btnHoldY = createButtonWidget(HOLD_Y));
+ btnbox->addWidget(btnFixY = createButtonWidget(FIX_Y));
+ btnbox->addWidget(btnFixX = createButtonWidget(FIX_X));
+ btnbox->addWidget(btnHoldX = createButtonWidget(HOLD_X));
+
+ layout->addLayout(btnbox, 1, colbb, 1, 1);
+
+ extraSize.setWidth(extraSize.width() + btnbox->sizeHint().width());
+ }
+
+ if (showValues) {
+ QLayout * valX = createNodeValueLayout('X', nodeLabelX);
+ QLayout * valY = createNodeValueLayout('Y', nodeLabelY);
+ layout->addLayout(valX, 2, colvx, 1, 1);
+ layout->addLayout(valY, 2, colvy, 1, 1);
+ }
+
+ layout->addItem(new QSpacerItem(0, 0), 0, 0, 1, 5); // r0 c0-4: top v spacer
+ layout->addItem(new QSpacerItem(0, 0), 1, 0, 2, 1); // r1-2 c0: left h spacer
+ layout->addWidget(gv, 1, 2, 1, 1); // r1 c2: stick widget
+ layout->addItem(new QSpacerItem(0, 0), 1, 4, 2, 1); // r1-2 c4: right h spacer
+ layout->addItem(new QSpacerItem(0, 0), 3, 0, 1, 5); // r3 c0-4: bot v spacer
+
+ connect(node, SIGNAL(xChanged()), this, SLOT(updateNodeValueLabels()));
+ connect(node, SIGNAL(yChanged()), this, SLOT(updateNodeValueLabels()));
+
+ setSize(prefSize);
+}
+
+void VirtualJoystickWidget::setStickX(qreal x)
+{
+ node->setX(x);
+}
+
+void VirtualJoystickWidget::setStickY(qreal y)
+{
+ node->setY(y);
+}
+
+void VirtualJoystickWidget::setStickPos(QPointF xy)
+{
+ node->setPos(xy);
+}
+
+void VirtualJoystickWidget::centerStick()
+{
+ node->stepToCenter();
+}
+
+qreal VirtualJoystickWidget::getStickX()
+{
+ return node->getX();
+}
+
+qreal VirtualJoystickWidget::getStickY()
+{
+ return node->getY();
+}
+
+QPointF VirtualJoystickWidget::getStickPos()
+{
+ return QPointF(node->getX(), node->getY());
+}
+
+void VirtualJoystickWidget::setTrimValue(int which, int value)
+{
+ SliderWidget * slider = getTrimSlider(which);
+ if (slider) {
+ slider->setValue(value);
+ }
+}
+
+void VirtualJoystickWidget::setTrimRange(int which, int min, int max)
+{
+ SliderWidget * slider = getTrimSlider(which);
+ if (slider) {
+ slider->setRange(min, max);
+ }
+}
+
+int VirtualJoystickWidget::getTrimValue(int which)
+{
+ SliderWidget * slider = getTrimSlider(which);
+ if (slider) {
+ return slider->value();
+ }
+ return 0;
+}
+
+void VirtualJoystickWidget::setStickConstraint(int which, bool active)
+{
+ if (btnHoldX == NULL)
+ return; // no buttons
+
+ switch (which) {
+ case HOLD_X:
+ btnHoldX->setChecked(active);
+ break;
+ case HOLD_Y:
+ btnHoldY->setChecked(active);
+ break;
+ case FIX_X:
+ btnFixX->setChecked(active);
+ break;
+ case FIX_Y:
+ btnFixY->setChecked(active);
+ break;
+ default:
+ break;
+ }
+}
+
+void VirtualJoystickWidget::setSize(QSize size)
+{
+ float thisAspectRatio = (float)size.width() / size.height();
+ float newGvSz, spacerSz;
+ bool sized = false;
+
+ if (thisAspectRatio > ar) {
+ // constrain width
+ newGvSz = (height() - extraSize.height()) * ar; // new width
+ spacerSz = (width() - newGvSz - extraSize.width()) / 2; // + 0.5;
+ if (spacerSz >= 0.0f) {
+ layout->setRowStretch(0, 0);
+ layout->setColumnStretch(0, spacerSz);
+ layout->setColumnStretch(4, spacerSz);
+ layout->setRowStretch(3, 0);
+ sized = true;
+ }
+ }
+ if (!sized) {
+ // constrain height
+ newGvSz = (width() - extraSize.width()) * ar; // new height
+ spacerSz = (height() - newGvSz - extraSize.height()) / 2; // + 0.5;
+ spacerSz = qMax(spacerSz, 0.0f);
+ layout->setRowStretch(0, spacerSz);
+ layout->setColumnStretch(0, 0);
+ layout->setColumnStretch(4, 0);
+ layout->setRowStretch(3, spacerSz);
+ }
+
+ layout->setColumnStretch(2, newGvSz);
+ layout->setRowStretch(1, newGvSz);
+
+ prefSize = QSize(newGvSz + extraSize.width(), newGvSz + extraSize.height());
+ gv->resize(newGvSz, newGvSz);
+ gv->updateGeometry();
+ repositionNode();
+ //qDebug() << thisAspectRatio << size << newGvSz << spacerSz << extraSize << gv->geometry() << gv->contentsRect() << gv->frameRect() << getStickPos();
+}
+
+void VirtualJoystickWidget::repositionNode()
+{
+ QRect qr = gv->contentsRect();
+ qreal w = (qreal)qr.width() - GBALL_SIZE;
+ qreal h = (qreal)qr.height() - GBALL_SIZE;
+ qreal cx = (qreal)qr.width()/2;
+ qreal cy = (qreal)qr.height()/2;
+ scene->setSceneRect(-cx,-cy,w,h);
+
+ QPointF p = node->pos();
+ p.setX(qMin(cx, qMax(p.x(), -cx)));
+ p.setY(qMin(cy, qMax(p.y(), -cy)));
+ node->setPos(p);
+
+ updateNodeValueLabels();
+}
+
+QWidget *VirtualJoystickWidget::createTrimWidget(QChar type)
+{
+ QSizePolicy sp;
+ QString btnAlabel, btnBlabel;
+
+ QString btnAname = QString("%1TrimBtnA_%2").arg(type.toLower()).arg(stickSide);
+ QString btnBname = QString("%1TrimBtnB_%2").arg(type.toLower()).arg(stickSide);
+ QString sliderName = QString("%1TrimAdj_%2").arg(type.toLower()).arg(stickSide);
+
+ QWidget * trimWidget = new QWidget(this);
+ QBoxLayout * trimLayout = new QVBoxLayout(trimWidget);
+ SliderWidget * trimSlider = new SliderWidget(trimWidget);
+ QPushButton * trimBtnA = new QPushButton(trimWidget);
+ QPushButton * trimBtnB = new QPushButton(trimWidget);
+
+ if (type == 'H') {
+ sp = QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+ trimLayout->setDirection(QBoxLayout::LeftToRight);
+ trimSlider->setFixedHeight(23);
+ trimSlider->setOrientation(Qt::Horizontal);
+ trimBtnA->setText(ARROW_LEFT);
+ trimBtnB->setText(ARROW_RIGHT);
+ }
+ else {
+ sp = QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
+ trimLayout->setDirection(QBoxLayout::TopToBottom);
+ trimSlider->setFixedWidth(23);
+ trimSlider->setOrientation(Qt::Vertical);
+ trimBtnA->setText(ARROW_UP);
+ trimBtnB->setText(ARROW_DOWN);
+ }
+
+ trimWidget->setSizePolicy(sp);
+
+ trimSlider->setObjectName(sliderName);
+ trimSlider->setProperty("trimType", getTrimSliderType(type));
+ trimSlider->setSizePolicy(sp);
+ trimSlider->setMinimum(-125);
+ trimSlider->setMaximum(125);
+
+ trimBtnA->setObjectName(btnAname);
+ trimBtnA->setProperty("btnType", getTrimButtonType(type, 0));
+ trimBtnA->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+ trimBtnA->setMaximumSize(QSize(23, 23));
+ trimBtnA->setAutoDefault(false);
+
+ trimBtnB->setObjectName(btnBname);
+ trimBtnB->setProperty("btnType", getTrimButtonType(type, 1));
+ trimBtnB->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+ trimBtnB->setMaximumSize(QSize(23, 23));
+ trimBtnB->setAutoDefault(false);
+
+ trimLayout->setSpacing(6);
+ trimLayout->setContentsMargins(8, 9, 8, 9);
+ trimLayout->addWidget(trimBtnA);
+ trimLayout->addWidget(trimSlider);
+ trimLayout->addWidget(trimBtnB);
+
+ connect(trimBtnA, SIGNAL(pressed()), SLOT(onTrimPressed()));
+ connect(trimBtnB, SIGNAL(pressed()), SLOT(onTrimPressed()));
+ connect(trimBtnA, SIGNAL(released()), SIGNAL(trimButtonReleased()));
+ connect(trimBtnB, SIGNAL(released()), SIGNAL(trimButtonReleased()));
+ connect(trimSlider, SIGNAL(valueChanged(int)), SLOT(onSliderChange(int)));
+
+ return trimWidget;
+}
+
+QPushButton * VirtualJoystickWidget::createButtonWidget(int type)
+{
+ QString btnRole, btnLabel;
+ switch (type) {
+ case HOLD_Y:
+ btnLabel = tr("Hold Y");
+ break;
+ case FIX_Y:
+ btnLabel = tr("Fix Y");
+ break;
+ case FIX_X:
+ btnLabel = tr("Fix X");
+ break;
+ case HOLD_X:
+ default:
+ btnLabel = tr("Hold X");
+ break;
+ }
+ QPushButton * btn = new QPushButton(this);
+ btn->setObjectName(QString("%1_%2").arg(btnLabel.replace(" ", "_")).arg(stickSide));
+ btn->setProperty("btnType", type);
+ btn->setText(btnLabel);
+ QFont font;
+ font.setPointSize(8);
+ btn->setFont(font);
+ btn->setStyleSheet(QLatin1String( \
+ "QPushButton {"
+ " background-color: #EEEEEE;"
+ " border-style: outset;"
+ " border-width: 1px;"
+ " border-radius: 4px;"
+ " border-color: black;"
+ " padding: 2px;"
+ "}"
+ "QPushButton:checked {\n"
+ " background-color: #4CC417;\n"
+ " border-style: inset;\n"
+ "}" ));
+ btn->setCheckable(true);
+
+ connect(btn, SIGNAL(toggled(bool)), SLOT(onButtonChange(bool)));
+
+ return btn;
+}
+
+QLayout *VirtualJoystickWidget::createNodeValueLayout(QChar type, QLabel *& valLabel)
+{
+ QLabel * lbl = new QLabel(QString("%1 %").arg(type), this);
+ lbl->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+ lbl->setAlignment(Qt::AlignCenter);
+ QLabel * val = new QLabel("0");
+ val->setObjectName(QString("val_%1").arg(type));
+ val->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+ val->setAlignment(Qt::AlignCenter);
+ QVBoxLayout * layout = new QVBoxLayout();
+ layout->setContentsMargins(2, 2, 2, 2);
+ layout->setSpacing(2);
+ layout->addWidget(lbl);
+ layout->addWidget(val);
+
+ valLabel = val;
+ return layout;
+}
+
+int VirtualJoystickWidget::getTrimSliderType(QChar type)
+{
+ if (stickSide == 'L') {
+ if (type == 'H')
+ return TRIM_AXIS_L_X;
+ else
+ return TRIM_AXIS_L_Y;
+ }
+ else {
+ if (type == 'H')
+ return TRIM_AXIS_R_X;
+ else
+ return TRIM_AXIS_R_Y;
+ }
+}
+
+int VirtualJoystickWidget::getTrimButtonType(QChar type, int pos)
+{
+ if (stickSide == 'L') {
+ if (type == 'H') {
+ if (pos == 0)
+ return TRIM_LH_L;
+ else
+ return TRIM_LH_R;
+ }
+ else {
+ if (pos == 0)
+ return TRIM_LV_UP;
+ else
+ return TRIM_LV_DN;
+ }
+ }
+ // right side
+ else {
+ if (type == 'H') {
+ if (pos == 0)
+ return TRIM_RH_L;
+ else
+ return TRIM_RH_R;
+ }
+ else {
+ if (pos == 0)
+ return TRIM_RV_UP;
+ else
+ return TRIM_RV_DN;
+ }
+ }
+}
+
+SliderWidget *VirtualJoystickWidget::getTrimSlider(int which)
+{
+ if (which == TRIM_AXIS_L_X || which == TRIM_AXIS_R_X)
+ return hTrimSlider;
+ else
+ return vTrimSlider;
+}
+
+void VirtualJoystickWidget::onTrimPressed()
+{
+ if (!sender() || !sender()->property("btnType").isValid())
+ return;
+
+ emit trimButtonPressed(sender()->property("btnType").toInt());
+}
+
+void VirtualJoystickWidget::onSliderChange(int value)
+{
+ if (!sender() || !sender()->property("trimType").isValid())
+ return;
+
+ emit trimSliderMoved(sender()->property("trimType").toInt(), value);
+ updateNodeValueLabels();
+}
+
+void VirtualJoystickWidget::onButtonChange(bool checked)
+{
+ if (!sender() || !sender()->property("btnType").isValid())
+ return;
+
+ switch (sender()->property("btnType").toInt()) {
+ case HOLD_Y:
+ node->setCenteringY(!checked);
+ break;
+ case FIX_Y:
+ node->setFixedY(checked);
+ break;
+ case FIX_X:
+ node->setFixedX(checked);
+ break;
+ case HOLD_X:
+ node->setCenteringX(!checked);
+ break;
+ }
+}
+
+void VirtualJoystickWidget::updateNodeValueLabels()
+{
+ if (nodeLabelX)
+ nodeLabelX->setText(QString("%1").arg((qreal)node->getX() * 100 + getTrimValue(0) / 5, 2, 'f', 0));
+ if (nodeLabelY)
+ nodeLabelY->setText(QString("%1").arg((qreal)node->getY() * -100 + getTrimValue(1) / 5, 2, 'f', 0));
+}
diff --git a/companion/src/simulation/virtualjoystickwidget.h b/companion/src/simulation/virtualjoystickwidget.h
new file mode 100644
index 000000000..4bbf1ba93
--- /dev/null
+++ b/companion/src/simulation/virtualjoystickwidget.h
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) OpenTX
+ *
+ * Based on code named
+ * th9x - http://code.google.com/p/th9x
+ * er9x - http://code.google.com/p/er9x
+ * gruvin9x - http://code.google.com/p/gruvin9x
+ *
+ * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef VIRTUALJOYSTICKWIDGET_H
+#define VIRTUALJOYSTICKWIDGET_H
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+class Node;
+class SliderWidget;
+
+#define GBALL_SIZE 20
+#define RESX 1024
+
+class VirtualJoystickWidget : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ enum TrimAxes {
+ TRIM_AXIS_L_X = 0,
+ TRIM_AXIS_L_Y,
+ TRIM_AXIS_R_Y,
+ TRIM_AXIS_R_X,
+ };
+
+ enum ConstraintTypes {
+ HOLD_X = 0,
+ HOLD_Y,
+ FIX_X,
+ FIX_Y
+ };
+
+ explicit VirtualJoystickWidget(QWidget * parent = NULL, QChar side = 'L', bool showTrims = true, bool showBtns = true, bool showValues = true, QSize size = QSize(245, 245));
+
+ void setStickX(qreal x);
+ void setStickY(qreal y);
+ void setStickPos(QPointF xy);
+ void centerStick();
+ qreal getStickX();
+ qreal getStickY();
+ QPointF getStickPos();
+
+ void setTrimValue(int which, int value);
+ void setTrimRange(int which, int min, int max);
+ int getTrimValue(int which);
+
+ void setStickConstraint(int which, bool active);
+
+ virtual QSize sizeHint() const
+ {
+ return prefSize;
+ }
+
+ virtual void resizeEvent(QResizeEvent *event)
+ {
+ QWidget::resizeEvent(event);
+ setSize(event->size());
+ }
+
+ signals:
+ void trimButtonPressed(int which);
+ void trimButtonReleased();
+ void trimSliderMoved(int which, int value);
+
+ protected slots:
+ void onTrimPressed();
+ void onSliderChange(int value);
+ void onButtonChange(bool checked);
+ void updateNodeValueLabels();
+
+ protected:
+ void setSize(QSize size);
+ void repositionNode();
+ QWidget * createTrimWidget(QChar type);
+ QPushButton * createButtonWidget(int type);
+ QLayout * createNodeValueLayout(QChar type, QLabel *& valLabel);
+ int getTrimSliderType(QChar type);
+ int getTrimButtonType(QChar type, int pos);
+ SliderWidget * getTrimSlider(int which);
+
+ QChar stickSide;
+ QSize prefSize;
+ QGridLayout * layout;
+ QGraphicsView * gv;
+ QGraphicsScene * scene;
+ Node * node;
+ SliderWidget * hTrimSlider, * vTrimSlider;
+ QPushButton * btnHoldX, * btnHoldY;
+ QPushButton * btnFixX, * btnFixY;
+ QLabel * nodeLabelX, * nodeLabelY;
+ QSize extraSize;
+ float ar; // aspect ratio
+
+};
+
+#endif // VIRTUALJOYSTICKWIDGET_H