mirror of
https://github.com/EdgeTX/edgetx.git
synced 2025-07-26 09:45:16 +03:00
Reduce width of all simulator windows (#4154)
* [simu] Reduce width of all simulator windows and also height of Horus window. (https://github.com/opentx/opentx/issues/3135) * [simu] New vertical channel outputs layout for all simulators, all outputs in one window and horizontally scrollable. Consolidate outputs and gvars widgets to one code base for all sims. Make simulator dialog re-sizable. * [simu] Make simulation dialog resizable, and greatly reduce minimum size requirements of all simulators. Introduces new VirtualJoystickWidget class with all controls. Simplifies every simulator dialog UI form.
This commit is contained in:
parent
df835da07d
commit
b0de35f57d
15 changed files with 3879 additions and 6099 deletions
|
@ -24,10 +24,7 @@
|
|||
#include <iostream>
|
||||
#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<QDial *>(this, "pot%1");
|
||||
potLabels = findWidgets<QLabel *>(this, "potLabel%1");
|
||||
potValues = findWidgets<QLabel *>(this, "potValue%1");
|
||||
sliders = findWidgets<QSlider *>(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; i<outputs; i++) {
|
||||
QGridLayout * outputTab = ui->channelsLayout;
|
||||
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; i<switches; i++) {
|
||||
QFrame * swtch = createLogicalSwitch(tabWidget, i, logicalSwitchLabels);
|
||||
ui->logicalSwitchesLayout->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; fm<fmodes; fm++) {
|
||||
QLabel * label = new QLabel(tabWidget);
|
||||
label->setText(QString("FM%1").arg(fm));
|
||||
label->setAlignment(Qt::AlignCenter);
|
||||
ui->gvarsLayout->addWidget(label, 0, fm+1);
|
||||
}
|
||||
for (int i=0; i<gvars; i++) {
|
||||
QLabel * label = new QLabel(tabWidget);
|
||||
label->setText(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; fm<fmodes; fm++) {
|
||||
QLabel * value = new QLabel(tabWidget);
|
||||
value->setAutoFillBackground(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<QLabel *> & 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; i<outputs; i++) {
|
||||
QLabel * label = new QLabel(tabWidget);
|
||||
label->setText(" " + 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; i<switches; i++) {
|
||||
QFrame * swtch = createLogicalSwitch(tabWidget, i, logicalSwitchLabels);
|
||||
logicalSwitchesLayout->addWidget(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; fm<fmodes; fm++) {
|
||||
QLabel * label = new QLabel(tabWidget);
|
||||
label->setText(QString("FM%1").arg(fm));
|
||||
label->setAlignment(Qt::AlignCenter);
|
||||
gvarsLayout->addWidget(label, 0, fm+1);
|
||||
}
|
||||
for (int i=0; i<gvars; i++) {
|
||||
QLabel * label = new QLabel(tabWidget);
|
||||
label->setText(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; fm<fmodes; fm++) {
|
||||
QLabel * value = new QLabel(tabWidget);
|
||||
value->setAutoFillBackground(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; i<GetCurrentFirmware()->getCapability(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; gv<numGvars; gv++) {
|
||||
|
@ -649,103 +650,6 @@ void SimulatorDialog::setValues()
|
|||
}
|
||||
}
|
||||
|
||||
void SimulatorDialog::setupSticks()
|
||||
{
|
||||
QGraphicsScene *leftScene = new QGraphicsScene(leftStick);
|
||||
leftScene->setItemIndexMethod(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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue