From 4222bbe903cdb36fa6240f4148c4f3cf2f175add Mon Sep 17 00:00:00 2001 From: gferret <gatien.ferret@kitware.com> Date: Tue, 23 Aug 2022 14:46:13 +0200 Subject: [PATCH] [feat] Add an option to move the sensors up and down in the sensor list --- .../Icons/pqSensorListDown.png | Bin 0 -> 5384 bytes .../Icons/pqSensorListUp.png | Bin 0 -> 4465 bytes .../SensorWidget/lqSensorListWidget.cxx | 131 +++++++++++++----- .../SensorWidget/lqSensorListWidget.h | 2 + .../SensorWidget/lqSensorWidget.cxx | 26 ++++ .../SensorWidget/lqSensorWidget.h | 13 +- .../SensorWidget/lqSensorWidget.ui | 75 +++++++++- ApplicationComponents/lqResources.qrc | 2 + 8 files changed, 211 insertions(+), 38 deletions(-) create mode 100644 ApplicationComponents/Icons/pqSensorListDown.png create mode 100644 ApplicationComponents/Icons/pqSensorListUp.png diff --git a/ApplicationComponents/Icons/pqSensorListDown.png b/ApplicationComponents/Icons/pqSensorListDown.png new file mode 100644 index 0000000000000000000000000000000000000000..84d33c5f4a743ebd4012bb540eb011f4fe8a7fed GIT binary patch literal 5384 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 literal 0 HcmV?d00001 diff --git a/ApplicationComponents/Icons/pqSensorListUp.png b/ApplicationComponents/Icons/pqSensorListUp.png new file mode 100644 index 0000000000000000000000000000000000000000..bf50f14751e9a997e35a6cc4d9c2ea0e674f9c86 GIT binary patch literal 4465 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 YgJv#~#}5ph{rTp$ha9Xb4&cxJ3&ts|v;Y7A literal 0 HcmV?d00001 diff --git a/ApplicationComponents/SensorWidget/lqSensorListWidget.cxx b/ApplicationComponents/SensorWidget/lqSensorListWidget.cxx index 8fa35dcea..6826542b7 100644 --- a/ApplicationComponents/SensorWidget/lqSensorListWidget.cxx +++ b/ApplicationComponents/SensorWidget/lqSensorListWidget.cxx @@ -48,52 +48,52 @@ namespace Ui void setupUi(QWidget *parent) { - if (parent->objectName().isEmpty()) - parent->setObjectName(QStringLiteral("lqSensorListWidget")); + if (parent->objectName().isEmpty()) + parent->setObjectName(QStringLiteral("lqSensorListWidget")); - QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); - sizePolicy.setHorizontalStretch(0); - sizePolicy.setVerticalStretch(0); - sizePolicy.setHeightForWidth(parent->sizePolicy().hasHeightForWidth()); - parent->setSizePolicy(sizePolicy); - parent->setMinimumSize(QSize(330, 110)); - parent->setMaximumSize(QSize(16777215, 16777215)); + QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + sizePolicy.setHorizontalStretch(0); + sizePolicy.setVerticalStretch(0); + sizePolicy.setHeightForWidth(parent->sizePolicy().hasHeightForWidth()); + parent->setSizePolicy(sizePolicy); + parent->setMinimumSize(QSize(330, 110)); + parent->setMaximumSize(QSize(16777215, 16777215)); - panelLayout = new QVBoxLayout(parent); - panelLayout->setObjectName(QStringLiteral("panelLayout")); + panelLayout = new QVBoxLayout(parent); + panelLayout->setObjectName(QStringLiteral("panelLayout")); - scrollArea = new QScrollArea(parent); - scrollArea->setObjectName(QStringLiteral("scrollArea")); - scrollArea->setWidgetResizable(true); - scrollAreaWidgetContents = new QWidget(); - scrollAreaWidgetContents->setObjectName(QStringLiteral("scrollAreaWidgetContents")); - scrollAreaWidgetContents->setGeometry(QRect(0, 0, 200, 110)); + scrollArea = new QScrollArea(parent); + scrollArea->setObjectName(QStringLiteral("scrollArea")); + scrollArea->setWidgetResizable(true); + scrollAreaWidgetContents = new QWidget(); + scrollAreaWidgetContents->setObjectName(QStringLiteral("scrollAreaWidgetContents")); + scrollAreaWidgetContents->setGeometry(QRect(0, 0, 200, 110)); - verticalLayout = new QVBoxLayout(); - verticalLayout->setObjectName(QStringLiteral("verticalLayout")); - scrollAreaWidgetContents->setLayout(verticalLayout); + verticalLayout = new QVBoxLayout(); + verticalLayout->setObjectName(QStringLiteral("verticalLayout")); + scrollAreaWidgetContents->setLayout(verticalLayout); - sensorListLayout = new QVBoxLayout(); - sensorListLayout->setObjectName(QStringLiteral("sensorListLayout")); - verticalLayout->addLayout(sensorListLayout); + sensorListLayout = new QVBoxLayout(); + sensorListLayout->setObjectName(QStringLiteral("sensorListLayout")); + verticalLayout->addLayout(sensorListLayout); - verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); - verticalLayout->addItem(verticalSpacer); + verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); + verticalLayout->addItem(verticalSpacer); - caption = new QLabel(); + caption = new QLabel(); - scrollArea->setWidget(scrollAreaWidgetContents); - panelLayout->addWidget(caption); - panelLayout->addWidget(scrollArea); + scrollArea->setWidget(scrollAreaWidgetContents); + panelLayout->addWidget(caption); + panelLayout->addWidget(scrollArea); - retranslateUi(parent); + retranslateUi(parent); - QMetaObject::connectSlotsByName(parent); + QMetaObject::connectSlotsByName(parent); } // setupUi void retranslateUi(QWidget *parent) { - parent->setWindowTitle(QApplication::translate("lqSensorListWidget", "Form", nullptr)); + parent->setWindowTitle(QApplication::translate("lqSensorListWidget", "Form", nullptr)); } // retranslateUi }; } // namespace Ui @@ -176,6 +176,7 @@ lqSensorWidget* lqSensorListWidget::findWidget(pqPipelineSource *src) const //----------------------------------------------------------------------------- void lqSensorListWidget::onSourceAdded(pqPipelineSource* src) { + if (IsLidarProxy(src->getProxy())) { // add a lqSensorReaderWidget to layout @@ -191,6 +192,10 @@ void lqSensorListWidget::onSourceAdded(pqPipelineSource* src) this->ui->caption->setText(sensorWidget->GetExplanationOnUI()); this->connect(sensorWidget, SIGNAL(selected(lqSensorWidget*)), SLOT(onSelected(lqSensorWidget*))); + // connect up and down buttons to the function moving the widgets + this->connect(sensorWidget, SIGNAL(buttonDownClicked(lqSensorWidget*)), SLOT(onSensorDownButtonClicked(lqSensorWidget*))); + this->connect(sensorWidget, SIGNAL(buttonUpClicked(lqSensorWidget*)), SLOT(onSensorUpButtonClicked(lqSensorWidget*))); + // Emit lidarStreamModeChanged Signal if (!alreadyStream && !isReader) { @@ -199,6 +204,68 @@ void lqSensorListWidget::onSourceAdded(pqPipelineSource* src) } } +void lqSensorListWidget::onSensorDownButtonClicked(lqSensorWidget* widget) +{ + // Identify the widget in the list + QString lidarName = widget->GetLidarSource()->getSMName(); + + if (this->sensorWidgets.size() > 1) + { + for (lqSensorWidget* widgetSearch : this->sensorWidgets) + { + if (widgetSearch->GetLidarSource()) + { + if (!QString::compare(widgetSearch->GetLidarSource()->getSMName(), lidarName,Qt::CaseInsensitive)) // get the widget with the same name as the used one + { + // get index of the widget + unsigned int idxInList = this->ui->sensorListLayout->indexOf(widgetSearch); + if ((idxInList+1) < sensorWidgets.size()) // check this is not the last element + { + // remove the widget + this->ui->sensorListLayout->removeWidget(widgetSearch); + // insert it at idx +1 + this->ui->sensorListLayout->insertWidget(idxInList +1 ,widgetSearch); + // if it can go down, swap it with the one below and get out of this loop + break; + } + } // end if same lidar name + } // end if isLidarSource + } // end for widget list + } // end if multiple sensors +} +void lqSensorListWidget::onSensorUpButtonClicked(lqSensorWidget* widget) +{ + // Identify the widget in the list + QString lidarName = widget->GetLidarSource()->getSMName(); + + // check we have multiple sensors + if (this->sensorWidgets.size() > 1) + { + for (lqSensorWidget* widgetSearch : this->sensorWidgets) + { + if (widgetSearch->GetLidarSource()) + { + if (!QString::compare(widgetSearch->GetLidarSource()->getSMName(), lidarName, Qt::CaseInsensitive)) // get the widget with the same name as the used one + { + // get index of the widget + unsigned int idxInList = this->ui->sensorListLayout->indexOf(widgetSearch); + + if (idxInList > 0) // check this is not the first element + { + // remove the widget + this->ui->sensorListLayout->removeWidget(widgetSearch); + // insert it at idx -1 + this->ui->sensorListLayout->insertWidget(idxInList - 1, widgetSearch); + // if it can go down, swap it with the one below and get out of this loop + break; + } + } // end if same lidar name + } // end if isLidarSource + } // end for widget list + } // end if multiple sensors +} + + //----------------------------------------------------------------------------- void lqSensorListWidget::onSourceRemoved(pqPipelineSource *src) { diff --git a/ApplicationComponents/SensorWidget/lqSensorListWidget.h b/ApplicationComponents/SensorWidget/lqSensorListWidget.h index b8e959679..884636839 100644 --- a/ApplicationComponents/SensorWidget/lqSensorListWidget.h +++ b/ApplicationComponents/SensorWidget/lqSensorListWidget.h @@ -84,6 +84,8 @@ class LQAPPLICATIONCOMPONENTS_EXPORT lqSensorListWidget : public QWidget void onSourceAdded(pqPipelineSource* src); void onSourceRemoved(pqPipelineSource* src); void onSelected(lqSensorWidget * widget); + void onSensorDownButtonClicked(lqSensorWidget* widget); + void onSensorUpButtonClicked(lqSensorWidget* widget); Q_SIGNALS: void lidarStreamModeChanged(bool); // Emitted when LidarStream are now present / absent. diff --git a/ApplicationComponents/SensorWidget/lqSensorWidget.cxx b/ApplicationComponents/SensorWidget/lqSensorWidget.cxx index ff92c6c49..1d7143003 100644 --- a/ApplicationComponents/SensorWidget/lqSensorWidget.cxx +++ b/ApplicationComponents/SensorWidget/lqSensorWidget.cxx @@ -76,9 +76,16 @@ lqSensorWidget::lqSensorWidget(QWidget *parent) : curr_Transform[idxValue] = this->spinbox_Array[idxValue]->value(); } + // connect checkbox to enabler of live transform mode connect(this->UI->enableLiveDataTransformCheckBox, &QCheckBox::stateChanged, this, [this] { lqSensorWidget::onEnableLiveTransformToggle(); }); + // connect up and down buttons to emitter of this signal for the sensorlist class + connect(this->UI->buttonDown, &QPushButton::released, this, + [this] { lqSensorWidget::onButtonDownClicked(); }); + connect(this->UI->buttonUp, &QPushButton::released, this, + [this] { lqSensorWidget::onButtonUpClicked(); }); + // Connect Slider movement to transform updating function connect(this->UI->TxSlider, &QSlider::sliderMoved, this, [this] { lqSensorWidget::onSliderUpdate(TRANSFORMVALUE_INDEX::POS_X); }); @@ -358,6 +365,16 @@ void lqSensorWidget::focusInEvent(QFocusEvent*) emit selected(this); } +void lqSensorWidget::onButtonDownClicked() +{ + emit buttonDownClicked(this); +} + +void lqSensorWidget::onButtonUpClicked() +{ + emit buttonUpClicked(this); +} + void lqSensorWidget::onEnableLiveTransformToggle() { // Get enable flag for the check box @@ -385,6 +402,15 @@ void lqSensorWidget::onEnableLiveTransformToggle() this->UI->YawSlider->setVisible(isLiveTransformVisible); this->UI->YawSpinBox->setVisible(isLiveTransformVisible); + // adjust window min size according to the toggle state + if (isLiveTransformVisible) + { + this->setMinimumHeight(225); + } + else + { + this->setMinimumHeight(190); + } ReadValueFromProxy(); } diff --git a/ApplicationComponents/SensorWidget/lqSensorWidget.h b/ApplicationComponents/SensorWidget/lqSensorWidget.h index 3d1dbddfa..275b22b36 100644 --- a/ApplicationComponents/SensorWidget/lqSensorWidget.h +++ b/ApplicationComponents/SensorWidget/lqSensorWidget.h @@ -104,9 +104,11 @@ class LQAPPLICATIONCOMPONENTS_EXPORT lqSensorWidget : public QWidget * to the interface */ void onEnableLiveTransformToggle(); - + signals: void selected(lqSensorWidget*); + void buttonDownClicked(lqSensorWidget*); + void buttonUpClicked(lqSensorWidget*); protected: Q_DISABLE_COPY(lqSensorWidget) @@ -120,7 +122,14 @@ protected: bool IsClosing; Ui::lqSensorWidget* UI; std::function<void(pqPipelineSource* &, pqPipelineSource* &)> CalibrationFunction; - + /*! + * @brief Function used to trigger the widget to go down in the sensor list + */ + void onButtonDownClicked(); + /*! + * @brief Function used to trigger the widget to go up in the sensor list + */ + void onButtonUpClicked(); /*! * @brief common function to update internal QT widgets to internal values diff --git a/ApplicationComponents/SensorWidget/lqSensorWidget.ui b/ApplicationComponents/SensorWidget/lqSensorWidget.ui index c2be0832c..9db1c3997 100644 --- a/ApplicationComponents/SensorWidget/lqSensorWidget.ui +++ b/ApplicationComponents/SensorWidget/lqSensorWidget.ui @@ -19,7 +19,7 @@ <property name="minimumSize"> <size> <width>330</width> - <height>225</height> + <height>190</height> </size> </property> <property name="maximumSize"> @@ -142,6 +142,64 @@ </property> </spacer> </item> + <item> + <widget class="QPushButton" name="buttonDown"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>25</width> + <height>25</height> + </size> + </property> + <property name="toolTip"> + <string>Move the sensor down in the sensor list</string> + </property> + <property name="icon"> + <iconset> + <normaloff>:/lqResources/Icons/pqSensorListDown.png</normaloff>:/lqResources/Icons/pqSensorListDown.png</iconset> + </property> + <property name="iconSize"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="buttonUp"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="maximumSize"> + <size> + <width>25</width> + <height>25</height> + </size> + </property> + <property name="toolTip"> + <string>Move the sensor up in the sensor list</string> + </property> + <property name="icon"> + <iconset> + <normaloff>:/lqResources/Icons/pqSensorListUp.png</normaloff>:/lqResources/Icons/pqSensorListUp.png</iconset> + </property> + <property name="iconSize"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </widget> + </item> <item> <widget class="QPushButton" name="close"> <property name="sizePolicy"> @@ -152,8 +210,8 @@ </property> <property name="maximumSize"> <size> - <width>16</width> - <height>16</height> + <width>25</width> + <height>25</height> </size> </property> <property name="font"> @@ -168,8 +226,17 @@ <property name="cursor"> <cursorShape>ArrowCursor</cursorShape> </property> + <property name="toolTip"> + <string>Remove this lidar source</string> + </property> <property name="text"> - <string>x</string> + <string>X</string> + </property> + <property name="iconSize"> + <size> + <width>20</width> + <height>20</height> + </size> </property> <property name="default"> <bool>false</bool> diff --git a/ApplicationComponents/lqResources.qrc b/ApplicationComponents/lqResources.qrc index fd9dea10a..070693a23 100644 --- a/ApplicationComponents/lqResources.qrc +++ b/ApplicationComponents/lqResources.qrc @@ -13,6 +13,8 @@ <file>Icons/pqRotateCameraCW.png</file> <file>Icons/pqZoomToData.png</file> <file>Icons/pqZoomToSelection.png</file> + <file>Icons/pqSensorListDown.png</file> + <file>Icons/pqSensorListUp.png</file> <file>Icons/EnableAdvancedArrays.png</file> <file>Icons/DisableAdvancedArrays.png</file> <file>Icons/media-loop.png</file> -- GitLab