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