From 07a828f971c365ef6871270cfce0af54bf7d98d3 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Thu, 8 May 2014 17:55:20 +0200 Subject: [PATCH 01/25] OP-1331 OP-1335 Added support in ConfigTaskWidget to bind a GComboBox to an integer property --- .../uavobjectwidgetutils/configtaskwidget.cpp | 50 ++++++++++++------- .../uavobjectwidgetutils/configtaskwidget.h | 5 +- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp index 156dd26e8..bc0a52f6d 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp @@ -58,7 +58,7 @@ void ConfigTaskWidget::addUAVObject(QString objectName, QList *reloadGroups void ConfigTaskWidget::addUAVObject(UAVObject *objectName, QList *reloadGroups) { - addUAVObject(objectName ? objectName->getName() : QString(""), reloadGroups); + addUAVObject(objectName ? objectName->getName() : QString(), reloadGroups); } int ConfigTaskWidget::fieldIndexFromElementName(QString objectName, QString fieldName, QString elementName) @@ -84,7 +84,7 @@ void ConfigTaskWidget::addWidgetBinding(QString objectName, QString fieldName, Q void ConfigTaskWidget::addWidgetBinding(UAVObject *object, UAVObjectField *field, QWidget *widget, QString elementName) { - addWidgetBinding(object ? object->getName() : QString(""), field ? field->getName() : QString(""), widget, elementName); + addWidgetBinding(object ? object->getName() : QString(), field ? field->getName() : QString(), widget, elementName); } void ConfigTaskWidget::addWidgetBinding(QString objectName, QString fieldName, QWidget *widget, QString elementName, double scale, @@ -97,14 +97,14 @@ void ConfigTaskWidget::addWidgetBinding(QString objectName, QString fieldName, Q void ConfigTaskWidget::addWidgetBinding(UAVObject *object, UAVObjectField *field, QWidget *widget, QString elementName, double scale, bool isLimited, QList *reloadGroupIDs, quint32 instID) { - addWidgetBinding(object ? object->getName() : QString(""), field ? field->getName() : QString(""), widget, elementName, scale, + addWidgetBinding(object ? object->getName() : QString(), field ? field->getName() : QString(), widget, elementName, scale, isLimited, reloadGroupIDs, instID); } void ConfigTaskWidget::addWidgetBinding(UAVObject *object, UAVObjectField *field, QWidget *widget, int index, double scale, bool isLimited, QList *reloadGroupIDs, quint32 instID) { - addWidgetBinding(object ? object->getName() : QString(""), field ? field->getName() : QString(""), widget, index, scale, + addWidgetBinding(object ? object->getName() : QString(), field ? field->getName() : QString(), widget, index, scale, isLimited, reloadGroupIDs, instID); } @@ -146,7 +146,6 @@ void ConfigTaskWidget::doAddWidgetBinding(QString objectName, QString fieldName, binding->setIsEnabled(m_widgetBindingsPerWidget.count(widget) == 0); m_widgetBindingsPerWidget.insert(widget, binding); - if (object) { m_widgetBindingsPerObject.insert(object, binding); if (m_saveButton) { @@ -264,7 +263,8 @@ void ConfigTaskWidget::onAutopilotDisconnect() invalidateObjects(); } -void ConfigTaskWidget::forceConnectedState() // dynamic widgets don't recieve the connected signal. This should be called instead. +// dynamic widgets don't recieve the connected signal. This should be called instead. +void ConfigTaskWidget::forceConnectedState() { m_isConnected = true; setDirty(false); @@ -385,7 +385,7 @@ void ConfigTaskWidget::forceShadowUpdates() if (!binding->isEnabled()) { continue; } - QVariant widgetValue = getVariantFromWidget(binding->widget(), binding->scale(), binding->units()); + QVariant widgetValue = getVariantFromWidget(binding->widget(), binding->scale(), binding->units(), binding->type()); foreach(ShadowWidgetBinding * shadow, binding->shadows()) { disconnectWidgetUpdatesToSlot(shadow->widget(), SLOT(widgetsContentsChanged())); @@ -412,17 +412,17 @@ void ConfigTaskWidget::widgetsContentsChanged() if (binding->widget() == emitter) { scale = binding->scale(); checkWidgetsLimits(emitter, binding->field(), binding->index(), binding->isLimited(), - getVariantFromWidget(emitter, scale, binding->units()), scale); + getVariantFromWidget(emitter, scale, binding->units(), binding->type()), scale); } else { foreach(ShadowWidgetBinding * shadow, binding->shadows()) { if (shadow->widget() == emitter) { scale = shadow->scale(); checkWidgetsLimits(emitter, binding->field(), binding->index(), shadow->isLimited(), - getVariantFromWidget(emitter, scale, binding->units()), scale); + getVariantFromWidget(emitter, scale, binding->units(), binding->type()), scale); } } } - value = getVariantFromWidget(emitter, scale, binding->units()); + value = getVariantFromWidget(emitter, scale, binding->units(), binding->type()); binding->setValue(value); if (binding->widget() != emitter) { @@ -851,9 +851,12 @@ void ConfigTaskWidget::disconnectWidgetUpdatesToSlot(QWidget *widget, const char } } -QVariant ConfigTaskWidget::getVariantFromWidget(QWidget *widget, double scale, QString units) +QVariant ConfigTaskWidget::getVariantFromWidget(QWidget *widget, double scale, QString units, QString type) { if (QComboBox * cb = qobject_cast(widget)) { + if (type.startsWith("int") || type.startsWith("uint")) { + return cb->currentIndex(); + } return (QString)cb->currentText(); } else if (QDoubleSpinBox * cb = qobject_cast(widget)) { return (double)(cb->value() * scale); @@ -876,11 +879,16 @@ QVariant ConfigTaskWidget::getVariantFromWidget(QWidget *widget, double scale, Q } } -bool ConfigTaskWidget::setWidgetFromVariant(QWidget *widget, QVariant value, double scale, QString units) +bool ConfigTaskWidget::setWidgetFromVariant(QWidget *widget, QVariant value, double scale, QString units, QString type) { if (QComboBox * cb = qobject_cast(widget)) { - cb->setCurrentIndex(cb->findText(value.toString())); - return true; + bool ok = true; + if (type.startsWith("int") || type.startsWith("uint")) { + cb->setCurrentIndex(value.toInt(&ok)); + } else { + cb->setCurrentIndex(cb->findText(value.toString())); + } + return ok; } else if (QLabel * cb = qobject_cast(widget)) { if (scale == 0) { cb->setText(value.toString()); @@ -919,7 +927,7 @@ bool ConfigTaskWidget::setWidgetFromVariant(QWidget *widget, QVariant value, dou bool ConfigTaskWidget::setWidgetFromVariant(QWidget *widget, QVariant value, double scale) { - return setWidgetFromVariant(widget, value, scale, QString("")); + return setWidgetFromVariant(widget, value, scale, QString(), QString()); } bool ConfigTaskWidget::setWidgetFromField(QWidget *widget, UAVObjectField *field, int index, double scale, bool hasLimits) @@ -934,7 +942,7 @@ bool ConfigTaskWidget::setWidgetFromField(QWidget *widget, UAVObjectField *field } QVariant value = field->getValue(index); checkWidgetsLimits(widget, field, index, hasLimits, value, scale); - bool result = setWidgetFromVariant(widget, value, scale, field->getUnits()); + bool result = setWidgetFromVariant(widget, value, scale, field->getUnits(), field->getTypeAsString()); if (result) { return true; } else { @@ -1098,7 +1106,15 @@ QString WidgetBinding::units() const if (m_field) { return m_field->getUnits(); } - return QString(""); + return QString(); +} + +QString WidgetBinding::type() const +{ + if (m_field) { + return m_field->getTypeAsString(); + } + return QString(); } UAVObject *WidgetBinding::object() const diff --git a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.h b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.h index 900aaa9a0..40ce92272 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.h +++ b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.h @@ -69,6 +69,7 @@ public: ~WidgetBinding(); QString units() const; + QString type() const; UAVObject *object() const; UAVObjectField *field() const; int index() const; @@ -223,8 +224,8 @@ private: bool setWidgetFromField(QWidget *widget, UAVObjectField *field, int index, double scale, bool hasLimits); - QVariant getVariantFromWidget(QWidget *widget, double scale, const QString units); - bool setWidgetFromVariant(QWidget *widget, QVariant value, double scale, QString units); + QVariant getVariantFromWidget(QWidget *widget, double scale, const QString units, QString type); + bool setWidgetFromVariant(QWidget *widget, QVariant value, double scale, QString units, QString type); bool setWidgetFromVariant(QWidget *widget, QVariant value, double scale); void connectWidgetUpdatesToSlot(QWidget *widget, const char *function); From fed7fba84f963f3ee0767713e6cf00a31cbb89e0 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Thu, 8 May 2014 18:12:37 +0200 Subject: [PATCH 02/25] OP-1331 fixed alignment issues in Config Input channel list (mostly by fixing the size of items). Removed hidden channelNumber spin box. Included other minor UI cleanups (spin box text right aligned, ...). --- .../src/plugins/config/configinputwidget.cpp | 3 +- .../openpilotgcs/src/plugins/config/input.ui | 30 +- .../src/plugins/config/inputchannelform.cpp | 79 +- .../src/plugins/config/inputchannelform.h | 8 +- .../src/plugins/config/inputchannelform.ui | 1420 +++++++++-------- 5 files changed, 819 insertions(+), 721 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index a4530978b..b3568032c 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -88,7 +88,7 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : // in reverse order of the binding order otherwise the 'Reversed' logic will floor the neutral value // to the max value ( which is smaller than the neutral value when reversed ) and the channel number // will not be set correctly. - addWidgetBinding("ManualControlSettings", "ChannelNumber", inpForm->ui->channelNumber, index); + addWidgetBinding("ManualControlSettings", "ChannelNumber", inpForm->ui->channelNumberDropdown, index); addWidgetBinding("ManualControlSettings", "ChannelGroups", inpForm->ui->channelGroup, index); addWidgetBinding("ManualControlSettings", "ChannelNeutral", inpForm->ui->channelNeutral, index); addWidgetBinding("ManualControlSettings", "ChannelNeutral", inpForm->ui->neutralValue, index); @@ -96,7 +96,6 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : addWidgetBinding("ManualControlSettings", "ChannelMin", inpForm->ui->channelMin, index); addWidgetBinding("ManualControlSettings", "ChannelMax", inpForm->ui->channelMax, index); - addWidget(inpForm->ui->channelNumberDropdown); addWidget(inpForm->ui->channelResponseTime); addWidget(inpForm->ui->channelRev); diff --git a/ground/openpilotgcs/src/plugins/config/input.ui b/ground/openpilotgcs/src/plugins/config/input.ui index 48fee6df8..f3fa1c43b 100644 --- a/ground/openpilotgcs/src/plugins/config/input.ui +++ b/ground/openpilotgcs/src/plugins/config/input.ui @@ -116,8 +116,8 @@ 0 0 - 774 - 748 + 772 + 751 @@ -143,16 +143,16 @@ - 12 + 9 - 0 + 9 - 12 + 9 - 0 + 9 @@ -162,21 +162,21 @@ - 12 + 0 - 12 + 0 - 12 + 0 - 12 + 0 - 0 + 6 @@ -546,8 +546,8 @@ 0 0 - 774 - 748 + 724 + 497 @@ -2048,8 +2048,8 @@ Setup the flight mode channel on the RC Input tab if you have not done so alread 0 0 - 504 - 156 + 407 + 138 diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp b/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp index f6df2a3c0..adc9c7d70 100644 --- a/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp @@ -4,30 +4,31 @@ #include "manualcontrolsettings.h" #include "gcsreceiver.h" -InputChannelForm::InputChannelForm(QWidget *parent, bool showlegend) : - ConfigTaskWidget(parent), - ui(new Ui::InputChannelForm) +InputChannelForm::InputChannelForm(QWidget *parent, bool showLegend) : + ConfigTaskWidget(parent), ui(new Ui::InputChannelForm) { ui->setupUi(this); // The first time through the loop, keep the legend. All other times, delete it. - if (!showlegend) { - layout()->removeWidget(ui->legend0); - layout()->removeWidget(ui->legend1); - layout()->removeWidget(ui->legend2); - layout()->removeWidget(ui->legend3); - layout()->removeWidget(ui->legend4); - layout()->removeWidget(ui->legend5); - layout()->removeWidget(ui->legend6); - layout()->removeWidget(ui->legend7); - delete ui->legend0; - delete ui->legend1; - delete ui->legend2; - delete ui->legend3; - delete ui->legend4; - delete ui->legend5; - delete ui->legend6; - delete ui->legend7; + if (!showLegend) { + QLayout *legendLayout = layout()->itemAt(0)->layout(); + Q_ASSERT(legendLayout); + // remove every item + while (legendLayout->count()) { + QLayoutItem *item = legendLayout->takeAt(0); + if (!item) { + continue; + } + // get widget from layout item + QWidget *widget = item->widget(); + if (widget) { + delete widget; + continue; + } + } + // and finally remove and delete the legend layout + layout()->removeItem(legendLayout); + delete legendLayout; } connect(ui->channelMin, SIGNAL(valueChanged(int)), this, SLOT(minMaxUpdated())); @@ -36,12 +37,6 @@ InputChannelForm::InputChannelForm(QWidget *parent, bool showlegend) : connect(ui->channelGroup, SIGNAL(currentIndexChanged(int)), this, SLOT(groupUpdated())); connect(ui->channelRev, SIGNAL(toggled(bool)), this, SLOT(reversedUpdated())); - // This is awkward but since we want the UI to be a dropdown but the field is not an enum - // it breaks the UAUVObject widget relation of the task gadget. Running the data through - // a spin box fixes this - connect(ui->channelNumberDropdown, SIGNAL(currentIndexChanged(int)), this, SLOT(channelDropdownUpdated(int))); - connect(ui->channelNumber, SIGNAL(valueChanged(int)), this, SLOT(channelNumberUpdated(int))); - disableMouseWheelEvents(); } @@ -54,19 +49,6 @@ InputChannelForm::~InputChannelForm() void InputChannelForm::setName(QString &name) { ui->channelName->setText(name); - QFontMetrics metrics(ui->channelName->font()); - int width = metrics.width(name) + 5; - foreach(InputChannelForm * form, parent()->findChildren()) { - if (form == this) { - continue; - } - if (form->ui->channelName->minimumSize().width() < width) { - form->ui->channelName->setMinimumSize(width, 0); - } else { - width = form->ui->channelName->minimumSize().width(); - } - } - ui->channelName->setMinimumSize(width, 0); } /** @@ -170,23 +152,4 @@ void InputChannelForm::groupUpdated() for (int i = 0; i < count; i++) { ui->channelNumberDropdown->addItem(QString(tr("Chan %1").arg(i + 1))); } - - ui->channelNumber->setMaximum(count); - ui->channelNumber->setMinimum(0); -} - -/** - * Update the dropdown from the hidden control - */ -void InputChannelForm::channelDropdownUpdated(int newval) -{ - ui->channelNumber->setValue(newval); -} - -/** - * Update the hidden control from the dropdown - */ -void InputChannelForm::channelNumberUpdated(int newval) -{ - ui->channelNumberDropdown->setCurrentIndex(newval); } diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.h b/ground/openpilotgcs/src/plugins/config/inputchannelform.h index 91d665b40..28511bd1a 100644 --- a/ground/openpilotgcs/src/plugins/config/inputchannelform.h +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.h @@ -1,8 +1,10 @@ #ifndef INPUTCHANNELFORM_H #define INPUTCHANNELFORM_H -#include #include "configinputwidget.h" + +#include + namespace Ui { class InputChannelForm; } @@ -11,7 +13,7 @@ class InputChannelForm : public ConfigTaskWidget { Q_OBJECT public: - explicit InputChannelForm(QWidget *parent = 0, bool showlegend = false); + explicit InputChannelForm(QWidget *parent = 0, const bool showLegend = false); ~InputChannelForm(); friend class ConfigInputWidget; void setName(QString &name); @@ -20,8 +22,6 @@ private slots: void neutralUpdated(); void reversedUpdated(); void groupUpdated(); - void channelDropdownUpdated(int); - void channelNumberUpdated(int); private: Ui::InputChannelForm *ui; diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.ui b/ground/openpilotgcs/src/plugins/config/inputchannelform.ui index d07f2ae3b..5e1ee9107 100644 --- a/ground/openpilotgcs/src/plugins/config/inputchannelform.ui +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.ui @@ -6,14 +6,14 @@ 0 0 - 828 - 93 + 839 + 57 Form - + 0 @@ -24,566 +24,785 @@ 0 - 6 + 0 - - - - true + + + + 6 - - - 0 - 0 - - - - - 0 - 20 - - - - - 75 - false - true - - - - Channel neutral - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); + + + + true + + + + 0 + 0 + + + + + 80 + 20 + + + + + -1 + 75 + false + true + + + + Channel function + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; -margin:1px; -font:bold; - - - QFrame::StyledPanel - - - Neutral - - - Qt::AlignCenter - - - - - - - - 0 - 25 - - - - Qt::StrongFocus - - - QAbstractSpinBox::UpDownArrows - - - 9999 - - - 1000 - - - - - - - true - - - - 0 - 0 - - - - - 30 - 20 - - - - - 75 - false - true - - - - Response time - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + Function + + + Qt::AlignCenter + + + + + + + true + + + + 0 + 0 + + + + + 100 + 20 + + + + + -1 + 75 + false + true + + + + Channel type + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; -margin:1px; -font:bold; - - - QFrame::StyledPanel - - - 1 - - - RT - - - Qt::AlignCenter - - - - - - - true - - - - 0 - 0 - - - - - 75 - 20 - - - - - 75 - false - true - - - - Channel values are inverted - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + Type + + + Qt::AlignCenter + + + + + + + true + + + + 0 + 0 + + + + + 90 + 20 + + + + + -1 + 75 + false + true + + + + Channel number + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; -margin:1px; -font:bold; - - - QFrame::StyledPanel - - - 1 - - - Reversed - - - Qt::AlignCenter - - - - - - - true - - - - 0 - 0 - - - - - 0 - 20 - - - - - 75 - false - true - - - - Channel function - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + Number + + + Qt::AlignCenter + + + + + + + true + + + + 0 + 0 + + + + + 55 + 20 + + + + + -1 + 75 + false + true + + + + Channel min + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; -margin:1px; -font:bold; - - - QFrame::StyledPanel - - - Function - - - Qt::AlignCenter - - - - - - - true - - - - 0 - 0 - - - - - 0 - 20 - - - - - 75 - false - true - - - - Channel type - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + Min + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + true + + + + 0 + 0 + + + + + 0 + 20 + + + + + -1 + 75 + false + true + + + + Channel neutral + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; -margin:1px; -font:bold; - - - QFrame::StyledPanel - - - Type - - - Qt::AlignCenter - - - - - - - true - - - - 0 - 0 - - - - - 0 - 20 - - - - - 75 - false - true - - - - Channel number - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + Neutral + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + true + + + + 0 + 0 + + + + + 55 + 20 + + + + + -1 + 75 + false + true + + + + Channel max + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; -margin:1px; -font:bold; - - - QFrame::StyledPanel - - - Number - - - Qt::AlignCenter - - - - - - - true - - - - 0 - 0 - - - - - 0 - 20 - - - - - 75 - false - true - - - - Channel min - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + 1 + + + Max + + + Qt::AlignCenter + + + + + + + true + + + + 0 + 0 + + + + + 75 + 20 + + + + + -1 + 75 + false + true + + + + Channel values are inverted + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; -margin:1px; -font:bold; - - - QFrame::StyledPanel - - - Min - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 80 - 25 - - - - TextLabel - - - - - - - - 4 - 0 - - - - - 0 - 25 - - - - - 90 - 16777215 - - - - Qt::StrongFocus - - - 7 - - - - - - - - 6 - 0 - - - - - 0 - 25 - - - - - 100 - 16777215 - - - - Qt::StrongFocus - - - - - - - - 0 - 25 - - - - Qt::StrongFocus - - - QAbstractSpinBox::UpDownArrows - - - 9999 - - - 1000 - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - true - - - - 0 - 0 - - - - - 0 - 20 - - - - - 75 - false - true - - - - Channel max - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + 1 + + + Reversed + + + Qt::AlignCenter + + + + + + + true + + + + 0 + 0 + + + + + 45 + 20 + + + + + -1 + 75 + false + true + + + + Response time + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; -margin:1px; -font:bold; - - - QFrame::StyledPanel - - - 1 - - - Max - - - Qt::AlignCenter - - +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + 1 + + + RT + + + Qt::AlignCenter + + + + - - - - Qt::Horizontal + + + + 6 - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - - 0 - 0 - - - - - 0 - 22 - - - - Qt::StrongFocus - - - Qt::Horizontal - - - - - - - true - - - - 0 - 0 - - - - - 30 - 25 - - - - Optional input filter response time. + + + + + 0 + 0 + + + + + 80 + 25 + + + + + 80 + 16777215 + + + + Text + + + + + + + + 0 + 0 + + + + + 100 + 25 + + + + + 100 + 16777215 + + + + Qt::StrongFocus + + + + + + + + 0 + 0 + + + + + 90 + 25 + + + + + 90 + 16777215 + + + + Qt::StrongFocus + + + 7 + + + + + + + + 0 + 0 + + + + + 55 + 25 + + + + + 55 + 16777215 + + + + Qt::StrongFocus + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + QAbstractSpinBox::UpDownArrows + + + 9999 + + + 1000 + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Plain + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 50 + 0 + + + + Qt::StrongFocus + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 9999 + + + 1000 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + 0 + 0 + + + + + 55 + 25 + + + + + 55 + 16777215 + + + + Qt::StrongFocus + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + QAbstractSpinBox::UpDownArrows + + + 9999 + + + 1000 + + + + + + + + 0 + 0 + + + + + 75 + 25 + + + + + 75 + 16777215 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + + 0 + 0 + + + + + 0 + 20 + + + + + + + + + + + + + + true + + + + 0 + 0 + + + + + 45 + 25 + + + + + 45 + 16777215 + + + + Optional input filter response time. Range: 0-999ms, 0 disables filter (default). @@ -591,111 +810,28 @@ Warning: this is an expert mode feature, mostly used for aerial video camera control (airframe yaw and camera gimbal accessory channels). Too high values for main controls can cause undesirable effects and even lead to crash. Use with caution. - - - false - - - true - - - QAbstractSpinBox::UpDownArrows - - - 999 - - - - - - - - 75 - 0 - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - true - - - - 0 - 20 - - - - - - - - - - - - - - - 0 - 25 - - - - 9999 - - - 1000 - - + + + false + + + true + + + QAbstractSpinBox::UpDownArrows + + + 999 + + + + - - - true - - - - 216 - 26 - 0 - 0 - - - - - 0 - 0 - - - - channelNumber channelGroup channelNumberDropdown - channelMin - channelNeutral - channelMax From da3d9d61fce8d0511a0b4e3e7066d1af912de556 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Thu, 8 May 2014 18:23:35 +0200 Subject: [PATCH 03/25] OP-1331 fixed alignment issues in Config Output channel list (mostly by fixing the size of items). Includes other minor UI cleanups (spin box text right aligned, ...) --- .../openpilotgcs/src/plugins/config/output.ui | 7 +- .../src/plugins/config/outputchannelform.cpp | 73 +- .../src/plugins/config/outputchannelform.ui | 1197 ++++++++++------- 3 files changed, 728 insertions(+), 549 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/output.ui b/ground/openpilotgcs/src/plugins/config/output.ui index aa2f892c7..3be59f710 100644 --- a/ground/openpilotgcs/src/plugins/config/output.ui +++ b/ground/openpilotgcs/src/plugins/config/output.ui @@ -122,8 +122,8 @@ 0 0 - 676 - 674 + 674 + 677 @@ -655,6 +655,9 @@ Leave at 50Hz for fixed wing. + + 6 + QLayout::SetDefaultConstraint diff --git a/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp b/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp index a69a88bf9..259655158 100644 --- a/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp +++ b/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp @@ -29,49 +29,42 @@ #include "configoutputwidget.h" OutputChannelForm::OutputChannelForm(const int index, QWidget *parent, const bool showLegend) : - ConfigTaskWidget(parent), - ui(), - m_index(index), - m_inChannelTest(false) + ConfigTaskWidget(parent), ui(), m_index(index), m_inChannelTest(false) { ui.setupUi(this); if (!showLegend) { - // Remove legend - QGridLayout *grid_layout = dynamic_cast(layout()); - Q_ASSERT(grid_layout); - for (int col = 0; col < grid_layout->columnCount(); col++) { // remove every item in first row - QLayoutItem *item = grid_layout->itemAtPosition(0, col); + QLayout *legendLayout = layout()->itemAt(0)->layout(); + Q_ASSERT(legendLayout); + // remove every item + while (legendLayout->count()) { + QLayoutItem *item = legendLayout->takeAt(0); if (!item) { continue; } // get widget from layout item - QWidget *legend_widget = item->widget(); - if (!legend_widget) { + QWidget *widget = item->widget(); + if (widget) { + delete widget; continue; } - // delete widget - grid_layout->removeWidget(legend_widget); - delete legend_widget; } + // and finally remove and delete the legend layout + layout()->removeItem(legendLayout); + delete legendLayout; } // The convention for OP is Channel 1 to Channel 10. ui.actuatorNumber->setText(QString("%1:").arg(m_index + 1)); // Register for ActuatorSettings changes: - connect(ui.actuatorMin, SIGNAL(editingFinished()), - this, SLOT(setChannelRange())); - connect(ui.actuatorMax, SIGNAL(editingFinished()), - this, SLOT(setChannelRange())); - connect(ui.actuatorRev, SIGNAL(toggled(bool)), - this, SLOT(reverseChannel(bool))); + connect(ui.actuatorMin, SIGNAL(editingFinished()), this, SLOT(setChannelRange())); + connect(ui.actuatorMax, SIGNAL(editingFinished()), this, SLOT(setChannelRange())); + connect(ui.actuatorRev, SIGNAL(toggled(bool)), this, SLOT(reverseChannel(bool))); // Now connect the channel out sliders to our signal to send updates in test mode - connect(ui.actuatorNeutral, SIGNAL(valueChanged(int)), - this, SLOT(sendChannelTest(int))); + connect(ui.actuatorNeutral, SIGNAL(valueChanged(int)), this, SLOT(sendChannelTest(int))); ui.actuatorLink->setChecked(false); - connect(ui.actuatorLink, SIGNAL(toggled(bool)), - this, SLOT(linkToggled(bool))); + connect(ui.actuatorLink, SIGNAL(toggled(bool)), this, SLOT(linkToggled(bool))); disableMouseWheelEvents(); } @@ -194,19 +187,6 @@ void OutputChannelForm::neutral(int value) void OutputChannelForm::setAssignment(const QString &assignment) { ui.actuatorName->setText(assignment); - QFontMetrics metrics(ui.actuatorName->font()); - int width = metrics.width(assignment) + 1; - foreach(OutputChannelForm * form, parent()->findChildren()) { - if (form == this) { - continue; - } - if (form->ui.actuatorName->minimumSize().width() < width) { - form->ui.actuatorName->setMinimumSize(width, 0); - } else { - width = form->ui.actuatorName->minimumSize().width(); - } - } - ui.actuatorName->setMinimumSize(width, 0); } /** @@ -220,7 +200,7 @@ void OutputChannelForm::setChannelRange() { int oldMini = ui.actuatorNeutral->minimum(); -// int oldMaxi = ui.actuatorNeutral->maximum(); + // int oldMaxi = ui.actuatorNeutral->maximum(); if (ui.actuatorMin->value() < ui.actuatorMax->value()) { ui.actuatorNeutral->setRange(ui.actuatorMin->value(), ui.actuatorMax->value()); @@ -234,8 +214,9 @@ void OutputChannelForm::setChannelRange() ui.actuatorNeutral->setValue(ui.actuatorNeutral->minimum()); } -// if (ui.actuatorNeutral->value() == oldMaxi) -// ui.actuatorNeutral->setValue(ui.actuatorNeutral->maximum()); // this can be dangerous if it happens to be controlling a motor at the time! + // if (ui.actuatorNeutral->value() == oldMaxi) + // this can be dangerous if it happens to be controlling a motor at the time! + // ui.actuatorNeutral->setValue(ui.actuatorNeutral->maximum()); } /** @@ -252,8 +233,7 @@ void OutputChannelForm::reverseChannel(bool state) return; } - // Now, swap the min & max values (only on the spinboxes, the slider - // does not change! + // Now, swap the min & max values (only on the spinboxes, the slider does not change!) int temp = ui.actuatorMax->value(); ui.actuatorMax->setValue(ui.actuatorMin->value()); ui.actuatorMin->setValue(temp); @@ -286,12 +266,14 @@ void OutputChannelForm::sendChannelTest(int value) } if (ui.actuatorRev->isChecked()) { - value = ui.actuatorMin->value() - value + ui.actuatorMax->value(); // the channel is reversed + // the channel is reversed + value = ui.actuatorMin->value() - value + ui.actuatorMax->value(); } // update the label ui.actuatorValue->setText(QString::number(value)); - if (ui.actuatorLink->checkState() && parent()) { // the channel is linked to other channels + if (ui.actuatorLink->checkState() && parent()) { + // the channel is linked to other channels QList outputChannelForms = parent()->findChildren(); // set the linked channels of the parent widget to the same value foreach(OutputChannelForm * outputChannelForm, outputChannelForms) { @@ -320,7 +302,8 @@ void OutputChannelForm::sendChannelTest(int value) } if (!m_inChannelTest) { - return; // we are not in Test Output mode + // we are not in Test Output mode + return; } emit channelChanged(index(), value); } diff --git a/ground/openpilotgcs/src/plugins/config/outputchannelform.ui b/ground/openpilotgcs/src/plugins/config/outputchannelform.ui index abe5d04dd..9e0c7fa1b 100644 --- a/ground/openpilotgcs/src/plugins/config/outputchannelform.ui +++ b/ground/openpilotgcs/src/plugins/config/outputchannelform.ui @@ -6,554 +6,747 @@ 0 0 - 825 - 58 + 772 + 57 Form - + + + 6 + + + 0 + - 1 + 0 + + + 0 - 1 + 0 - - 12 - - - - - - 0 - 0 - + + + + 12 - - - 45 - 20 - - - - - 75 - false - true - - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); + + + + + 0 + 0 + + + + + 20 + 20 + + + + + 16777215 + 16777215 + + + + + -1 + 75 + false + true + + + + Qt::LeftToRight + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; -font:bold; +font: bold 12px; margin:1px; - - - Link - - - Qt::AlignCenter - - - - - - - - 0 - 25 - - - - Qt::StrongFocus - - - Maximum PWM value, beware of not overdriving your servo. - - - 9999 - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 75 - false - true - - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); + + + # + + + Qt::AlignCenter + + + 0 + + + + + + + + 0 + 0 + + + + + 110 + 20 + + + + + 16777215 + 16777215 + + + + + -1 + 75 + false + true + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; -font:bold; +font: bold 12px; margin:1px; - - - Neutral (slowest for motor) - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 75 - false - true - - - - Qt::LeftToRight - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); + + + Assignment + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 55 + 20 + + + + + 16777215 + 16777215 + + + + + -1 + 75 + false + true + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; -font:bold; +font: bold 12px; margin:1px; - - - # - - - Qt::AlignCenter - - - 0 - - - - - - - Qt::Horizontal - - - QSizePolicy::Minimum - - - - 5 - 20 - - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 75 - false - true - - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); + + + Min + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + + + + + + 0 + 0 + + + + + 0 + 20 + + + + + -1 + 75 + false + true + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; -font:bold; +font: bold 12px; margin:1px; - - - Assignment - - - Qt::AlignCenter - - - - - - - - 0 - 25 - - - - Qt::StrongFocus - - - Minimum PWM value, beware of not overdriving your servo. - - - 9999 - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - Qt::StrongFocus - - - 9999 - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 75 - false - true - - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); + + + Neutral (slowest for motor) + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + + + + + + 0 + 0 + + + + + 55 + 20 + + + + + 16777215 + 16777215 + + + + + -1 + 75 + false + true + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; -font:bold; +font: bold 12px; margin:1px; - - - Max - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 20 - 25 - - - - Channel Number - - - TextLabel - - - Qt::AlignCenter - - - - - - - Qt::Horizontal - - - QSizePolicy::Minimum - - - - 5 - 20 - - - - - - - - - 0 - 0 - - - - - 110 - 25 - - - - TextLabel - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 75 - false - true - - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); + + + Max + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 75 + 20 + + + + + 16777215 + 16777215 + + + + + -1 + 75 + false + true + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; -font:bold; +font: bold 12px; margin:1px; - - - Reversed - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 0 - 25 - - - - Current value of slider. - - - 0000 - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - 75 - false - true - - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); + + + Reversed + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 45 + 20 + + + + + 16777215 + 16777215 + + + + + -1 + 75 + false + true + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; -font:bold; +font: bold 12px; margin:1px; - - - Min - - - Qt::AlignCenter - - + + + Link + + + Qt::AlignCenter + + + + - - - - - 75 - 0 - + + + + 12 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - + + + + + 0 + 0 + + + + + 20 + 25 + + + + + 20 + 16777215 + + + + Channel Number + + + 0: + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 110 + 25 + + + + + 110 + 16777215 + + + + - + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 55 + 25 + + + + + 55 + 16777215 + + + + Qt::StrongFocus + + + Minimum PWM value, beware of not overdriving your servo. + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 9999 + + + 0 + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 - - - 0 - 0 - + + 0 - - Qt::StrongFocus + + 0 - - Check to invert the channel. + + 0 - - - - - - - - - - 45 - 0 - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - + + + + + 0 + 0 + + + + + 50 + 0 + + + + Qt::StrongFocus + + + 9999 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 24 + 25 + + + + + 24 + 16777215 + + + + Current value of slider. + + + 0000 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + + + + + + 0 + 0 + + + + + 55 + 25 + + + + + 55 + 16777215 + + + + Qt::StrongFocus + + + Maximum PWM value, beware of not overdriving your servo. + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 9999 + + + + + + + + 0 + 0 + + + + + 75 + 0 + + + + QFrame::NoFrame + + + + 0 - - - 0 - 0 - + + 0 - - Qt::StrongFocus + + 0 - - Output mode + + 0 - - - - + + 0 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Qt::StrongFocus + + + Check to invert the channel. + + + + + + + + + + + 0 + 0 + + + + + 45 + 25 + + + + QFrame::NoFrame + + + QFrame::Plain + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Qt::StrongFocus + + + Output mode + + + + + + + actuatorMin - actuatorNeutral actuatorMax From 274c6aadad197a1cc5cf3df3479576aa278741f8 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Sat, 10 May 2014 20:40:14 +0200 Subject: [PATCH 04/25] OP-1331 trying new approach to address input/output channel configuration grid alignment issues. New approach is to move the individual widgets to the parent grid layout in order to have them all under the same constraints. This wip to have feedback on other OSes. --- .../src/plugins/config/configgadgetwidget.cpp | 77 +- .../src/plugins/config/configgadgetwidget.h | 3 +- .../src/plugins/config/configinputwidget.cpp | 28 +- .../src/plugins/config/configoutputwidget.cpp | 6 +- .../openpilotgcs/src/plugins/config/input.ui | 52 +- .../src/plugins/config/inputchannelform.cpp | 71 +- .../src/plugins/config/inputchannelform.h | 6 +- .../src/plugins/config/inputchannelform.ui | 1596 ++++++++--------- .../openpilotgcs/src/plugins/config/output.ui | 70 +- .../src/plugins/config/outputchannelform.cpp | 84 +- .../src/plugins/config/outputchannelform.h | 6 +- .../src/plugins/config/outputchannelform.ui | 1384 +++++++------- 12 files changed, 1726 insertions(+), 1657 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp index 4ae81eb08..482f42add 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp @@ -55,69 +55,67 @@ ConfigGadgetWidget::ConfigGadgetWidget(QWidget *parent) : QWidget(parent) { setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); - ftw = new MyTabbedStackWidget(this, true, true); - ftw->setIconSize(64); + stackWidget = new MyTabbedStackWidget(this, true, true); + stackWidget->setIconSize(64); QVBoxLayout *layout = new QVBoxLayout; layout->setContentsMargins(0, 0, 0, 0); - layout->addWidget(ftw); + layout->addWidget(stackWidget); setLayout(layout); - // ********************* QWidget *qwd; QIcon *icon = new QIcon(); icon->addFile(":/configgadget/images/hardware_normal.png", QSize(), QIcon::Normal, QIcon::Off); icon->addFile(":/configgadget/images/hardware_selected.png", QSize(), QIcon::Selected, QIcon::Off); qwd = new DefaultHwSettingsWidget(this); - ftw->insertTab(ConfigGadgetWidget::hardware, qwd, *icon, QString("Hardware")); + stackWidget->insertTab(ConfigGadgetWidget::hardware, qwd, *icon, QString("Hardware")); icon = new QIcon(); icon->addFile(":/configgadget/images/vehicle_normal.png", QSize(), QIcon::Normal, QIcon::Off); icon->addFile(":/configgadget/images/vehicle_selected.png", QSize(), QIcon::Selected, QIcon::Off); qwd = new ConfigVehicleTypeWidget(this); - ftw->insertTab(ConfigGadgetWidget::aircraft, qwd, *icon, QString("Vehicle")); + stackWidget->insertTab(ConfigGadgetWidget::aircraft, qwd, *icon, QString("Vehicle")); icon = new QIcon(); icon->addFile(":/configgadget/images/input_normal.png", QSize(), QIcon::Normal, QIcon::Off); icon->addFile(":/configgadget/images/input_selected.png", QSize(), QIcon::Selected, QIcon::Off); qwd = new ConfigInputWidget(this); - ftw->insertTab(ConfigGadgetWidget::input, qwd, *icon, QString("Input")); + stackWidget->insertTab(ConfigGadgetWidget::input, qwd, *icon, QString("Input")); icon = new QIcon(); icon->addFile(":/configgadget/images/output_normal.png", QSize(), QIcon::Normal, QIcon::Off); icon->addFile(":/configgadget/images/output_selected.png", QSize(), QIcon::Selected, QIcon::Off); qwd = new ConfigOutputWidget(this); - ftw->insertTab(ConfigGadgetWidget::output, qwd, *icon, QString("Output")); + stackWidget->insertTab(ConfigGadgetWidget::output, qwd, *icon, QString("Output")); icon = new QIcon(); icon->addFile(":/configgadget/images/ins_normal.png", QSize(), QIcon::Normal, QIcon::Off); icon->addFile(":/configgadget/images/ins_selected.png", QSize(), QIcon::Selected, QIcon::Off); qwd = new DefaultAttitudeWidget(this); - ftw->insertTab(ConfigGadgetWidget::sensors, qwd, *icon, QString("Attitude")); + stackWidget->insertTab(ConfigGadgetWidget::sensors, qwd, *icon, QString("Attitude")); icon = new QIcon(); icon->addFile(":/configgadget/images/stabilization_normal.png", QSize(), QIcon::Normal, QIcon::Off); icon->addFile(":/configgadget/images/stabilization_selected.png", QSize(), QIcon::Selected, QIcon::Off); qwd = new ConfigStabilizationWidget(this); - ftw->insertTab(ConfigGadgetWidget::stabilization, qwd, *icon, QString("Stabilization")); + stackWidget->insertTab(ConfigGadgetWidget::stabilization, qwd, *icon, QString("Stabilization")); icon = new QIcon(); icon->addFile(":/configgadget/images/camstab_normal.png", QSize(), QIcon::Normal, QIcon::Off); icon->addFile(":/configgadget/images/camstab_selected.png", QSize(), QIcon::Selected, QIcon::Off); qwd = new ConfigCameraStabilizationWidget(this); - ftw->insertTab(ConfigGadgetWidget::camerastabilization, qwd, *icon, QString("Gimbal")); + stackWidget->insertTab(ConfigGadgetWidget::camerastabilization, qwd, *icon, QString("Gimbal")); icon = new QIcon(); icon->addFile(":/configgadget/images/txpid_normal.png", QSize(), QIcon::Normal, QIcon::Off); icon->addFile(":/configgadget/images/txpid_selected.png", QSize(), QIcon::Selected, QIcon::Off); qwd = new ConfigTxPIDWidget(this); - ftw->insertTab(ConfigGadgetWidget::txpid, qwd, *icon, QString("TxPID")); + stackWidget->insertTab(ConfigGadgetWidget::txpid, qwd, *icon, QString("TxPID")); + + stackWidget->setCurrentIndex(ConfigGadgetWidget::hardware); - ftw->setCurrentIndex(ConfigGadgetWidget::hardware); - // ********************* // Listen to autopilot connection events - ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); TelemetryManager *telMngr = pm->getObject(); connect(telMngr, SIGNAL(connected()), this, SLOT(onAutopilotConnect())); @@ -129,9 +127,9 @@ ConfigGadgetWidget::ConfigGadgetWidget(QWidget *parent) : QWidget(parent) } help = 0; - connect(ftw, SIGNAL(currentAboutToShow(int, bool *)), this, SLOT(tabAboutToChange(int, bool *))); + connect(stackWidget, SIGNAL(currentAboutToShow(int, bool *)), this, SLOT(tabAboutToChange(int, bool *))); - // Connect to the PipXStatus object updates + // Connect to the OPLinkStatus object updates UAVObjectManager *objManager = pm->getObject(); oplinkStatusObj = dynamic_cast(objManager->getObject("OPLinkStatus")); if (oplinkStatusObj != NULL) { @@ -148,13 +146,14 @@ ConfigGadgetWidget::ConfigGadgetWidget(QWidget *parent) : QWidget(parent) ConfigGadgetWidget::~ConfigGadgetWidget() { - // TODO: properly delete all the tabs in ftw before exiting + // TODO: properly delete all the tabs in stackWidget before exiting + delete stackWidget } void ConfigGadgetWidget::startInputWizard() { - ftw->setCurrentIndex(ConfigGadgetWidget::input); - ConfigInputWidget *inputWidget = dynamic_cast(ftw->getWidget(ConfigGadgetWidget::input)); + stackWidget->setCurrentIndex(ConfigGadgetWidget::input); + ConfigInputWidget *inputWidget = dynamic_cast(stackWidget->getWidget(ConfigGadgetWidget::input)); Q_ASSERT(inputWidget); inputWidget->startInputWizard(); } @@ -166,24 +165,24 @@ void ConfigGadgetWidget::resizeEvent(QResizeEvent *event) void ConfigGadgetWidget::onAutopilotDisconnect() { - int selectedIndex = ftw->currentIndex(); + int selectedIndex = stackWidget->currentIndex(); QIcon *icon = new QIcon(); icon->addFile(":/configgadget/images/ins_normal.png", QSize(), QIcon::Normal, QIcon::Off); icon->addFile(":/configgadget/images/ins_selected.png", QSize(), QIcon::Selected, QIcon::Off); QWidget *qwd = new DefaultAttitudeWidget(this); - ftw->removeTab(ConfigGadgetWidget::sensors); - ftw->insertTab(ConfigGadgetWidget::sensors, qwd, *icon, QString("Attitude")); + stackWidget->removeTab(ConfigGadgetWidget::sensors); + stackWidget->insertTab(ConfigGadgetWidget::sensors, qwd, *icon, QString("Attitude")); icon = new QIcon(); icon->addFile(":/configgadget/images/hardware_normal.png", QSize(), QIcon::Normal, QIcon::Off); icon->addFile(":/configgadget/images/hardware_selected.png", QSize(), QIcon::Selected, QIcon::Off); qwd = new DefaultHwSettingsWidget(this); - ftw->removeTab(ConfigGadgetWidget::hardware); - ftw->insertTab(ConfigGadgetWidget::hardware, qwd, *icon, QString("Hardware")); + stackWidget->removeTab(ConfigGadgetWidget::hardware); + stackWidget->insertTab(ConfigGadgetWidget::hardware, qwd, *icon, QString("Hardware")); - ftw->setCurrentIndex(selectedIndex); + stackWidget->setCurrentIndex(selectedIndex); emit autopilotDisconnected(); } @@ -196,7 +195,7 @@ void ConfigGadgetWidget::onAutopilotConnect() ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); UAVObjectUtilManager *utilMngr = pm->getObject(); if (utilMngr) { - int selectedIndex = ftw->currentIndex(); + int selectedIndex = stackWidget->currentIndex(); int board = utilMngr->getBoardModel(); if ((board & 0xff00) == 1024) { // CopterControl family @@ -205,15 +204,15 @@ void ConfigGadgetWidget::onAutopilotConnect() icon->addFile(":/configgadget/images/ins_normal.png", QSize(), QIcon::Normal, QIcon::Off); icon->addFile(":/configgadget/images/ins_selected.png", QSize(), QIcon::Selected, QIcon::Off); QWidget *qwd = new ConfigCCAttitudeWidget(this); - ftw->removeTab(ConfigGadgetWidget::sensors); - ftw->insertTab(ConfigGadgetWidget::sensors, qwd, *icon, QString("Attitude")); + stackWidget->removeTab(ConfigGadgetWidget::sensors); + stackWidget->insertTab(ConfigGadgetWidget::sensors, qwd, *icon, QString("Attitude")); icon = new QIcon(); icon->addFile(":/configgadget/images/hardware_normal.png", QSize(), QIcon::Normal, QIcon::Off); icon->addFile(":/configgadget/images/hardware_selected.png", QSize(), QIcon::Selected, QIcon::Off); qwd = new ConfigCCHWWidget(this); - ftw->removeTab(ConfigGadgetWidget::hardware); - ftw->insertTab(ConfigGadgetWidget::hardware, qwd, *icon, QString("Hardware")); + stackWidget->removeTab(ConfigGadgetWidget::hardware); + stackWidget->insertTab(ConfigGadgetWidget::hardware, qwd, *icon, QString("Hardware")); } else if ((board & 0xff00) == 0x0900) { // Revolution family @@ -221,20 +220,20 @@ void ConfigGadgetWidget::onAutopilotConnect() icon->addFile(":/configgadget/images/ins_normal.png", QSize(), QIcon::Normal, QIcon::Off); icon->addFile(":/configgadget/images/ins_selected.png", QSize(), QIcon::Selected, QIcon::Off); QWidget *qwd = new ConfigRevoWidget(this); - ftw->removeTab(ConfigGadgetWidget::sensors); - ftw->insertTab(ConfigGadgetWidget::sensors, qwd, *icon, QString("Attitude")); + stackWidget->removeTab(ConfigGadgetWidget::sensors); + stackWidget->insertTab(ConfigGadgetWidget::sensors, qwd, *icon, QString("Attitude")); icon = new QIcon(); icon->addFile(":/configgadget/images/hardware_normal.png", QSize(), QIcon::Normal, QIcon::Off); icon->addFile(":/configgadget/images/hardware_selected.png", QSize(), QIcon::Selected, QIcon::Off); qwd = new ConfigRevoHWWidget(this); - ftw->removeTab(ConfigGadgetWidget::hardware); - ftw->insertTab(ConfigGadgetWidget::hardware, qwd, *icon, QString("Hardware")); + stackWidget->removeTab(ConfigGadgetWidget::hardware); + stackWidget->insertTab(ConfigGadgetWidget::hardware, qwd, *icon, QString("Hardware")); } else { // Unknown board qDebug() << "Unknown board " << board; } - ftw->setCurrentIndex(selectedIndex); + stackWidget->setCurrentIndex(selectedIndex); } emit autopilotConnected(); @@ -244,7 +243,7 @@ void ConfigGadgetWidget::tabAboutToChange(int i, bool *proceed) { Q_UNUSED(i); *proceed = true; - ConfigTaskWidget *wid = qobject_cast(ftw->currentWidget()); + ConfigTaskWidget *wid = qobject_cast(stackWidget->currentWidget()); if (!wid) { return; } @@ -275,7 +274,7 @@ void ConfigGadgetWidget::updateOPLinkStatus(UAVObject *) icon->addFile(":/configgadget/images/pipx-selected.png", QSize(), QIcon::Selected, QIcon::Off); QWidget *qwd = new ConfigPipXtremeWidget(this); - ftw->insertTab(ConfigGadgetWidget::oplink, qwd, *icon, QString("OPLink")); + stackWidget->insertTab(ConfigGadgetWidget::oplink, qwd, *icon, QString("OPLink")); oplinkConnected = true; } } @@ -284,6 +283,6 @@ void ConfigGadgetWidget::onOPLinkDisconnect() { qDebug() << "ConfigGadgetWidget onOPLinkDisconnect"; oplinkTimeout->stop(); - ftw->removeTab(ConfigGadgetWidget::oplink); + stackWidget->removeTab(ConfigGadgetWidget::oplink); oplinkConnected = false; } diff --git a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.h b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.h index 45eadd8b5..0a443b9e0 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.h +++ b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.h @@ -65,7 +65,6 @@ signals: protected: void resizeEvent(QResizeEvent *event); - MyTabbedStackWidget *ftw; private: UAVDataObject *oplinkStatusObj; @@ -73,6 +72,8 @@ private: // A timer that timesout the connction to the OPLink. QTimer *oplinkTimeout; bool oplinkConnected; + + MyTabbedStackWidget *stackWidget; }; #endif // CONFIGGADGETWIDGET_H diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index b3568032c..b983a1e27 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -80,24 +80,24 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : unsigned int indexRT = 0; foreach(QString name, manualSettingsObj->getField("ChannelNumber")->getElementNames()) { Q_ASSERT(index < ManualControlSettings::CHANNELGROUPS_NUMELEM); - InputChannelForm *inpForm = new InputChannelForm(this, index == 0); - ui->channelSettings->layout()->addWidget(inpForm); // Add the row to the UI - inpForm->setName(name); + InputChannelForm *form = new InputChannelForm(this); + form->addToGrid(ui->channelLayout); + form->setName(name); // The order of the following binding calls is important. Since the values will be populated // in reverse order of the binding order otherwise the 'Reversed' logic will floor the neutral value // to the max value ( which is smaller than the neutral value when reversed ) and the channel number // will not be set correctly. - addWidgetBinding("ManualControlSettings", "ChannelNumber", inpForm->ui->channelNumberDropdown, index); - addWidgetBinding("ManualControlSettings", "ChannelGroups", inpForm->ui->channelGroup, index); - addWidgetBinding("ManualControlSettings", "ChannelNeutral", inpForm->ui->channelNeutral, index); - addWidgetBinding("ManualControlSettings", "ChannelNeutral", inpForm->ui->neutralValue, index); - addWidgetBinding("ManualControlSettings", "ChannelMax", inpForm->ui->channelMax, index); - addWidgetBinding("ManualControlSettings", "ChannelMin", inpForm->ui->channelMin, index); - addWidgetBinding("ManualControlSettings", "ChannelMax", inpForm->ui->channelMax, index); + addWidgetBinding("ManualControlSettings", "ChannelNumber", form->ui->channelNumber, index); + addWidgetBinding("ManualControlSettings", "ChannelGroups", form->ui->channelGroup, index); + addWidgetBinding("ManualControlSettings", "ChannelNeutral", form->ui->channelNeutral, index); + addWidgetBinding("ManualControlSettings", "ChannelNeutral", form->ui->neutralValue, index); + addWidgetBinding("ManualControlSettings", "ChannelMax", form->ui->channelMax, index); + addWidgetBinding("ManualControlSettings", "ChannelMin", form->ui->channelMin, index); + addWidgetBinding("ManualControlSettings", "ChannelMax", form->ui->channelMax, index); - addWidget(inpForm->ui->channelResponseTime); - addWidget(inpForm->ui->channelRev); + addWidget(form->ui->channelResponseTime); + addWidget(form->ui->channelRev); // Input filter response time fields supported for some channels only switch (index) { @@ -107,13 +107,13 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : case ManualControlSettings::CHANNELGROUPS_ACCESSORY0: case ManualControlSettings::CHANNELGROUPS_ACCESSORY1: case ManualControlSettings::CHANNELGROUPS_ACCESSORY2: - addWidgetBinding("ManualControlSettings", "ResponseTime", inpForm->ui->channelResponseTime, indexRT); + addWidgetBinding("ManualControlSettings", "ResponseTime", form->ui->channelResponseTime, indexRT); ++indexRT; break; case ManualControlSettings::CHANNELGROUPS_THROTTLE: case ManualControlSettings::CHANNELGROUPS_FLIGHTMODE: case ManualControlSettings::CHANNELGROUPS_COLLECTIVE: - inpForm->ui->channelResponseTime->setEnabled(false); + form->ui->channelResponseTime->setEnabled(false); break; default: Q_ASSERT(0); diff --git a/ground/openpilotgcs/src/plugins/config/configoutputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configoutputwidget.cpp index 9ca2ed943..5108d9b0f 100644 --- a/ground/openpilotgcs/src/plugins/config/configoutputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configoutputwidget.cpp @@ -76,10 +76,12 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren // NOTE: we have channel indices from 0 to 9, but the convention for OP is Channel 1 to Channel 10. // Register for ActuatorSettings changes: for (unsigned int i = 0; i < ActuatorCommand::CHANNEL_NUMELEM; i++) { - OutputChannelForm *form = new OutputChannelForm(i, this, i == 0); + OutputChannelForm *form = new OutputChannelForm(i, this); + form->addToGrid(ui->channelLayout); + connect(ui->channelOutTest, SIGNAL(toggled(bool)), form, SLOT(enableChannelTest(bool))); connect(form, SIGNAL(channelChanged(int, int)), this, SLOT(sendChannelTest(int, int))); - ui->channelLayout->addWidget(form); + addWidget(form->ui.actuatorMin); addWidget(form->ui.actuatorNeutral); addWidget(form->ui.actuatorMax); diff --git a/ground/openpilotgcs/src/plugins/config/input.ui b/ground/openpilotgcs/src/plugins/config/input.ui index f3fa1c43b..b53d7ba6d 100644 --- a/ground/openpilotgcs/src/plugins/config/input.ui +++ b/ground/openpilotgcs/src/plugins/config/input.ui @@ -174,9 +174,9 @@ 0 - - - 6 + + + 12 @@ -198,7 +198,7 @@ - + Qt::Horizontal @@ -211,14 +211,14 @@ - + Roll/Pitch/Yaw stick deadband - + Stick deadband in percents of full range (0-10), zero to disable @@ -234,22 +234,6 @@ - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 12 - 20 - - - - @@ -260,7 +244,7 @@ 20 - 40 + 10 @@ -369,6 +353,12 @@ + + + 0 + 0 + + 210 @@ -413,6 +403,12 @@ true + + + 0 + 0 + + 210 @@ -546,8 +542,8 @@ 0 0 - 724 - 497 + 772 + 751 @@ -2048,8 +2044,8 @@ Setup the flight mode channel on the RC Input tab if you have not done so alread 0 0 - 407 - 138 + 772 + 751 @@ -2238,7 +2234,7 @@ Set to 0 to disable (recommended for soaring fixed wings). - + :/core/images/helpicon.svg:/core/images/helpicon.svg diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp b/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp index adc9c7d70..788b96d2f 100644 --- a/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp @@ -4,13 +4,31 @@ #include "manualcontrolsettings.h" #include "gcsreceiver.h" -InputChannelForm::InputChannelForm(QWidget *parent, bool showLegend) : - ConfigTaskWidget(parent), ui(new Ui::InputChannelForm) +InputChannelForm::InputChannelForm(QWidget *parent) : ConfigTaskWidget(parent), ui(new Ui::InputChannelForm) { ui->setupUi(this); + connect(ui->channelMin, SIGNAL(valueChanged(int)), this, SLOT(minMaxUpdated())); + connect(ui->channelMax, SIGNAL(valueChanged(int)), this, SLOT(minMaxUpdated())); + connect(ui->neutralValue, SIGNAL(valueChanged(int)), this, SLOT(neutralUpdated())); + connect(ui->channelGroup, SIGNAL(currentIndexChanged(int)), this, SLOT(groupUpdated())); + connect(ui->channelRev, SIGNAL(toggled(bool)), this, SLOT(reversedUpdated())); + + disableMouseWheelEvents(); +} + +InputChannelForm::~InputChannelForm() +{ + delete ui; +} + +void InputChannelForm::addToGrid(QGridLayout *gridLayout) +{ + // if we are the first row to be inserted the show the legend + bool showLegend = (gridLayout->rowCount() == 1); + // The first time through the loop, keep the legend. All other times, delete it. - if (!showLegend) { + if (false && !showLegend) { QLayout *legendLayout = layout()->itemAt(0)->layout(); Q_ASSERT(legendLayout); // remove every item @@ -31,19 +49,40 @@ InputChannelForm::InputChannelForm(QWidget *parent, bool showLegend) : delete legendLayout; } - connect(ui->channelMin, SIGNAL(valueChanged(int)), this, SLOT(minMaxUpdated())); - connect(ui->channelMax, SIGNAL(valueChanged(int)), this, SLOT(minMaxUpdated())); - connect(ui->neutralValue, SIGNAL(valueChanged(int)), this, SLOT(neutralUpdated())); - connect(ui->channelGroup, SIGNAL(currentIndexChanged(int)), this, SLOT(groupUpdated())); - connect(ui->channelRev, SIGNAL(toggled(bool)), this, SLOT(reversedUpdated())); + QGridLayout *srcLayout = dynamic_cast(layout()); + Q_ASSERT(srcLayout); - disableMouseWheelEvents(); -} + if (showLegend) { + Q_ASSERT(srcLayout); + int row = gridLayout->rowCount(); + for(int col = 0; col < srcLayout->columnCount(); col++) { + QLayoutItem *item = srcLayout->itemAtPosition(0, col); + if (!item) { + continue; + } + QWidget *widget = item->widget(); + if (widget) { + gridLayout->addWidget(widget, row, col); + continue; + } + } + } + int row = gridLayout->rowCount(); + for(int col = 0; col < srcLayout->columnCount(); col++) { + QLayoutItem *item = srcLayout->itemAtPosition(1, col); + if (!item) { + continue; + } + QWidget *widget = item->widget(); + if (widget) { + gridLayout->addWidget(widget, row, col); + continue; + } + } -InputChannelForm::~InputChannelForm() -{ - delete ui; + // + setVisible(false); } void InputChannelForm::setName(QString &name) @@ -118,8 +157,8 @@ void InputChannelForm::reversedUpdated() */ void InputChannelForm::groupUpdated() { - ui->channelNumberDropdown->clear(); - ui->channelNumberDropdown->addItem("Disabled"); + ui->channelNumber->clear(); + ui->channelNumber->addItem("Disabled"); quint8 count = 0; @@ -150,6 +189,6 @@ void InputChannelForm::groupUpdated() } for (int i = 0; i < count; i++) { - ui->channelNumberDropdown->addItem(QString(tr("Chan %1").arg(i + 1))); + ui->channelNumber->addItem(QString(tr("Chan %1").arg(i + 1))); } } diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.h b/ground/openpilotgcs/src/plugins/config/inputchannelform.h index 28511bd1a..ad17d0963 100644 --- a/ground/openpilotgcs/src/plugins/config/inputchannelform.h +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.h @@ -13,10 +13,14 @@ class InputChannelForm : public ConfigTaskWidget { Q_OBJECT public: - explicit InputChannelForm(QWidget *parent = 0, const bool showLegend = false); + explicit InputChannelForm(QWidget *parent = 0); ~InputChannelForm(); + friend class ConfigInputWidget; + void setName(QString &name); + void addToGrid(QGridLayout *gridLayout); + private slots: void minMaxUpdated(); void neutralUpdated(); diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.ui b/ground/openpilotgcs/src/plugins/config/inputchannelform.ui index 5e1ee9107..b9052fece 100644 --- a/ground/openpilotgcs/src/plugins/config/inputchannelform.ui +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.ui @@ -6,14 +6,14 @@ 0 0 - 839 - 57 + 859 + 51 Form - + 0 @@ -26,783 +26,34 @@ 0 - - - - 6 + + 12 + + + + + true - - - - true - - - - 0 - 0 - - - - - 80 - 20 - - - - - -1 - 75 - false - true - - - - Channel function - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - QFrame::StyledPanel - - - Function - - - Qt::AlignCenter - - - - - - - true - - - - 0 - 0 - - - - - 100 - 20 - - - - - -1 - 75 - false - true - - - - Channel type - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - QFrame::StyledPanel - - - Type - - - Qt::AlignCenter - - - - - - - true - - - - 0 - 0 - - - - - 90 - 20 - - - - - -1 - 75 - false - true - - - - Channel number - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - QFrame::StyledPanel - - - Number - - - Qt::AlignCenter - - - - - - - true - - - - 0 - 0 - - - - - 55 - 20 - - - - - -1 - 75 - false - true - - - - Channel min - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - QFrame::StyledPanel - - - Min - - - Qt::AlignCenter - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - true - - - - 0 - 0 - - - - - 0 - 20 - - - - - -1 - 75 - false - true - - - - Channel neutral - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - QFrame::StyledPanel - - - Neutral - - - Qt::AlignCenter - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - true - - - - 0 - 0 - - - - - 55 - 20 - - - - - -1 - 75 - false - true - - - - Channel max - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - QFrame::StyledPanel - - - 1 - - - Max - - - Qt::AlignCenter - - - - - - - true - - - - 0 - 0 - - - - - 75 - 20 - - - - - -1 - 75 - false - true - - - - Channel values are inverted - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - QFrame::StyledPanel - - - 1 - - - Reversed - - - Qt::AlignCenter - - - - - - - true - - - - 0 - 0 - - - - - 45 - 20 - - - - - -1 - 75 - false - true - - - - Response time - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - QFrame::StyledPanel - - - 1 - - - RT - - - Qt::AlignCenter - - - - - - - - - 6 + + + 0 + 0 + - - - - - 0 - 0 - - - - - 80 - 25 - - - - - 80 - 16777215 - - - - Text - - - - - - - - 0 - 0 - - - - - 100 - 25 - - - - - 100 - 16777215 - - - - Qt::StrongFocus - - - - - - - - 0 - 0 - - - - - 90 - 25 - - - - - 90 - 16777215 - - - - Qt::StrongFocus - - - 7 - - - - - - - - 0 - 0 - - - - - 55 - 25 - - - - - 55 - 16777215 - - - - Qt::StrongFocus - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - QAbstractSpinBox::UpDownArrows - - - 9999 - - - 1000 - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - QFrame::NoFrame - - - QFrame::Plain - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - 50 - 0 - - - - Qt::StrongFocus - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - 9999 - - - 1000 - - - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - - 0 - 0 - - - - - 55 - 25 - - - - - 55 - 16777215 - - - - Qt::StrongFocus - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - QAbstractSpinBox::UpDownArrows - - - 9999 - - - 1000 - - - - - - - - 0 - 0 - - - - - 75 - 25 - - - - - 75 - 16777215 - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - true - - - - 0 - 0 - - - - - 0 - 20 - - - - - - - - - - - - - - true - - - - 0 - 0 - - - - - 45 - 25 - - - - - 45 - 16777215 - - - - Optional input filter response time. + + + 50 + 0 + + + + + 16777215 + 16777215 + + + + Optional input filter response time. Range: 0-999ms, 0 disables filter (default). @@ -810,29 +61,778 @@ Warning: this is an expert mode feature, mostly used for aerial video camera control (airframe yaw and camera gimbal accessory channels). Too high values for main controls can cause undesirable effects and even lead to crash. Use with caution. - - - false - - - true - - - QAbstractSpinBox::UpDownArrows - - - 999 - - - - + + + false + + + true + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + QAbstractSpinBox::UpDownArrows + + + 999 + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + + 16777215 + 16777215 + + + + Text + + + + + + + + 0 + 0 + + + + + 90 + 0 + + + + + 16777215 + 16777215 + + + + Qt::StrongFocus + + + 7 + + + + + + + + 0 + 0 + + + + + 100 + 0 + + + + + 16777215 + 16777215 + + + + Qt::StrongFocus + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + + 16777215 + 16777215 + + + + Qt::StrongFocus + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + QAbstractSpinBox::UpDownArrows + + + 9999 + + + 1000 + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + true + + + + 0 + 0 + + + + + 80 + 20 + + + + + -1 + 75 + false + true + + + + Channel function + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + Function + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + true + + + + 0 + 0 + + + + + 75 + 20 + + + + + -1 + 75 + false + true + + + + Channel values are inverted + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + 1 + + + Reversed + + + Qt::AlignCenter + + + + + + + true + + + + 0 + 0 + + + + + 50 + 20 + + + + + -1 + 75 + false + true + + + + Response time + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + 1 + + + RT + + + Qt::AlignCenter + + + + + + + true + + + + 0 + 0 + + + + + 50 + 20 + + + + + -1 + 75 + false + true + + + + Channel max + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + 1 + + + Max + + + Qt::AlignCenter + + + + + + + true + + + + 0 + 0 + + + + + 0 + 20 + + + + + -1 + 75 + false + true + + + + Channel neutral + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + Neutral + + + Qt::AlignCenter + + + + + + + true + + + + 0 + 0 + + + + + 50 + 20 + + + + + -1 + 75 + false + true + + + + Channel min + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + Min + + + Qt::AlignCenter + + + + + + + true + + + + 0 + 0 + + + + + 90 + 20 + + + + + -1 + 75 + false + true + + + + Channel number + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + Number + + + Qt::AlignCenter + + + + + + + true + + + + 0 + 0 + + + + + 100 + 20 + + + + + -1 + 75 + false + true + + + + Channel type + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + Type + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + + 16777215 + 16777215 + + + + Qt::StrongFocus + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + QAbstractSpinBox::UpDownArrows + + + 9999 + + + 1000 + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + QFrame::NoFrame + + + QFrame::Plain + + + + 2 + + + 0 + + + 2 + + + 0 + + + + + + 0 + 0 + + + + + 50 + 0 + + + + Qt::StrongFocus + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 60 + 16777215 + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 9999 + + + 1000 + + + + + + + + + + + 0 + 0 + + + + + 75 + 0 + + + + + 16777215 + 16777215 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + + - - channelGroup - channelNumberDropdown - diff --git a/ground/openpilotgcs/src/plugins/config/output.ui b/ground/openpilotgcs/src/plugins/config/output.ui index 3be59f710..575b03e58 100644 --- a/ground/openpilotgcs/src/plugins/config/output.ui +++ b/ground/openpilotgcs/src/plugins/config/output.ui @@ -654,44 +654,46 @@ Leave at 50Hz for fixed wing. - - - 6 - - - QLayout::SetDefaultConstraint + + + 12 - - - - - - 519 - 20 - - - - Motors spin at neutral output when armed and throttle below zero (be careful) - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 10 + + + + + + + + + 0 + 0 + + + + + 519 + 20 + + + + Motors spin at neutral output when armed and throttle below zero (be careful) + + diff --git a/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp b/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp index 259655158..b5d9c2358 100644 --- a/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp +++ b/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp @@ -28,30 +28,10 @@ #include "outputchannelform.h" #include "configoutputwidget.h" -OutputChannelForm::OutputChannelForm(const int index, QWidget *parent, const bool showLegend) : +OutputChannelForm::OutputChannelForm(const int index, QWidget *parent) : ConfigTaskWidget(parent), ui(), m_index(index), m_inChannelTest(false) { ui.setupUi(this); - if (!showLegend) { - QLayout *legendLayout = layout()->itemAt(0)->layout(); - Q_ASSERT(legendLayout); - // remove every item - while (legendLayout->count()) { - QLayoutItem *item = legendLayout->takeAt(0); - if (!item) { - continue; - } - // get widget from layout item - QWidget *widget = item->widget(); - if (widget) { - delete widget; - continue; - } - } - // and finally remove and delete the legend layout - layout()->removeItem(legendLayout); - delete legendLayout; - } // The convention for OP is Channel 1 to Channel 10. ui.actuatorNumber->setText(QString("%1:").arg(m_index + 1)); @@ -74,6 +54,68 @@ OutputChannelForm::~OutputChannelForm() // Do nothing } +void OutputChannelForm::addToGrid(QGridLayout *gridLayout) +{ + // if we are the first row to be inserted the show the legend + bool showLegend = (gridLayout->rowCount() == 1); + + if (false && !showLegend) { + QLayout *legendLayout = layout()->itemAt(0)->layout(); + Q_ASSERT(legendLayout); + // remove every item + while (legendLayout->count()) { + QLayoutItem *item = legendLayout->takeAt(0); + if (!item) { + continue; + } + // get widget from layout item + QWidget *widget = item->widget(); + if (widget) { + delete widget; + continue; + } + } + // and finally remove and delete the legend layout + layout()->removeItem(legendLayout); + delete legendLayout; + } + + QGridLayout *srcLayout = dynamic_cast(layout()); + Q_ASSERT(srcLayout); + + if (showLegend) { + Q_ASSERT(srcLayout); + int row = gridLayout->rowCount(); + for(int col = 0; col < srcLayout->columnCount(); col++) { + QLayoutItem *item = srcLayout->itemAtPosition(0, col); + if (!item) { + continue; + } + QWidget *widget = item->widget(); + if (widget) { + gridLayout->addWidget(widget, row, col); + continue; + } + } + } + + int row = gridLayout->rowCount(); + for(int col = 0; col < srcLayout->columnCount(); col++) { + QLayoutItem *item = srcLayout->itemAtPosition(1, col); + if (!item) { + continue; + } + QWidget *widget = item->widget(); + if (widget) { + gridLayout->addWidget(widget, row, col); + continue; + } + } + + // + setVisible(false); +} + /** * Restrict UI to protect users from accidental misuse. */ diff --git a/ground/openpilotgcs/src/plugins/config/outputchannelform.h b/ground/openpilotgcs/src/plugins/config/outputchannelform.h index a537f55e7..c854548b2 100644 --- a/ground/openpilotgcs/src/plugins/config/outputchannelform.h +++ b/ground/openpilotgcs/src/plugins/config/outputchannelform.h @@ -35,12 +35,14 @@ class OutputChannelForm : public ConfigTaskWidget { Q_OBJECT public: - explicit OutputChannelForm(const int index, QWidget *parent = NULL, const bool showLegend = false); + explicit OutputChannelForm(const int index, QWidget *parent = NULL); ~OutputChannelForm(); + friend class ConfigOutputWidget; void setAssignment(const QString &assignment); int index() const; + void addToGrid(QGridLayout *gridLayout); public slots: void max(int maximum); @@ -57,7 +59,7 @@ signals: private: Ui::outputChannelForm ui; - /// Channel index + // Channel index int m_index; bool m_inChannelTest; diff --git a/ground/openpilotgcs/src/plugins/config/outputchannelform.ui b/ground/openpilotgcs/src/plugins/config/outputchannelform.ui index 9e0c7fa1b..c5a542622 100644 --- a/ground/openpilotgcs/src/plugins/config/outputchannelform.ui +++ b/ground/openpilotgcs/src/plugins/config/outputchannelform.ui @@ -7,16 +7,13 @@ 0 0 772 - 57 + 51 Form - - - 6 - + 0 @@ -29,726 +26,711 @@ 0 - - - - 12 + + 12 + + + + + + 0 + 0 + - - - - - 0 - 0 - - - - - 20 - 20 - - - - - 16777215 - 16777215 - - - - - -1 - 75 - false - true - - - - Qt::LeftToRight - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); + + + 110 + 20 + + + + + 16777215 + 16777215 + + + + + -1 + 75 + false + true + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); color: rgb(255, 255, 255); border-radius: 5; font: bold 12px; margin:1px; - - - # - - - Qt::AlignCenter - - - 0 - - - - - - - - 0 - 0 - - - - - 110 - 20 - - - - - 16777215 - 16777215 - - - - - -1 - 75 - false - true - - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - Assignment - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 55 - 20 - - - - - 16777215 - 16777215 - - - - - -1 - 75 - false - true - - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - Min - - - Qt::AlignCenter - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - - - - - - 0 - 0 - - - - - 0 - 20 - - - - - -1 - 75 - false - true - - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - Neutral (slowest for motor) - - - Qt::AlignCenter - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - - - - - - 0 - 0 - - - - - 55 - 20 - - - - - 16777215 - 16777215 - - - - - -1 - 75 - false - true - - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - Max - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 75 - 20 - - - - - 16777215 - 16777215 - - - - - -1 - 75 - false - true - - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - Reversed - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 45 - 20 - - - - - 16777215 - 16777215 - - - - - -1 - 75 - false - true - - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - Link - - - Qt::AlignCenter - - - - + + + Assignment + + + Qt::AlignCenter + + - - - - 12 + + + + + 0 + 0 + - - - - - 0 - 0 - - - - - 20 - 25 - - - - - 20 - 16777215 - - - - Channel Number - - - 0: - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 110 - 25 - - - - - 110 - 16777215 - - - - - - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 55 - 25 - - - - - 55 - 16777215 - - - - Qt::StrongFocus - - - Minimum PWM value, beware of not overdriving your servo. - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - 9999 - - - 0 - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - - - - - - 0 - 0 - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 + + + 50 + 20 + + + + + 16777215 + 16777215 + + + + + -1 + 75 + false + true + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + Min + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 0 + 20 + + + + + -1 + 75 + false + true + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + Neutral (slowest for motor) + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + + + + + + 0 + 0 + + + + + 20 + 20 + + + + + 16777215 + 16777215 + + + + + -1 + 75 + false + true + + + + Qt::LeftToRight + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + # + + + Qt::AlignCenter + + + 0 + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 5 + 20 + + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + + 16777215 + 16777215 + + + + Qt::StrongFocus + + + Minimum PWM value, beware of not overdriving your servo. + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 9999 + + + 0 + + + + + + + + 0 + 0 + + + + + 20 + 0 + + + + + 16777215 + 16777215 + + + + Channel Number + + + 0: + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 50 + 20 + + + + + 16777215 + 16777215 + + + + + -1 + 75 + false + true + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + Max + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 75 + 20 + + + + + 16777215 + 16777215 + + + + + -1 + 75 + false + true + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + Reversed + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 45 + 20 + + + + + 16777215 + 16777215 + + + + + -1 + 75 + false + true + + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + Link + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 110 + 0 + + + + + 16777215 + 16777215 + + + + - + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + + 16777215 + 16777215 + + + + Qt::StrongFocus + + + Maximum PWM value, beware of not overdriving your servo. + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 9999 + + + + + + + + 0 + 0 + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 2 + + + 0 + + + 2 + + + 0 + + + + + + 0 + 0 + - - 0 + + + 50 + 0 + - - 0 + + Qt::StrongFocus - - 0 + + 9999 - - - - - 0 - 0 - - - - - 50 - 0 - - - - Qt::StrongFocus - - - 9999 - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - - 24 - 25 - - - - - 24 - 16777215 - - - - Current value of slider. - - - 0000 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - - - - - - 0 - 0 - - - - - 55 - 25 - - - - - 55 - 16777215 - - - - Qt::StrongFocus - - - Maximum PWM value, beware of not overdriving your servo. - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - 9999 - - - - - - - - 0 - 0 - - - - - 75 - 0 - - - - QFrame::NoFrame - - - - 0 + + Qt::Horizontal - - 0 + + + + + + + 0 + 0 + - - 0 + + + 20 + 0 + - - 0 + + + 16777215 + 16777215 + - - 0 + + Current value of slider. - - - - - 0 - 0 - - - - - 0 - 0 - - - - Qt::StrongFocus - - - Check to invert the channel. - - - - - - - - - - - 0 - 0 - - - - - 45 - 25 - - - - QFrame::NoFrame - - - QFrame::Plain - - - - 0 + + 0000 - - 0 + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - 0 + + + + + + + + + + 0 + 0 + + + + + 75 + 0 + + + + QFrame::NoFrame + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + - - 0 + + + 0 + 0 + - - 0 + + Qt::StrongFocus - - - - - 0 - 0 - - - - - 0 - 0 - - - - Qt::StrongFocus - - - Output mode - - - - - - - + + Check to invert the channel. + + + + + + + + + + + 0 + 0 + + + + + 45 + 0 + + + + QFrame::NoFrame + + + QFrame::Plain + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Qt::StrongFocus + + + Output mode + + + + + - - actuatorMin - actuatorMax - From 9012f0aa89ba9d477f945d5833311741309e65a6 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Sun, 11 May 2014 16:20:07 +0200 Subject: [PATCH 05/25] OP-1331 commented out useless GCS logging --- .../src/plugins/coreplugin/mainwindow.cpp | 2 +- .../src/plugins/uavobjects/uavobjectfield.cpp | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp b/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp index 12b89cd46..79f725c55 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp +++ b/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp @@ -270,7 +270,7 @@ void MainWindow::extensionsInitialized() // We'll use qApp macro to get the QApplication pointer // and set the style sheet application wide. - qDebug() << "Setting application style sheet to:" << style; + //qDebug() << "Setting application style sheet to:" << style; qApp->setStyleSheet(style); qs->endGroup(); diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp index 235448a57..0fad83714 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp @@ -199,14 +199,14 @@ void UAVObjectField::limitsInitialize(const QString &limits) elementLimits.insert(index, limitList); ++index; } - foreach(QList limitList, elementLimits) { - foreach(LimitStruct limit, limitList) { - qDebug() << "Limit type" << limit.type << "for board" << limit.board << "for field" << getName(); - foreach(QVariant var, limit.values) { - qDebug() << "value" << var; - } - } - } + // foreach(QList limitList, elementLimits) { + // foreach(LimitStruct limit, limitList) { + // qDebug() << "Limit type" << limit.type << "for board" << limit.board << "for field" << getName(); + // foreach(QVariant var, limit.values) { + // qDebug() << "value" << var; + // } + // } + // } } bool UAVObjectField::isWithinLimits(QVariant var, quint32 index, int board) { From fcc16367eb8ca5c201ed152254625b470847d6f9 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Sun, 11 May 2014 16:30:31 +0200 Subject: [PATCH 06/25] OP-1331 fixed compilation error in configgadgetwidet introduced with last commit --- ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp index 482f42add..b95baf502 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp @@ -147,7 +147,7 @@ ConfigGadgetWidget::ConfigGadgetWidget(QWidget *parent) : QWidget(parent) ConfigGadgetWidget::~ConfigGadgetWidget() { // TODO: properly delete all the tabs in stackWidget before exiting - delete stackWidget + delete stackWidget; } void ConfigGadgetWidget::startInputWizard() From 048ca0787f0b87c0bbdb80cfb31e38f19e173e6d Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Sun, 11 May 2014 17:32:04 +0200 Subject: [PATCH 07/25] OP-1343 GCS Config - Input Channel Response Time was not saved + Made visible only for relevant channels. --- ground/openpilotgcs/src/plugins/config/configinputwidget.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index b983a1e27..05ba198f2 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -96,7 +96,6 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : addWidgetBinding("ManualControlSettings", "ChannelMin", form->ui->channelMin, index); addWidgetBinding("ManualControlSettings", "ChannelMax", form->ui->channelMax, index); - addWidget(form->ui->channelResponseTime); addWidget(form->ui->channelRev); // Input filter response time fields supported for some channels only @@ -113,7 +112,7 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : case ManualControlSettings::CHANNELGROUPS_THROTTLE: case ManualControlSettings::CHANNELGROUPS_FLIGHTMODE: case ManualControlSettings::CHANNELGROUPS_COLLECTIVE: - form->ui->channelResponseTime->setEnabled(false); + form->ui->channelResponseTime->setVisible(false); break; default: Q_ASSERT(0); From b6a297c40fbdd67d9648f3aa76996665463cc09b Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Sun, 11 May 2014 17:42:44 +0200 Subject: [PATCH 08/25] OP-1159 Removed "Rev" checkboxes on input tab for channels on which it doesn't have an effect --- .../openpilotgcs/src/plugins/config/configinputwidget.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index 05ba198f2..491e36ab8 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -98,6 +98,13 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : addWidget(form->ui->channelRev); + // Reversing supported for some channels only + bool reversable = ((index == ManualControlSettings::CHANNELGROUPS_THROTTLE) || + (index == ManualControlSettings::CHANNELGROUPS_ROLL) || + (index == ManualControlSettings::CHANNELGROUPS_PITCH) || + (index == ManualControlSettings::CHANNELGROUPS_YAW)); + form->ui->channelRev->setVisible(reversable); + // Input filter response time fields supported for some channels only switch (index) { case ManualControlSettings::CHANNELGROUPS_ROLL: From 9cf24a97310cc17e492962a5e27b36dcbddc2c63 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Sun, 11 May 2014 17:46:37 +0200 Subject: [PATCH 09/25] OP-1331 minor tweaks to output channel form --- ground/openpilotgcs/src/plugins/config/outputchannelform.ui | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/outputchannelform.ui b/ground/openpilotgcs/src/plugins/config/outputchannelform.ui index c5a542622..da55a432b 100644 --- a/ground/openpilotgcs/src/plugins/config/outputchannelform.ui +++ b/ground/openpilotgcs/src/plugins/config/outputchannelform.ui @@ -554,7 +554,7 @@ margin:1px; - + 0 0 @@ -586,7 +586,7 @@ margin:1px; - 20 + 25 0 From 88100a72c2b222d86b9d9da35f43d4ddbd775d07 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Sun, 11 May 2014 18:48:39 +0200 Subject: [PATCH 10/25] OP-1331 OP-1335 revisited GComboBox to integer binding (less hacky now ;) ) --- .../src/plugins/uavobjects/uavobjectfield.cpp | 88 +++++-------------- .../src/plugins/uavobjects/uavobjectfield.h | 1 + .../uavobjectwidgetutils/configtaskwidget.cpp | 73 ++++++++------- .../uavobjectwidgetutils/configtaskwidget.h | 8 +- 4 files changed, 66 insertions(+), 104 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp index 0fad83714..fb88f9808 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp @@ -199,14 +199,14 @@ void UAVObjectField::limitsInitialize(const QString &limits) elementLimits.insert(index, limitList); ++index; } - // foreach(QList limitList, elementLimits) { - // foreach(LimitStruct limit, limitList) { - // qDebug() << "Limit type" << limit.type << "for board" << limit.board << "for field" << getName(); - // foreach(QVariant var, limit.values) { - // qDebug() << "value" << var; - // } - // } - // } + // foreach(QList limitList, elementLimits) { + // foreach(LimitStruct limit, limitList) { + // qDebug() << "Limit type" << limit.type << "for board" << limit.board << "for field" << getName(); + // foreach(QVariant var, limit.values) { + // qDebug() << "value" << var; + // } + // } + // } } bool UAVObjectField::isWithinLimits(QVariant var, quint32 index, int board) { @@ -811,44 +811,31 @@ bool UAVObjectField::isNumeric() { switch (type) { case INT8: - return true; - - break; case INT16: - return true; - - break; case INT32: - return true; - - break; case UINT8: - return true; - - break; case UINT16: - return true; - - break; case UINT32: - return true; - - break; case FLOAT32: return true; break; - case ENUM: + default: return false; + } +} - break; - case BITFIELD: +bool UAVObjectField::isInteger() +{ + switch (type) { + case INT8: + case INT16: + case INT32: + case UINT8: + case UINT16: + case UINT32: return true; - break; - case STRING: - return false; - break; default: return false; @@ -858,42 +845,7 @@ bool UAVObjectField::isNumeric() bool UAVObjectField::isText() { switch (type) { - case INT8: - return false; - - break; - case INT16: - return false; - - break; - case INT32: - return false; - - break; - case UINT8: - return false; - - break; - case UINT16: - return false; - - break; - case UINT32: - return false; - - break; - case FLOAT32: - return false; - - break; case ENUM: - return true; - - break; - case BITFIELD: - return false; - - break; case STRING: return true; diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.h b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.h index 141fa6af7..778096729 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.h +++ b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.h @@ -71,6 +71,7 @@ public: quint32 getDataOffset(); quint32 getNumBytes(); bool isNumeric(); + bool isInteger(); bool isText(); QString toString(); void toXML(QXmlStreamWriter *xmlWriter); diff --git a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp index bc0a52f6d..19c9ff8fb 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp @@ -182,9 +182,9 @@ void ConfigTaskWidget::setWidgetBindingObjectEnabled(QString objectName, bool en binding->setIsEnabled(enabled); if (enabled) { if (binding->value().isValid() && !binding->value().isNull()) { - setWidgetFromVariant(binding->widget(), binding->value(), binding->scale()); + setWidgetFromVariant(binding->widget(), binding->value(), binding); } else { - setWidgetFromField(binding->widget(), binding->field(), binding->index(), binding->scale(), binding->isLimited()); + setWidgetFromField(binding->widget(), binding->field(), binding); } } } @@ -289,7 +289,7 @@ void ConfigTaskWidget::populateWidgets() foreach(WidgetBinding * binding, m_widgetBindingsPerObject) { if (binding->isEnabled() && binding->object() != NULL && binding->field() != NULL && binding->widget() != NULL) { - setWidgetFromField(binding->widget(), binding->field(), binding->index(), binding->scale(), binding->isLimited()); + setWidgetFromField(binding->widget(), binding->field(), binding); } } setDirty(dirtyBack); @@ -305,7 +305,7 @@ void ConfigTaskWidget::refreshWidgetsValues(UAVObject *obj) emit refreshWidgetsValuesRequested(); foreach(WidgetBinding * binding, m_widgetBindingsPerObject.values(obj)) { if (binding->isEnabled() && binding->field() != NULL && binding->widget() != NULL) { - setWidgetFromField(binding->widget(), binding->field(), binding->index(), binding->scale(), binding->isLimited()); + setWidgetFromField(binding->widget(), binding->field(), binding); } } setDirty(dirtyBack); @@ -385,13 +385,15 @@ void ConfigTaskWidget::forceShadowUpdates() if (!binding->isEnabled()) { continue; } - QVariant widgetValue = getVariantFromWidget(binding->widget(), binding->scale(), binding->units(), binding->type()); + QVariant widgetValue = getVariantFromWidget(binding->widget(), binding); foreach(ShadowWidgetBinding * shadow, binding->shadows()) { disconnectWidgetUpdatesToSlot(shadow->widget(), SLOT(widgetsContentsChanged())); checkWidgetsLimits(shadow->widget(), binding->field(), binding->index(), shadow->isLimited(), widgetValue, shadow->scale()); - setWidgetFromVariant(shadow->widget(), widgetValue, shadow->scale()); + + WidgetBinding tmpBinding(shadow->widget(), binding->object(), binding->field(), binding->index(), shadow->scale(), shadow->isLimited()); + setWidgetFromVariant(shadow->widget(), widgetValue, &tmpBinding); emit widgetContentsChanged(shadow->widget()); connectWidgetUpdatesToSlot(shadow->widget(), SLOT(widgetsContentsChanged())); @@ -410,19 +412,18 @@ void ConfigTaskWidget::widgetsContentsChanged() foreach(WidgetBinding * binding, m_widgetBindingsPerWidget.values(emitter)) { if (binding && binding->isEnabled()) { if (binding->widget() == emitter) { - scale = binding->scale(); checkWidgetsLimits(emitter, binding->field(), binding->index(), binding->isLimited(), - getVariantFromWidget(emitter, scale, binding->units(), binding->type()), scale); + getVariantFromWidget(emitter, binding), binding->scale()); } else { foreach(ShadowWidgetBinding * shadow, binding->shadows()) { if (shadow->widget() == emitter) { - scale = shadow->scale(); - checkWidgetsLimits(emitter, binding->field(), binding->index(), shadow->isLimited(), - getVariantFromWidget(emitter, scale, binding->units(), binding->type()), scale); + WidgetBinding tmpBinding(shadow->widget(), binding->object(), binding->field(), binding->index(), shadow->scale(), shadow->isLimited()); + QVariant value = getVariantFromWidget(emitter, &tmpBinding); + checkWidgetsLimits(emitter, binding->field(), binding->index(), shadow->isLimited(), value, scale); } } } - value = getVariantFromWidget(emitter, scale, binding->units(), binding->type()); + value = getVariantFromWidget(emitter, binding); binding->setValue(value); if (binding->widget() != emitter) { @@ -430,7 +431,7 @@ void ConfigTaskWidget::widgetsContentsChanged() checkWidgetsLimits(binding->widget(), binding->field(), binding->index(), binding->isLimited(), value, binding->scale()); - setWidgetFromVariant(binding->widget(), value, binding->scale()); + setWidgetFromVariant(binding->widget(), value, binding); emit widgetContentsChanged(binding->widget()); connectWidgetUpdatesToSlot(binding->widget(), SLOT(widgetsContentsChanged())); @@ -441,7 +442,8 @@ void ConfigTaskWidget::widgetsContentsChanged() checkWidgetsLimits(shadow->widget(), binding->field(), binding->index(), shadow->isLimited(), value, shadow->scale()); - setWidgetFromVariant(shadow->widget(), value, shadow->scale()); + WidgetBinding tmp(shadow->widget(), binding->object(), binding->field(), binding->index(), shadow->scale(), shadow->isLimited()); + setWidgetFromVariant(shadow->widget(), value, &tmp); emit widgetContentsChanged(shadow->widget()); connectWidgetUpdatesToSlot(shadow->widget(), SLOT(widgetsContentsChanged())); @@ -736,7 +738,7 @@ void ConfigTaskWidget::defaultButtonClicked() continue; } UAVDataObject *temp = ((UAVDataObject *)binding->object())->dirtyClone(); - setWidgetFromField(binding->widget(), temp->getField(binding->field()->getName()), binding->index(), binding->scale(), binding->isLimited()); + setWidgetFromField(binding->widget(), temp->getField(binding->field()->getName()), binding); } } @@ -779,7 +781,7 @@ void ConfigTaskWidget::reloadButtonClicked() if (m_realtimeUpdateTimer->isActive()) { binding->object()->requestUpdate(); if (binding->widget()) { - setWidgetFromField(binding->widget(), binding->field(), binding->index(), binding->scale(), binding->isLimited()); + setWidgetFromField(binding->widget(), binding->field(), binding); } } m_realtimeUpdateTimer->stop(); @@ -851,10 +853,12 @@ void ConfigTaskWidget::disconnectWidgetUpdatesToSlot(QWidget *widget, const char } } -QVariant ConfigTaskWidget::getVariantFromWidget(QWidget *widget, double scale, QString units, QString type) +QVariant ConfigTaskWidget::getVariantFromWidget(QWidget *widget, WidgetBinding *binding) { + double scale = binding->scale(); + if (QComboBox * cb = qobject_cast(widget)) { - if (type.startsWith("int") || type.startsWith("uint")) { + if (binding->isInteger()) { return cb->currentIndex(); } return (QString)cb->currentText(); @@ -868,7 +872,7 @@ QVariant ConfigTaskWidget::getVariantFromWidget(QWidget *widget, double scale, Q return (QString)(cb->isChecked() ? "TRUE" : "FALSE"); } else if (QLineEdit * cb = qobject_cast(widget)) { QString value = (QString)cb->displayText(); - if (units == "hex") { + if (binding->units() == "hex") { bool ok; return value.toUInt(&ok, 16); } else { @@ -879,11 +883,13 @@ QVariant ConfigTaskWidget::getVariantFromWidget(QWidget *widget, double scale, Q } } -bool ConfigTaskWidget::setWidgetFromVariant(QWidget *widget, QVariant value, double scale, QString units, QString type) +bool ConfigTaskWidget::setWidgetFromVariant(QWidget *widget, QVariant value, WidgetBinding *binding) { + double scale = binding->scale(); + if (QComboBox * cb = qobject_cast(widget)) { bool ok = true; - if (type.startsWith("int") || type.startsWith("uint")) { + if (binding->isInteger()) { cb->setCurrentIndex(value.toInt(&ok)); } else { cb->setCurrentIndex(cb->findText(value.toString())); @@ -911,7 +917,7 @@ bool ConfigTaskWidget::setWidgetFromVariant(QWidget *widget, QVariant value, dou return true; } else if (QLineEdit * cb = qobject_cast(widget)) { if ((scale == 0) || (scale == 1)) { - if (units == "hex") { + if (binding->units() == "hex") { cb->setText(QString::number(value.toUInt(), 16).toUpper()); } else { cb->setText(value.toString()); @@ -925,24 +931,19 @@ bool ConfigTaskWidget::setWidgetFromVariant(QWidget *widget, QVariant value, dou } } -bool ConfigTaskWidget::setWidgetFromVariant(QWidget *widget, QVariant value, double scale) -{ - return setWidgetFromVariant(widget, value, scale, QString(), QString()); -} - -bool ConfigTaskWidget::setWidgetFromField(QWidget *widget, UAVObjectField *field, int index, double scale, bool hasLimits) +bool ConfigTaskWidget::setWidgetFromField(QWidget *widget, UAVObjectField *field, WidgetBinding *binding) { if (!widget || !field) { return false; } if (QComboBox * cb = qobject_cast(widget)) { if (cb->count() == 0) { - loadWidgetLimits(cb, field, index, hasLimits, scale); + loadWidgetLimits(cb, field, binding->index(), binding->isLimited(), binding->scale()); } } - QVariant value = field->getValue(index); - checkWidgetsLimits(widget, field, index, hasLimits, value, scale); - bool result = setWidgetFromVariant(widget, value, scale, field->getUnits(), field->getTypeAsString()); + QVariant value = field->getValue(binding->index()); + checkWidgetsLimits(widget, field, binding->index(), binding->isLimited(), value, binding->scale()); + bool result = setWidgetFromVariant(widget, value, binding); if (result) { return true; } else { @@ -1117,6 +1118,14 @@ QString WidgetBinding::type() const return QString(); } +bool WidgetBinding::isInteger() const +{ + if (m_field) { + return m_field->isInteger(); + } + return false; +} + UAVObject *WidgetBinding::object() const { return m_object; diff --git a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.h b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.h index 40ce92272..048c4fc98 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.h +++ b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.h @@ -70,6 +70,7 @@ public: QString units() const; QString type() const; + bool isInteger() const; UAVObject *object() const; UAVObjectField *field() const; int index() const; @@ -222,11 +223,10 @@ private: QString m_outOfLimitsStyle; QTimer *m_realtimeUpdateTimer; - bool setWidgetFromField(QWidget *widget, UAVObjectField *field, int index, double scale, bool hasLimits); + bool setWidgetFromField(QWidget *widget, UAVObjectField *field, WidgetBinding *binding); - QVariant getVariantFromWidget(QWidget *widget, double scale, const QString units, QString type); - bool setWidgetFromVariant(QWidget *widget, QVariant value, double scale, QString units, QString type); - bool setWidgetFromVariant(QWidget *widget, QVariant value, double scale); + QVariant getVariantFromWidget(QWidget *widget, WidgetBinding *binding); + bool setWidgetFromVariant(QWidget *widget, QVariant value, WidgetBinding *binding); void connectWidgetUpdatesToSlot(QWidget *widget, const char *function); void disconnectWidgetUpdatesToSlot(QWidget *widget, const char *function); From 7affc8d12fa219726191a41d984b89637d1eabbf Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Sun, 11 May 2014 18:53:49 +0200 Subject: [PATCH 11/25] OP-1331 OP-1335 BITFIELD was removed by mistake from UAVObjectField::isNumeric() (self review) --- ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp index fb88f9808..1ab86536a 100644 --- a/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjects/uavobjectfield.cpp @@ -817,6 +817,7 @@ bool UAVObjectField::isNumeric() case UINT16: case UINT32: case FLOAT32: + case BITFIELD: return true; break; From 38b0617596cb2bcc877ba72ea8a22033e5ae1b0e Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Sun, 11 May 2014 22:08:35 +0200 Subject: [PATCH 12/25] OP-1331 uncrustified --- ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp b/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp index 79f725c55..81817c5d1 100644 --- a/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp +++ b/ground/openpilotgcs/src/plugins/coreplugin/mainwindow.cpp @@ -270,7 +270,7 @@ void MainWindow::extensionsInitialized() // We'll use qApp macro to get the QApplication pointer // and set the style sheet application wide. - //qDebug() << "Setting application style sheet to:" << style; + // qDebug() << "Setting application style sheet to:" << style; qApp->setStyleSheet(style); qs->endGroup(); From 6804e5fe8e678939eb84952ee0e1faf9f8209f75 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Mon, 12 May 2014 22:30:50 +0200 Subject: [PATCH 13/25] OP-1331 factored common code between InputChannelForm and OutputChannelForm into new abstract class ChannelForm --- .../src/plugins/config/channelform.cpp | 73 +++++++++++ .../src/plugins/config/channelform.h | 36 ++++++ .../src/plugins/config/config.pro | 19 ++- .../src/plugins/config/configinputwidget.cpp | 10 +- .../src/plugins/config/configoutputwidget.cpp | 16 +-- .../src/plugins/config/configoutputwidget.h | 10 +- .../src/plugins/config/inputchannelform.cpp | 70 ++-------- .../src/plugins/config/inputchannelform.h | 9 +- .../src/plugins/config/outputchannelform.cpp | 121 ++++++------------ .../src/plugins/config/outputchannelform.h | 44 ++----- 10 files changed, 203 insertions(+), 205 deletions(-) create mode 100644 ground/openpilotgcs/src/plugins/config/channelform.cpp create mode 100644 ground/openpilotgcs/src/plugins/config/channelform.h diff --git a/ground/openpilotgcs/src/plugins/config/channelform.cpp b/ground/openpilotgcs/src/plugins/config/channelform.cpp new file mode 100644 index 000000000..a15a5f713 --- /dev/null +++ b/ground/openpilotgcs/src/plugins/config/channelform.cpp @@ -0,0 +1,73 @@ +#include "channelform.h" + +#include + + +ChannelForm::ChannelForm(const int index, QWidget *parent) : ConfigTaskWidget(parent), m_index(index) +{} + +ChannelForm::~ChannelForm() +{} + +int ChannelForm::index() const +{ + return m_index; +} + +void ChannelForm::moveTo(QGridLayout &dstLayout) +{ + QGridLayout *srcLayout = dynamic_cast(layout()); + + Q_ASSERT(srcLayout); + + // if we are the first row to be inserted then show the legend + bool showLegend = (dstLayout.rowCount() == 1); + + if (showLegend) { + // move legend row to target grid layout + moveRow(0, *srcLayout, dstLayout); + } else { + removeRow(0, *srcLayout); + } + + // move field row to target grid layout + moveRow(1, *srcLayout, dstLayout); + + // this form is now empty so hide it + setVisible(false); +} + +void ChannelForm::moveRow(int row, QGridLayout &srcLayout, QGridLayout &dstLayout) +{ + int dstRow = dstLayout.rowCount(); + + for (int col = 0; col < srcLayout.columnCount(); col++) { + QLayoutItem *item = srcLayout.itemAtPosition(row, col); + if (!item) { + continue; + } + QWidget *widget = item->widget(); + if (widget) { + dstLayout.addWidget(widget, dstRow, col); + continue; + } + // TODO handle item of type QLayout + } +} + +void ChannelForm::removeRow(int row, QGridLayout &layout) +{ + for (int col = 0; col < layout.columnCount(); col++) { + QLayoutItem *item = layout.itemAtPosition(row, col); + if (!item) { + continue; + } + QWidget *widget = item->widget(); + if (widget) { + layout.removeWidget(widget); + delete widget; + continue; + } + // TODO handle item of type QLayout + } +} diff --git a/ground/openpilotgcs/src/plugins/config/channelform.h b/ground/openpilotgcs/src/plugins/config/channelform.h new file mode 100644 index 000000000..6c62a2f4b --- /dev/null +++ b/ground/openpilotgcs/src/plugins/config/channelform.h @@ -0,0 +1,36 @@ +#ifndef CHANNELFORM_H +#define CHANNELFORM_H + +#include "configtaskwidget.h" + +#include + +namespace Ui { +class ChannelForm; +} + +class QGridLayout; + +class ChannelForm : public ConfigTaskWidget { + Q_OBJECT + +public: + explicit ChannelForm(const int index, QWidget *parent = 0); + ~ChannelForm(); + + int index() const; + + virtual QString name() = 0; + virtual void setName(const QString &name) = 0; + + void moveTo(QGridLayout &dstLayout); + +private: + // Channel index + int m_index; + + static void moveRow(int row, QGridLayout &srcLayout, QGridLayout &dstLayout); + static void removeRow(int row, QGridLayout &layout); +}; + +#endif // CHANNELFORM_H diff --git a/ground/openpilotgcs/src/plugins/config/config.pro b/ground/openpilotgcs/src/plugins/config/config.pro index 06b56a8f1..747557191 100644 --- a/ground/openpilotgcs/src/plugins/config/config.pro +++ b/ground/openpilotgcs/src/plugins/config/config.pro @@ -1,18 +1,19 @@ TEMPLATE = lib TARGET = Config DEFINES += CONFIG_LIBRARY -QT += svg -QT += opengl -QT += qml quick + +QT += svg opengl qml quick include(config_dependencies.pri) INCLUDEPATH += ../../libs/eigen -OTHER_FILES += Config.pluginspec \ +OTHER_FILES += \ + Config.pluginspec \ calibration/WizardStepIndicator.qml -HEADERS += configplugin.h \ +HEADERS += \ + configplugin.h \ configgadgetwidget.h \ configgadgetfactory.h \ configgadget.h \ @@ -27,6 +28,7 @@ HEADERS += configplugin.h \ assertions.h \ defaultattitudewidget.h \ defaulthwsettingswidget.h \ + channelform.h \ inputchannelform.h \ configcamerastabilizationwidget.h \ configtxpidwidget.h \ @@ -53,7 +55,8 @@ HEADERS += configplugin.h \ calibration/thermal/settingshandlingtransitions.h \ calibration/thermal/compensationcalculationtransition.h -SOURCES += configplugin.cpp \ +SOURCES += \ + configplugin.cpp \ configgadgetwidget.cpp \ configgadgetfactory.cpp \ configgadget.cpp \ @@ -67,6 +70,7 @@ SOURCES += configplugin.cpp \ configpipxtremewidget.cpp \ defaultattitudewidget.cpp \ defaulthwsettingswidget.cpp \ + channelform.cpp \ inputchannelform.cpp \ configcamerastabilizationwidget.cpp \ configrevowidget.cpp \ @@ -88,7 +92,8 @@ SOURCES += configplugin.cpp \ calibration/thermal/thermalcalibrationhelper.cpp \ calibration/thermal/thermalcalibrationmodel.cpp -FORMS += airframe.ui \ +FORMS += \ + airframe.ui \ airframe_ccpm.ui \ airframe_fixedwing.ui \ airframe_ground.ui \ diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index 491e36ab8..709eabf8f 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -80,9 +80,9 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : unsigned int indexRT = 0; foreach(QString name, manualSettingsObj->getField("ChannelNumber")->getElementNames()) { Q_ASSERT(index < ManualControlSettings::CHANNELGROUPS_NUMELEM); - InputChannelForm *form = new InputChannelForm(this); - form->addToGrid(ui->channelLayout); + InputChannelForm *form = new InputChannelForm(index, this); form->setName(name); + form->moveTo(*(ui->channelLayout)); // The order of the following binding calls is important. Since the values will be populated // in reverse order of the binding order otherwise the 'Reversed' logic will floor the neutral value @@ -100,9 +100,9 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : // Reversing supported for some channels only bool reversable = ((index == ManualControlSettings::CHANNELGROUPS_THROTTLE) || - (index == ManualControlSettings::CHANNELGROUPS_ROLL) || - (index == ManualControlSettings::CHANNELGROUPS_PITCH) || - (index == ManualControlSettings::CHANNELGROUPS_YAW)); + (index == ManualControlSettings::CHANNELGROUPS_ROLL) || + (index == ManualControlSettings::CHANNELGROUPS_PITCH) || + (index == ManualControlSettings::CHANNELGROUPS_YAW)); form->ui->channelRev->setVisible(reversable); // Input filter response time fields supported for some channels only diff --git a/ground/openpilotgcs/src/plugins/config/configoutputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configoutputwidget.cpp index 5108d9b0f..ba9618eea 100644 --- a/ground/openpilotgcs/src/plugins/config/configoutputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configoutputwidget.cpp @@ -77,7 +77,7 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren // Register for ActuatorSettings changes: for (unsigned int i = 0; i < ActuatorCommand::CHANNEL_NUMELEM; i++) { OutputChannelForm *form = new OutputChannelForm(i, this); - form->addToGrid(ui->channelLayout); + form->moveTo(*(ui->channelLayout)); connect(ui->channelOutTest, SIGNAL(toggled(bool)), form, SLOT(enableChannelTest(bool))); connect(form, SIGNAL(channelChanged(int, int)), this, SLOT(sendChannelTest(int, int))); @@ -196,7 +196,7 @@ OutputChannelForm *ConfigOutputWidget::getOutputChannelForm(const int index) con /** * Set the label for a channel output assignement */ -void ConfigOutputWidget::assignOutputChannel(UAVDataObject *obj, QString str) +void ConfigOutputWidget::assignOutputChannel(UAVDataObject *obj, QString &str) { // FIXME: use signal/ slot approach UAVObjectField *field = obj->getField(str); @@ -206,7 +206,7 @@ void ConfigOutputWidget::assignOutputChannel(UAVDataObject *obj, QString str) OutputChannelForm *outputChannelForm = getOutputChannelForm(index); if (outputChannelForm) { - outputChannelForm->setAssignment(str); + outputChannelForm->setName(str); } } @@ -256,15 +256,15 @@ void ConfigOutputWidget::refreshWidgetsValues(UAVObject *obj) // Initialize output forms QList outputChannelForms = findChildren(); foreach(OutputChannelForm * outputChannelForm, outputChannelForms) { - outputChannelForm->setAssignment(ChannelDesc[outputChannelForm->index()]); + outputChannelForm->setName(ChannelDesc[outputChannelForm->index()]); // init min,max,neutral int minValue = actuatorSettingsData.ChannelMin[outputChannelForm->index()]; int maxValue = actuatorSettingsData.ChannelMax[outputChannelForm->index()]; - outputChannelForm->minmax(minValue, maxValue); + outputChannelForm->setRange(minValue, maxValue); int neutral = actuatorSettingsData.ChannelNeutral[outputChannelForm->index()]; - outputChannelForm->neutral(neutral); + outputChannelForm->setNeutral(neutral); } // Get the SpinWhileArmed setting @@ -351,10 +351,10 @@ void ConfigOutputWidget::refreshWidgetsValues(UAVObject *obj) int minValue = actuatorSettingsData.ChannelMin[outputChannelForm->index()]; int maxValue = actuatorSettingsData.ChannelMax[outputChannelForm->index()]; - outputChannelForm->minmax(minValue, maxValue); + outputChannelForm->setRange(minValue, maxValue); int neutral = actuatorSettingsData.ChannelNeutral[outputChannelForm->index()]; - outputChannelForm->neutral(neutral); + outputChannelForm->setNeutral(neutral); } setDirty(dirty); diff --git a/ground/openpilotgcs/src/plugins/config/configoutputwidget.h b/ground/openpilotgcs/src/plugins/config/configoutputwidget.h index 1cabfb5a2..fda2922c6 100644 --- a/ground/openpilotgcs/src/plugins/config/configoutputwidget.h +++ b/ground/openpilotgcs/src/plugins/config/configoutputwidget.h @@ -47,6 +47,8 @@ public: ConfigOutputWidget(QWidget *parent = 0); ~ConfigOutputWidget(); +protected: + void enableControls(bool enable); private: Ui_OutputWidget *ui; @@ -55,14 +57,14 @@ private: void updateChannelInSlider(QSlider *slider, QLabel *min, QLabel *max, QCheckBox *rev, int value); - void assignChannel(UAVDataObject *obj, QString str); - void assignOutputChannel(UAVDataObject *obj, QString str); + void assignOutputChannel(UAVDataObject *obj, QString &str); OutputChannelForm *getOutputChannelForm(const int index) const; int mccDataRate; UAVObject::Metadata accInitialData; bool wasItMe; + private slots: void stopTests(); void disableIfNotMe(UAVObject *obj); @@ -71,8 +73,6 @@ private slots: void runChannelTests(bool state); void sendChannelTest(int index, int value); void openHelp(); -protected: - void enableControls(bool enable); }; -#endif // ifndef CONFIGOUTPUTWIDGET_H +#endif // CONFIGOUTPUTWIDGET_H diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp b/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp index 788b96d2f..8d5ff8c7f 100644 --- a/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.cpp @@ -4,7 +4,8 @@ #include "manualcontrolsettings.h" #include "gcsreceiver.h" -InputChannelForm::InputChannelForm(QWidget *parent) : ConfigTaskWidget(parent), ui(new Ui::InputChannelForm) +InputChannelForm::InputChannelForm(const int index, QWidget *parent) : + ChannelForm(index, parent), ui(new Ui::InputChannelForm) { ui->setupUi(this); @@ -22,70 +23,15 @@ InputChannelForm::~InputChannelForm() delete ui; } -void InputChannelForm::addToGrid(QGridLayout *gridLayout) +QString InputChannelForm::name() { - // if we are the first row to be inserted the show the legend - bool showLegend = (gridLayout->rowCount() == 1); - - // The first time through the loop, keep the legend. All other times, delete it. - if (false && !showLegend) { - QLayout *legendLayout = layout()->itemAt(0)->layout(); - Q_ASSERT(legendLayout); - // remove every item - while (legendLayout->count()) { - QLayoutItem *item = legendLayout->takeAt(0); - if (!item) { - continue; - } - // get widget from layout item - QWidget *widget = item->widget(); - if (widget) { - delete widget; - continue; - } - } - // and finally remove and delete the legend layout - layout()->removeItem(legendLayout); - delete legendLayout; - } - - QGridLayout *srcLayout = dynamic_cast(layout()); - Q_ASSERT(srcLayout); - - if (showLegend) { - Q_ASSERT(srcLayout); - int row = gridLayout->rowCount(); - for(int col = 0; col < srcLayout->columnCount(); col++) { - QLayoutItem *item = srcLayout->itemAtPosition(0, col); - if (!item) { - continue; - } - QWidget *widget = item->widget(); - if (widget) { - gridLayout->addWidget(widget, row, col); - continue; - } - } - } - - int row = gridLayout->rowCount(); - for(int col = 0; col < srcLayout->columnCount(); col++) { - QLayoutItem *item = srcLayout->itemAtPosition(1, col); - if (!item) { - continue; - } - QWidget *widget = item->widget(); - if (widget) { - gridLayout->addWidget(widget, row, col); - continue; - } - } - - // - setVisible(false); + return ui->channelName->text(); } -void InputChannelForm::setName(QString &name) +/** + * Set the channel assignment label. + */ +void InputChannelForm::setName(const QString &name) { ui->channelName->setText(name); } diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.h b/ground/openpilotgcs/src/plugins/config/inputchannelform.h index ad17d0963..f48bcbd0a 100644 --- a/ground/openpilotgcs/src/plugins/config/inputchannelform.h +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.h @@ -1,6 +1,7 @@ #ifndef INPUTCHANNELFORM_H #define INPUTCHANNELFORM_H +#include "channelform.h" #include "configinputwidget.h" #include @@ -9,17 +10,17 @@ namespace Ui { class InputChannelForm; } -class InputChannelForm : public ConfigTaskWidget { +class InputChannelForm : public ChannelForm { Q_OBJECT public: - explicit InputChannelForm(QWidget *parent = 0); + explicit InputChannelForm(const int index, QWidget *parent = NULL); ~InputChannelForm(); friend class ConfigInputWidget; - void setName(QString &name); - void addToGrid(QGridLayout *gridLayout); + virtual QString name(); + virtual void setName(const QString &name); private slots: void minMaxUpdated(); diff --git a/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp b/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp index b5d9c2358..da8514855 100644 --- a/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp +++ b/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp @@ -26,15 +26,14 @@ */ #include "outputchannelform.h" -#include "configoutputwidget.h" OutputChannelForm::OutputChannelForm(const int index, QWidget *parent) : - ConfigTaskWidget(parent), ui(), m_index(index), m_inChannelTest(false) + ChannelForm(index, parent), ui(), m_inChannelTest(false) { ui.setupUi(this); // The convention for OP is Channel 1 to Channel 10. - ui.actuatorNumber->setText(QString("%1:").arg(m_index + 1)); + ui.actuatorNumber->setText(QString("%1:").arg(index + 1)); // Register for ActuatorSettings changes: connect(ui.actuatorMin, SIGNAL(editingFinished()), this, SLOT(setChannelRange())); @@ -54,66 +53,17 @@ OutputChannelForm::~OutputChannelForm() // Do nothing } -void OutputChannelForm::addToGrid(QGridLayout *gridLayout) +QString OutputChannelForm::name() { - // if we are the first row to be inserted the show the legend - bool showLegend = (gridLayout->rowCount() == 1); + return ui.actuatorName->text(); +} - if (false && !showLegend) { - QLayout *legendLayout = layout()->itemAt(0)->layout(); - Q_ASSERT(legendLayout); - // remove every item - while (legendLayout->count()) { - QLayoutItem *item = legendLayout->takeAt(0); - if (!item) { - continue; - } - // get widget from layout item - QWidget *widget = item->widget(); - if (widget) { - delete widget; - continue; - } - } - // and finally remove and delete the legend layout - layout()->removeItem(legendLayout); - delete legendLayout; - } - - QGridLayout *srcLayout = dynamic_cast(layout()); - Q_ASSERT(srcLayout); - - if (showLegend) { - Q_ASSERT(srcLayout); - int row = gridLayout->rowCount(); - for(int col = 0; col < srcLayout->columnCount(); col++) { - QLayoutItem *item = srcLayout->itemAtPosition(0, col); - if (!item) { - continue; - } - QWidget *widget = item->widget(); - if (widget) { - gridLayout->addWidget(widget, row, col); - continue; - } - } - } - - int row = gridLayout->rowCount(); - for(int col = 0; col < srcLayout->columnCount(); col++) { - QLayoutItem *item = srcLayout->itemAtPosition(1, col); - if (!item) { - continue; - } - QWidget *widget = item->widget(); - if (widget) { - gridLayout->addWidget(widget, row, col); - continue; - } - } - - // - setVisible(false); +/** + * Set the channel assignment label. + */ +void OutputChannelForm::setName(const QString &name) +{ + ui.actuatorName->setText(name); } /** @@ -184,26 +134,49 @@ void OutputChannelForm::linkToggled(bool state) } } +int OutputChannelForm::max() const +{ + return ui.actuatorMax->value(); +} + /** * Set maximal channel value. */ -void OutputChannelForm::max(int maximum) +void OutputChannelForm::setMax(int maximum) { - minmax(ui.actuatorMin->value(), maximum); + setRange(ui.actuatorMin->value(), maximum); +} + +int OutputChannelForm::min() const +{ + return ui.actuatorMin->value(); } /** * Set minimal channel value. */ -void OutputChannelForm::min(int minimum) +void OutputChannelForm::setMin(int minimum) { - minmax(minimum, ui.actuatorMax->value()); + setRange(minimum, ui.actuatorMax->value()); +} + +int OutputChannelForm::neutral() const +{ + return ui.actuatorNeutral->value(); +} + +/** + * Set neutral of channel. + */ +void OutputChannelForm::setNeutral(int value) +{ + ui.actuatorNeutral->setValue(value); } /** * Set minimal and maximal channel value. */ -void OutputChannelForm::minmax(int minimum, int maximum) +void OutputChannelForm::setRange(int minimum, int maximum) { ui.actuatorMin->setValue(minimum); ui.actuatorMax->setValue(maximum); @@ -215,22 +188,6 @@ void OutputChannelForm::minmax(int minimum, int maximum) } } -/** - * Set neutral of channel. - */ -void OutputChannelForm::neutral(int value) -{ - ui.actuatorNeutral->setValue(value); -} - -/** - * Set the channel assignment label. - */ -void OutputChannelForm::setAssignment(const QString &assignment) -{ - ui.actuatorName->setText(assignment); -} - /** * Sets the minimum/maximum value of the channel output sliders. * Have to do it here because setMinimum is not a slot. diff --git a/ground/openpilotgcs/src/plugins/config/outputchannelform.h b/ground/openpilotgcs/src/plugins/config/outputchannelform.h index c854548b2..78d008115 100644 --- a/ground/openpilotgcs/src/plugins/config/outputchannelform.h +++ b/ground/openpilotgcs/src/plugins/config/outputchannelform.h @@ -27,11 +27,13 @@ #ifndef OUTPUTCHANNELFORM_H #define OUTPUTCHANNELFORM_H -#include +#include "channelform.h" +#include "configoutputwidget.h" #include "ui_outputchannelform.h" -#include "configtaskwidget.h" -class OutputChannelForm : public ConfigTaskWidget { +#include + +class OutputChannelForm : public ChannelForm { Q_OBJECT public: @@ -40,18 +42,17 @@ public: friend class ConfigOutputWidget; - void setAssignment(const QString &assignment); - int index() const; - void addToGrid(QGridLayout *gridLayout); + virtual QString name(); + virtual void setName(const QString &name); public slots: - void max(int maximum); - int max() const; - void min(int minimum); int min() const; - void minmax(int minimum, int maximum); - void neutral(int value); + void setMin(int minimum); + int max() const; + void setMax(int maximum); int neutral() const; + void setNeutral(int value); + void setRange(int minimum, int maximum); void enableChannelTest(bool state); signals: @@ -59,8 +60,6 @@ signals: private: Ui::outputChannelForm ui; - // Channel index - int m_index; bool m_inChannelTest; private slots: @@ -70,23 +69,4 @@ private slots: void setChannelRange(); }; -inline int OutputChannelForm::index() const -{ - return m_index; -} - -inline int OutputChannelForm::max() const -{ - return ui.actuatorMax->value(); -} - -inline int OutputChannelForm::min() const -{ - return ui.actuatorMin->value(); -} - -inline int OutputChannelForm::neutral() const -{ - return ui.actuatorNeutral->value(); -} #endif // OUTPUTCHANNELFORM_H From e9f14544f9e06220232cd8832f23107d7fe171de Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Mon, 12 May 2014 22:42:01 +0200 Subject: [PATCH 14/25] OP-1346 GCS was not allowing setting the ResponseTime for the Collective input channel. Worse GCS would then shift the values (Accessory0 would go to Collective, Accessory1 to Accessory0, Accessory2 to Accessory1 and Accessory2 would always be zero) --- ground/openpilotgcs/src/plugins/config/configinputwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp index 709eabf8f..1f5402a06 100644 --- a/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configinputwidget.cpp @@ -110,6 +110,7 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : case ManualControlSettings::CHANNELGROUPS_ROLL: case ManualControlSettings::CHANNELGROUPS_PITCH: case ManualControlSettings::CHANNELGROUPS_YAW: + case ManualControlSettings::CHANNELGROUPS_COLLECTIVE: case ManualControlSettings::CHANNELGROUPS_ACCESSORY0: case ManualControlSettings::CHANNELGROUPS_ACCESSORY1: case ManualControlSettings::CHANNELGROUPS_ACCESSORY2: @@ -118,7 +119,6 @@ ConfigInputWidget::ConfigInputWidget(QWidget *parent) : break; case ManualControlSettings::CHANNELGROUPS_THROTTLE: case ManualControlSettings::CHANNELGROUPS_FLIGHTMODE: - case ManualControlSettings::CHANNELGROUPS_COLLECTIVE: form->ui->channelResponseTime->setVisible(false); break; default: From 513ba37746ee254920bd703b299f5aef36d352bc Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Tue, 13 May 2014 22:04:01 +0200 Subject: [PATCH 15/25] OP-1348 Congig gadget would briefly flash next widget when replacing the currently selected widget --- .../src/libs/utils/mytabbedstackwidget.cpp | 22 +++++++- .../src/libs/utils/mytabbedstackwidget.h | 1 + .../src/plugins/config/configgadgetwidget.cpp | 50 ++++--------------- 3 files changed, 33 insertions(+), 40 deletions(-) diff --git a/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp b/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp index 2626ca47b..ed1bd75ae 100644 --- a/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp +++ b/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp @@ -83,12 +83,31 @@ MyTabbedStackWidget::MyTabbedStackWidget(QWidget *parent, bool isVertical, bool void MyTabbedStackWidget::insertTab(const int index, QWidget *tab, const QIcon &icon, const QString &label) { tab->setContentsMargins(0, 0, 0, 0); - m_stackWidget->insertWidget(index, tab); + + // create and insert item QListWidgetItem *item = new QListWidgetItem(icon, label); item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); item->setTextAlignment(Qt::AlignHCenter | Qt::AlignBottom); item->setToolTip(label); m_listWidget->insertItem(index, item); + + // insert widget + m_stackWidget->insertWidget(index, tab); +} + +void MyTabbedStackWidget::replaceTab(int index, QWidget *tab) +{ + QWidget *wid = m_stackWidget->widget(index); + + // insert new widget + m_stackWidget->insertWidget(index, tab); + if (index == currentIndex()) { + // currently selected tab is being replaced so select the new tab before removing the old one + m_stackWidget->setCurrentWidget(tab); + } + // remove and delete old widget + m_stackWidget->removeWidget(wid); + delete wid; } void MyTabbedStackWidget::removeTab(int index) @@ -97,6 +116,7 @@ void MyTabbedStackWidget::removeTab(int index) m_stackWidget->removeWidget(wid); delete wid; + QListWidgetItem *item = m_listWidget->item(index); m_listWidget->removeItemWidget(item); delete item; diff --git a/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.h b/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.h index 661200383..169eca9ba 100644 --- a/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.h +++ b/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.h @@ -40,6 +40,7 @@ public: MyTabbedStackWidget(QWidget *parent = 0, bool isVertical = false, bool iconAbove = true); void insertTab(int index, QWidget *tab, const QIcon &icon, const QString &label); + void replaceTab(int index, QWidget *tab); void removeTab(int index); void setIconSize(int size) { diff --git a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp index 4ae81eb08..368037842 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp @@ -166,24 +166,11 @@ void ConfigGadgetWidget::resizeEvent(QResizeEvent *event) void ConfigGadgetWidget::onAutopilotDisconnect() { - int selectedIndex = ftw->currentIndex(); - - QIcon *icon = new QIcon(); - - icon->addFile(":/configgadget/images/ins_normal.png", QSize(), QIcon::Normal, QIcon::Off); - icon->addFile(":/configgadget/images/ins_selected.png", QSize(), QIcon::Selected, QIcon::Off); QWidget *qwd = new DefaultAttitudeWidget(this); - ftw->removeTab(ConfigGadgetWidget::sensors); - ftw->insertTab(ConfigGadgetWidget::sensors, qwd, *icon, QString("Attitude")); + ftw->replaceTab(ConfigGadgetWidget::sensors, qwd); - icon = new QIcon(); - icon->addFile(":/configgadget/images/hardware_normal.png", QSize(), QIcon::Normal, QIcon::Off); - icon->addFile(":/configgadget/images/hardware_selected.png", QSize(), QIcon::Selected, QIcon::Off); qwd = new DefaultHwSettingsWidget(this); - ftw->removeTab(ConfigGadgetWidget::hardware); - ftw->insertTab(ConfigGadgetWidget::hardware, qwd, *icon, QString("Hardware")); - - ftw->setCurrentIndex(selectedIndex); + ftw->replaceTab(ConfigGadgetWidget::hardware, qwd); emit autopilotDisconnected(); } @@ -196,45 +183,26 @@ void ConfigGadgetWidget::onAutopilotConnect() ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); UAVObjectUtilManager *utilMngr = pm->getObject(); if (utilMngr) { - int selectedIndex = ftw->currentIndex(); int board = utilMngr->getBoardModel(); if ((board & 0xff00) == 1024) { // CopterControl family - QIcon *icon = new QIcon(); - icon->addFile(":/configgadget/images/ins_normal.png", QSize(), QIcon::Normal, QIcon::Off); - icon->addFile(":/configgadget/images/ins_selected.png", QSize(), QIcon::Selected, QIcon::Off); QWidget *qwd = new ConfigCCAttitudeWidget(this); - ftw->removeTab(ConfigGadgetWidget::sensors); - ftw->insertTab(ConfigGadgetWidget::sensors, qwd, *icon, QString("Attitude")); + ftw->replaceTab(ConfigGadgetWidget::sensors, qwd); - icon = new QIcon(); - icon->addFile(":/configgadget/images/hardware_normal.png", QSize(), QIcon::Normal, QIcon::Off); - icon->addFile(":/configgadget/images/hardware_selected.png", QSize(), QIcon::Selected, QIcon::Off); qwd = new ConfigCCHWWidget(this); - ftw->removeTab(ConfigGadgetWidget::hardware); - ftw->insertTab(ConfigGadgetWidget::hardware, qwd, *icon, QString("Hardware")); + ftw->replaceTab(ConfigGadgetWidget::hardware, qwd); } else if ((board & 0xff00) == 0x0900) { // Revolution family - - QIcon *icon = new QIcon(); - icon->addFile(":/configgadget/images/ins_normal.png", QSize(), QIcon::Normal, QIcon::Off); - icon->addFile(":/configgadget/images/ins_selected.png", QSize(), QIcon::Selected, QIcon::Off); QWidget *qwd = new ConfigRevoWidget(this); - ftw->removeTab(ConfigGadgetWidget::sensors); - ftw->insertTab(ConfigGadgetWidget::sensors, qwd, *icon, QString("Attitude")); + ftw->replaceTab(ConfigGadgetWidget::sensors, qwd); - icon = new QIcon(); - icon->addFile(":/configgadget/images/hardware_normal.png", QSize(), QIcon::Normal, QIcon::Off); - icon->addFile(":/configgadget/images/hardware_selected.png", QSize(), QIcon::Selected, QIcon::Off); qwd = new ConfigRevoHWWidget(this); - ftw->removeTab(ConfigGadgetWidget::hardware); - ftw->insertTab(ConfigGadgetWidget::hardware, qwd, *icon, QString("Hardware")); + ftw->replaceTab(ConfigGadgetWidget::hardware, qwd); } else { // Unknown board qDebug() << "Unknown board " << board; } - ftw->setCurrentIndex(selectedIndex); } emit autopilotConnected(); @@ -284,6 +252,10 @@ void ConfigGadgetWidget::onOPLinkDisconnect() { qDebug() << "ConfigGadgetWidget onOPLinkDisconnect"; oplinkTimeout->stop(); - ftw->removeTab(ConfigGadgetWidget::oplink); oplinkConnected = false; + + if (ftw->currentIndex() == ConfigGadgetWidget::oplink) { + ftw->setCurrentIndex(0); + } + ftw->removeTab(ConfigGadgetWidget::oplink); } From 940074e6f625bfaac9dee2e66cdbe28c2634f14b Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Tue, 13 May 2014 22:06:10 +0200 Subject: [PATCH 16/25] OP-1348 Congig gadget would briefly flash next widget when replacing the currently selected widget (missing change) --- .../openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp b/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp index ed1bd75ae..c1e8e8076 100644 --- a/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp +++ b/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp @@ -82,8 +82,6 @@ MyTabbedStackWidget::MyTabbedStackWidget(QWidget *parent, bool isVertical, bool void MyTabbedStackWidget::insertTab(const int index, QWidget *tab, const QIcon &icon, const QString &label) { - tab->setContentsMargins(0, 0, 0, 0); - // create and insert item QListWidgetItem *item = new QListWidgetItem(icon, label); item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); @@ -91,7 +89,8 @@ void MyTabbedStackWidget::insertTab(const int index, QWidget *tab, const QIcon & item->setToolTip(label); m_listWidget->insertItem(index, item); - // insert widget + // setup and insert widget + tab->setContentsMargins(0, 0, 0, 0); m_stackWidget->insertWidget(index, tab); } @@ -99,8 +98,10 @@ void MyTabbedStackWidget::replaceTab(int index, QWidget *tab) { QWidget *wid = m_stackWidget->widget(index); - // insert new widget + // setup and insert new widget + tab->setContentsMargins(0, 0, 0, 0); m_stackWidget->insertWidget(index, tab); + // check special case when replacing currenlty selected tab if (index == currentIndex()) { // currently selected tab is being replaced so select the new tab before removing the old one m_stackWidget->setCurrentWidget(tab); From c32026b90602567568eaa47b672e883584b3a6a7 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Tue, 13 May 2014 22:52:10 +0200 Subject: [PATCH 17/25] OP-1331 hopefully last tweaks for input/output channel alignment on CliffOS (most component width are now self adjusting) --- .../src/plugins/config/inputchannelform.ui | 392 +++++++++--------- .../src/plugins/config/outputchannelform.cpp | 4 +- .../src/plugins/config/outputchannelform.ui | 69 ++- 3 files changed, 231 insertions(+), 234 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.ui b/ground/openpilotgcs/src/plugins/config/inputchannelform.ui index b9052fece..965d31003 100644 --- a/ground/openpilotgcs/src/plugins/config/inputchannelform.ui +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.ui @@ -6,7 +6,7 @@ 0 0 - 859 + 853 51 @@ -29,11 +29,107 @@ 12 - - + + true + + + 0 + 0 + + + + + 0 + 20 + + + + + -1 + 75 + false + true + + + + Channel number + + + background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); +color: rgb(255, 255, 255); +border-radius: 5; +font: bold 12px; +margin:1px; + + + QFrame::StyledPanel + + + Number + + + Qt::AlignCenter + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Qt::StrongFocus + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + QAbstractSpinBox::UpDownArrows + + + 9999 + + + 1000 + + + + + 0 @@ -42,7 +138,88 @@ - 50 + 100 + 0 + + + + + 16777215 + 16777215 + + + + Qt::StrongFocus + + + + + + + + 0 + 0 + + + + + 90 + 0 + + + + + 16777215 + 16777215 + + + + Qt::StrongFocus + + + 7 + + + + + + + + 0 + 0 + + + + + 80 + 0 + + + + + 16777215 + 16777215 + + + + Text + + + + + + + true + + + + 0 + 0 + + + + + 0 0 @@ -79,151 +256,20 @@ even lead to crash. Use with caution. - - - - - 0 - 0 - - - - - 80 - 0 - - - - - 16777215 - 16777215 - - - - Text - - - - - - - - 0 - 0 - - - - - 90 - 0 - - - - - 16777215 - 16777215 - - - - Qt::StrongFocus - - - 7 - - - - - - - - 0 - 0 - - - - - 100 - 0 - - - - - 16777215 - 16777215 - - - - Qt::StrongFocus - - - - - - - - 0 - 0 - - - - - 50 - 0 - - - - - 16777215 - 16777215 - - - - Qt::StrongFocus - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - QAbstractSpinBox::UpDownArrows - - - 9999 - - - 1000 - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - true - + 0 0 - 80 + 0 20 @@ -310,14 +356,14 @@ margin:1px; true - + 0 0 - 75 + 0 20 @@ -359,14 +405,14 @@ margin:1px; true - + 0 0 - 50 + 0 20 @@ -408,14 +454,14 @@ margin:1px; true - + 0 0 - 50 + 0 20 @@ -503,14 +549,14 @@ margin:1px; true - + 0 0 - 50 + 0 20 @@ -543,66 +589,20 @@ margin:1px; - - - - true - - - - 0 - 0 - - - - - 90 - 20 - - - - - -1 - 75 - false - true - - - - Channel number - - - background-color: qlineargradient(spread:reflect, x1:0.507, y1:0, x2:0.507, y2:0.772, stop:0.208955 rgba(74, 74, 74, 255), stop:0.78607 rgba(36, 36, 36, 255)); -color: rgb(255, 255, 255); -border-radius: 5; -font: bold 12px; -margin:1px; - - - QFrame::StyledPanel - - - Number - - - Qt::AlignCenter - - - true - + 0 0 - 100 + 0 20 @@ -638,14 +638,14 @@ margin:1px; - + 0 0 - 50 + 0 0 @@ -749,7 +749,7 @@ margin:1px; - 60 + 16777215 16777215 diff --git a/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp b/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp index da8514855..0ca1ecaf7 100644 --- a/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp +++ b/ground/openpilotgcs/src/plugins/config/outputchannelform.cpp @@ -269,7 +269,7 @@ void OutputChannelForm::sendChannelTest(int value) value = ui.actuatorMin->value() - value + ui.actuatorMax->value(); } // update the label - ui.actuatorValue->setText(QString::number(value)); + ui.actuatorValue->setValue(value); if (ui.actuatorLink->checkState() && parent()) { // the channel is linked to other channels @@ -296,7 +296,7 @@ void OutputChannelForm::sendChannelTest(int value) } outputChannelForm->ui.actuatorNeutral->setValue(val); - outputChannelForm->ui.actuatorValue->setText(QString::number(val)); + outputChannelForm->ui.actuatorValue->setValue(val); } } diff --git a/ground/openpilotgcs/src/plugins/config/outputchannelform.ui b/ground/openpilotgcs/src/plugins/config/outputchannelform.ui index da55a432b..f6227939a 100644 --- a/ground/openpilotgcs/src/plugins/config/outputchannelform.ui +++ b/ground/openpilotgcs/src/plugins/config/outputchannelform.ui @@ -6,7 +6,7 @@ 0 0 - 772 + 768 51 @@ -32,14 +32,14 @@ - + 0 0 - 110 + 0 20 @@ -75,14 +75,14 @@ margin:1px; - + 0 0 - 50 + 0 20 @@ -171,14 +171,14 @@ margin:1px; - + 0 0 - 20 + 0 20 @@ -268,14 +268,14 @@ margin:1px; - + 0 0 - 50 + 0 0 @@ -336,14 +336,14 @@ margin:1px; - + 0 0 - 50 + 0 20 @@ -379,14 +379,14 @@ margin:1px; - + 0 0 - 75 + 0 20 @@ -422,14 +422,14 @@ margin:1px; - + 0 0 - 45 + 0 20 @@ -493,14 +493,14 @@ margin:1px; - + 0 0 - 50 + 0 0 @@ -577,34 +577,31 @@ margin:1px; - + + + true + - + 0 0 - - - 25 - 0 - - - - - 16777215 - 16777215 - - - - Current value of slider. - - - 0000 + + true Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + true + + + QAbstractSpinBox::UpDownArrows + + + 9999 + From b74e1c19bf711dd3a169f2438d761696507cbceb Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Wed, 14 May 2014 22:11:15 +0200 Subject: [PATCH 18/25] OP-1331 slightly increased min width of Input Channel Type and Number comboboxes --- .../src/plugins/config/inputchannelform.ui | 62 ++++++++++--------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.ui b/ground/openpilotgcs/src/plugins/config/inputchannelform.ui index 965d31003..856b4d41b 100644 --- a/ground/openpilotgcs/src/plugins/config/inputchannelform.ui +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.ui @@ -6,7 +6,7 @@ 0 0 - 853 + 923 51 @@ -131,7 +131,35 @@ margin:1px; - + + 0 + 0 + + + + + 110 + 0 + + + + + 16777215 + 16777215 + + + + Qt::StrongFocus + + + QComboBox::AdjustToContents + + + + + + + 0 0 @@ -151,40 +179,18 @@ margin:1px; Qt::StrongFocus - - - - - - - 0 - 0 - - - - - 90 - 0 - - - - - 16777215 - 16777215 - - - - Qt::StrongFocus - 7 + + QComboBox::AdjustToContents + - + 0 0 From ced787d71616ccab2ce2718094e4884fcc2fb041 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Wed, 14 May 2014 23:37:40 +0200 Subject: [PATCH 19/25] OP-1331 fixed regression in widget binding framework (handling of scale was broken) --- .../uavobjectwidgetutils/configtaskwidget.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp index 19c9ff8fb..714de84d7 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp @@ -406,24 +406,23 @@ void ConfigTaskWidget::widgetsContentsChanged() { QWidget *emitter = ((QWidget *)sender()); emit widgetContentsChanged(emitter); - double scale = 1.0; QVariant value; foreach(WidgetBinding * binding, m_widgetBindingsPerWidget.values(emitter)) { if (binding && binding->isEnabled()) { if (binding->widget() == emitter) { - checkWidgetsLimits(emitter, binding->field(), binding->index(), binding->isLimited(), - getVariantFromWidget(emitter, binding), binding->scale()); + value = getVariantFromWidget(emitter, binding); + checkWidgetsLimits(emitter, binding->field(), binding->index(), binding->isLimited(), value, binding->scale()); } else { foreach(ShadowWidgetBinding * shadow, binding->shadows()) { if (shadow->widget() == emitter) { - WidgetBinding tmpBinding(shadow->widget(), binding->object(), binding->field(), binding->index(), shadow->scale(), shadow->isLimited()); - QVariant value = getVariantFromWidget(emitter, &tmpBinding); - checkWidgetsLimits(emitter, binding->field(), binding->index(), shadow->isLimited(), value, scale); + WidgetBinding tmpBinding(shadow->widget(), binding->object(), binding->field(), + binding->index(), shadow->scale(), shadow->isLimited()); + value = getVariantFromWidget(emitter, &tmpBinding); + checkWidgetsLimits(emitter, binding->field(), binding->index(), shadow->isLimited(), value, shadow->scale()); } } } - value = getVariantFromWidget(emitter, binding); binding->setValue(value); if (binding->widget() != emitter) { From 9fe0c6516cd27ab699a9b395d342f39bd68fb384 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Thu, 15 May 2014 00:20:45 +0200 Subject: [PATCH 20/25] OP-1331 slightly increased min width of Input Channel Function combobox --- ground/openpilotgcs/src/plugins/config/inputchannelform.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ground/openpilotgcs/src/plugins/config/inputchannelform.ui b/ground/openpilotgcs/src/plugins/config/inputchannelform.ui index 856b4d41b..2f4db720c 100644 --- a/ground/openpilotgcs/src/plugins/config/inputchannelform.ui +++ b/ground/openpilotgcs/src/plugins/config/inputchannelform.ui @@ -197,7 +197,7 @@ margin:1px; - 80 + 100 0 From 2357ee1774bb8aa79b9845e4b5d67e4da296713d Mon Sep 17 00:00:00 2001 From: Corvus Corax Date: Fri, 16 May 2014 23:39:36 +0200 Subject: [PATCH 21/25] hotfix: allow arming in Stabilized 4,5,6 --- flight/modules/ManualControl/armhandler.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/flight/modules/ManualControl/armhandler.c b/flight/modules/ManualControl/armhandler.c index b16f1e39b..76833678e 100644 --- a/flight/modules/ManualControl/armhandler.c +++ b/flight/modules/ManualControl/armhandler.c @@ -274,6 +274,9 @@ static bool okToArm(void) case FLIGHTSTATUS_FLIGHTMODE_STABILIZED1: case FLIGHTSTATUS_FLIGHTMODE_STABILIZED2: case FLIGHTSTATUS_FLIGHTMODE_STABILIZED3: + case FLIGHTSTATUS_FLIGHTMODE_STABILIZED4: + case FLIGHTSTATUS_FLIGHTMODE_STABILIZED5: + case FLIGHTSTATUS_FLIGHTMODE_STABILIZED6: return true; break; From 2d4ad5a76d49e19b12bc3f172af8acc9cbadba73 Mon Sep 17 00:00:00 2001 From: Corvus Corax Date: Fri, 16 May 2014 23:42:17 +0200 Subject: [PATCH 22/25] uncrustification --- ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp | 1 + .../openpilotgcs/src/plugins/config/configgadgetwidget.cpp | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp b/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp index c1e8e8076..bc31f58c0 100644 --- a/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp +++ b/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp @@ -84,6 +84,7 @@ void MyTabbedStackWidget::insertTab(const int index, QWidget *tab, const QIcon & { // create and insert item QListWidgetItem *item = new QListWidgetItem(icon, label); + item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); item->setTextAlignment(Qt::AlignHCenter | Qt::AlignBottom); item->setToolTip(label); diff --git a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp index 368037842..3b80223b3 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp @@ -167,9 +167,10 @@ void ConfigGadgetWidget::resizeEvent(QResizeEvent *event) void ConfigGadgetWidget::onAutopilotDisconnect() { QWidget *qwd = new DefaultAttitudeWidget(this); + ftw->replaceTab(ConfigGadgetWidget::sensors, qwd); - qwd = new DefaultHwSettingsWidget(this); + qwd = new DefaultHwSettingsWidget(this); ftw->replaceTab(ConfigGadgetWidget::hardware, qwd); emit autopilotDisconnected(); @@ -190,14 +191,14 @@ void ConfigGadgetWidget::onAutopilotConnect() QWidget *qwd = new ConfigCCAttitudeWidget(this); ftw->replaceTab(ConfigGadgetWidget::sensors, qwd); - qwd = new ConfigCCHWWidget(this); + qwd = new ConfigCCHWWidget(this); ftw->replaceTab(ConfigGadgetWidget::hardware, qwd); } else if ((board & 0xff00) == 0x0900) { // Revolution family QWidget *qwd = new ConfigRevoWidget(this); ftw->replaceTab(ConfigGadgetWidget::sensors, qwd); - qwd = new ConfigRevoHWWidget(this); + qwd = new ConfigRevoHWWidget(this); ftw->replaceTab(ConfigGadgetWidget::hardware, qwd); } else { // Unknown board From fe60509ffa1c05c35e267f7beed9ca73dc5620f3 Mon Sep 17 00:00:00 2001 From: Philippe Renon Date: Fri, 16 May 2014 23:53:04 +0200 Subject: [PATCH 23/25] OP-1331 uncrustified --- ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp | 1 + .../openpilotgcs/src/plugins/config/configgadgetwidget.cpp | 7 ++++--- .../src/plugins/uavobjectwidgetutils/configtaskwidget.cpp | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp b/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp index c1e8e8076..bc31f58c0 100644 --- a/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp +++ b/ground/openpilotgcs/src/libs/utils/mytabbedstackwidget.cpp @@ -84,6 +84,7 @@ void MyTabbedStackWidget::insertTab(const int index, QWidget *tab, const QIcon & { // create and insert item QListWidgetItem *item = new QListWidgetItem(icon, label); + item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); item->setTextAlignment(Qt::AlignHCenter | Qt::AlignBottom); item->setToolTip(label); diff --git a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp index 2cb8b4e86..cd359019b 100644 --- a/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp +++ b/ground/openpilotgcs/src/plugins/config/configgadgetwidget.cpp @@ -165,9 +165,10 @@ void ConfigGadgetWidget::resizeEvent(QResizeEvent *event) void ConfigGadgetWidget::onAutopilotDisconnect() { QWidget *qwd = new DefaultAttitudeWidget(this); + stackWidget->replaceTab(ConfigGadgetWidget::sensors, qwd); - qwd = new DefaultHwSettingsWidget(this); + qwd = new DefaultHwSettingsWidget(this); stackWidget->replaceTab(ConfigGadgetWidget::hardware, qwd); emit autopilotDisconnected(); @@ -187,14 +188,14 @@ void ConfigGadgetWidget::onAutopilotConnect() QWidget *qwd = new ConfigCCAttitudeWidget(this); stackWidget->replaceTab(ConfigGadgetWidget::sensors, qwd); - qwd = new ConfigCCHWWidget(this); + qwd = new ConfigCCHWWidget(this); stackWidget->replaceTab(ConfigGadgetWidget::hardware, qwd); } else if ((board & 0xff00) == 0x0900) { // Revolution family QWidget *qwd = new ConfigRevoWidget(this); stackWidget->replaceTab(ConfigGadgetWidget::sensors, qwd); - qwd = new ConfigRevoHWWidget(this); + qwd = new ConfigRevoHWWidget(this); stackWidget->replaceTab(ConfigGadgetWidget::hardware, qwd); } else { // Unknown board diff --git a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp index 3ccb02391..6df939d0a 100644 --- a/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp +++ b/ground/openpilotgcs/src/plugins/uavobjectwidgetutils/configtaskwidget.cpp @@ -389,7 +389,7 @@ void ConfigTaskWidget::widgetsContentsChanged() foreach(ShadowWidgetBinding * shadow, binding->shadows()) { if (shadow->widget() == emitter) { WidgetBinding tmpBinding(shadow->widget(), binding->object(), binding->field(), - binding->index(), shadow->scale(), shadow->isLimited()); + binding->index(), shadow->scale(), shadow->isLimited()); value = getVariantFromWidget(emitter, &tmpBinding); checkWidgetsLimits(emitter, binding->field(), binding->index(), shadow->isLimited(), value, shadow->scale()); } From 718a35c37638716cbb3d4bdd1a7271ae019f1507 Mon Sep 17 00:00:00 2001 From: Corvus Corax Date: Mon, 19 May 2014 00:13:45 +0200 Subject: [PATCH 24/25] OP-1353 Fix Position and Velocity in Flightgear HITL bridge --- .../src/libs/utils/coordinateconversions.cpp | 4 +-- .../src/libs/utils/coordinateconversions.h | 2 +- .../src/plugins/hitl/fgsimulator.cpp | 29 +++++++++---------- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/ground/openpilotgcs/src/libs/utils/coordinateconversions.cpp b/ground/openpilotgcs/src/libs/utils/coordinateconversions.cpp index 4de1f311b..c6ceb0f01 100644 --- a/ground/openpilotgcs/src/libs/utils/coordinateconversions.cpp +++ b/ground/openpilotgcs/src/libs/utils/coordinateconversions.cpp @@ -44,7 +44,7 @@ CoordinateConversions::CoordinateConversions() * @param[in] LLA Longitude latitude altitude for this location * @param[out] Rne[3][3] Rotation matrix */ -void CoordinateConversions::RneFromLLA(double LLA[3], double Rne[3][3]) +void CoordinateConversions::RneFromLLA(double LLA[3], float Rne[3][3]) { float sinLat, sinLon, cosLat, cosLon; @@ -134,7 +134,7 @@ int CoordinateConversions::NED2LLA_HomeECEF(double BaseECEFm[3], double NED[3], // stored value is in cm, convert to m double BaseLLA[3]; double ECEF[3]; - double Rne[3][3]; + float Rne[3][3]; // Get LLA address to compute conversion matrix ECEF2LLA(BaseECEFm, BaseLLA); diff --git a/ground/openpilotgcs/src/libs/utils/coordinateconversions.h b/ground/openpilotgcs/src/libs/utils/coordinateconversions.h index de6ac7568..23b28fe47 100644 --- a/ground/openpilotgcs/src/libs/utils/coordinateconversions.h +++ b/ground/openpilotgcs/src/libs/utils/coordinateconversions.h @@ -41,7 +41,7 @@ public: CoordinateConversions(); int NED2LLA_HomeECEF(double BaseECEFcm[3], double NED[3], double position[3]); int NED2LLA_HomeLLA(double LLA[3], double NED[3], double position[3]); - void RneFromLLA(double LLA[3], double Rne[3][3]); + void RneFromLLA(double LLA[3], float Rne[3][3]); void LLA2ECEF(double LLA[3], double ECEF[3]); int ECEF2LLA(double ECEF[3], double LLA[3]); void LLA2Base(double LLA[3], double BaseECEF[3], float Rne[3][3], float NED[3]); diff --git a/ground/openpilotgcs/src/plugins/hitl/fgsimulator.cpp b/ground/openpilotgcs/src/plugins/hitl/fgsimulator.cpp index 1b4b2a8da..eb53b75fb 100644 --- a/ground/openpilotgcs/src/plugins/hitl/fgsimulator.cpp +++ b/ground/openpilotgcs/src/plugins/hitl/fgsimulator.cpp @@ -268,12 +268,12 @@ void FGSimulator::processUpdate(const QByteArray & inp) float temperature = fields[19].toFloat(); // Get pressure (kpa) float pressure = fields[20].toFloat() * INHG2KPA; - // Get VelocityState Down (cm/s) - float velocityStateDown = -fields[21].toFloat() * FPS2CMPS; - // Get VelocityState East (cm/s) - float velocityStateEast = fields[22].toFloat() * FPS2CMPS; - // Get VelocityState Down (cm/s) - float velocityStateNorth = fields[23].toFloat() * FPS2CMPS; + // Get VelocityState Down (m/s) + float velocityStateDown = -fields[21].toFloat() * FPS2CMPS * 1e-2f; + // Get VelocityState East (m/s) + float velocityStateEast = fields[22].toFloat() * FPS2CMPS * 1e-2f; + // Get VelocityState Down (m/s) + float velocityStateNorth = fields[23].toFloat() * FPS2CMPS * 1e-2f; // Get UDP packets received by FG int n = fields[24].toInt(); @@ -286,16 +286,15 @@ void FGSimulator::processUpdate(const QByteArray & inp) Output2Hardware out; memset(&out, 0, sizeof(Output2Hardware)); + HomeLocation::DataFields homeData = posHome->getData(); + double HomeLLA[3] = { (double)homeData.Latitude * 1e-7, (double)homeData.Longitude * 1e-7, homeData.Altitude }; + double HomeECEF[3]; + float HomeRNE[3][3]; + double LLA[3] = { latitude, longitude, altitude_msl }; float NED[3]; - // convert from cm back to meters - - double LLA[3] = { latitude, longitude, altitude_msl }; - double ECEF[3]; - double RNE[9]; - Utils::CoordinateConversions().RneFromLLA(LLA, (double(*)[3])RNE); - Utils::CoordinateConversions().LLA2ECEF(LLA, ECEF); - Utils::CoordinateConversions().LLA2Base(LLA, ECEF, (float(*)[3])RNE, NED); - + Utils::CoordinateConversions().RneFromLLA(HomeLLA, HomeRNE); + Utils::CoordinateConversions().LLA2ECEF(HomeLLA, HomeECEF); + Utils::CoordinateConversions().LLA2Base(LLA, HomeECEF, HomeRNE, NED); // Update GPS Position objects out.latitude = latitude * 1e7; From 4581481852662777c27eae28981cb76dd48b0264 Mon Sep 17 00:00:00 2001 From: Alessio Morale Date: Tue, 20 May 2014 15:13:39 +0200 Subject: [PATCH 25/25] Fix a bug making version checker not working for satellite. --- .../openpilotgcs/src/libs/opmapcontrol/src/core/urlfactory.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/ground/openpilotgcs/src/libs/opmapcontrol/src/core/urlfactory.cpp b/ground/openpilotgcs/src/libs/opmapcontrol/src/core/urlfactory.cpp index 0bc943ff4..6025eecc1 100644 --- a/ground/openpilotgcs/src/libs/opmapcontrol/src/core/urlfactory.cpp +++ b/ground/openpilotgcs/src/libs/opmapcontrol/src/core/urlfactory.cpp @@ -197,7 +197,6 @@ QString UrlFactory::MakeImageUrl(const MapType::Types &type, const Point &pos, c QString sec2 = ""; // after &zoom=... GetSecGoogleWords(pos, sec1, sec2); TryCorrectGoogleVersions(); - QString VersionGoogleSatellite = "132"; return QString("https://%1%2.google.com/%3/v=%4&hl=%5&x=%6%7&y=%8&z=%9&s=%10").arg(server).arg(GetServerNum(pos, 4)).arg(request).arg(VersionGoogleSatellite).arg(language).arg(pos.X()).arg(sec1).arg(pos.Y()).arg(zoom).arg(sec2); } break;