From 41b142ddf0f9978ca4b2f6f1be78eb131d5e0445 Mon Sep 17 00:00:00 2001
From: Raphael Grimm <raphael.grimm@kit.edu>
Date: Fri, 6 Sep 2019 18:16:55 +0200
Subject: [PATCH] Do not update the sub widget if it is not visible

---
 .../QWidgets/ControlDevicesWidget.cpp         |  5 +++-
 .../NJointControllerClassesWidget.cpp         |  5 +++-
 .../QWidgets/NJointControllersWidget.cpp      | 15 ++++++++---
 .../QWidgets/RobotUnitWidgetBase.cpp          | 25 ++++++++++++++++---
 .../QWidgets/RobotUnitWidgetBase.h            |  2 ++
 .../QWidgets/SensorDevicesWidget.cpp          |  5 +++-
 .../RobotUnitPluginWidgetController.cpp       |  9 ++++++-
 7 files changed, 56 insertions(+), 10 deletions(-)

diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/ControlDevicesWidget.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/ControlDevicesWidget.cpp
index e3ad0afa9..11e79d682 100644
--- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/ControlDevicesWidget.cpp
+++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/ControlDevicesWidget.cpp
@@ -78,7 +78,10 @@ namespace armarx
         if (statusUpdates[status.deviceName].timestampUSec < status.timestampUSec)
         {
             statusUpdates[status.deviceName] = status;
-            QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+            if (doMetaCall)
+            {
+                QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+            }
         }
     }
 
diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllerClassesWidget.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllerClassesWidget.cpp
index b0bb952ea..81a9f43b7 100644
--- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllerClassesWidget.cpp
+++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllerClassesWidget.cpp
@@ -100,7 +100,10 @@ namespace armarx
         auto data = ru->getNJointControllerClassDescription(name);
         guard.lock();
         nJointControllerClassDescriptions[data.className] = std::move(data);
-        QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+        if (doMetaCall)
+        {
+            QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+        }
     }
 
     void NJointControllerClassesWidget::updateDefaultNameOnControllerCreated(QString createdName, bool force)
diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllersWidget.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllersWidget.cpp
index 3e4f830f1..157900996 100644
--- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllersWidget.cpp
+++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/NJointControllersWidget.cpp
@@ -97,7 +97,10 @@ namespace armarx
         if (statusUpdates[status.instanceName].timestampUSec < status.timestampUSec)
         {
             statusUpdates[status.instanceName] = status;
-            QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+            if (doMetaCall)
+            {
+                QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+            }
         }
     }
 
@@ -149,7 +152,10 @@ namespace armarx
         if (!entries.count(name))
         {
             controllersCreated[name] = std::move(data);
-            QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+            if (doMetaCall)
+            {
+                QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+            }
         }
     }
 
@@ -157,7 +163,10 @@ namespace armarx
     {
         std::unique_lock<std::recursive_timed_mutex> guard {mutex};
         controllersDeleted.emplace(name);
-        QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+        if (doMetaCall)
+        {
+            QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+        }
     }
 
     void NJointControllersWidget::loadSettings(QSettings* settings)
diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.cpp
index cec5e3d55..74d4b1807 100644
--- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.cpp
+++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.cpp
@@ -59,6 +59,16 @@ namespace armarx
         QMetaObject::invokeMethod(this, "doReset", Qt::QueuedConnection);
     }
 
+    void RobotUnitWidgetBase::setVisible(bool visible)
+    {
+        doMetaCall = visible;
+        if (visible)
+        {
+            QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+        }
+        QWidget::setVisible(visible);
+    }
+
     void RobotUnitWidgetBase::doReset()
     {
         std::unique_lock<std::recursive_timed_mutex> guard {mutex};
@@ -84,7 +94,10 @@ namespace armarx
                                        << armarx::GetHandledExceptionString();
                     }
                     gotResetData = true;
-                    QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+                    if (doMetaCall)
+                    {
+                        QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+                    }
                     ARMARX_INFO << "Resetting of widget '" << objectName().toStdString() << "' done!";
                 }
             } .detach();
@@ -92,7 +105,10 @@ namespace armarx
         else
         {
             gotResetData = true;
-            QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+            if (doMetaCall)
+            {
+                QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+            }
         }
     }
 
@@ -106,7 +122,10 @@ namespace armarx
             {
                 killTimer(resetTimerId);
                 resetTimerId = 0;
-                QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+                if (doMetaCall)
+                {
+                    QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+                }
             }
         }
     }
diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.h b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.h
index d0fe28f26..c797891f0 100644
--- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.h
+++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/RobotUnitWidgetBase.h
@@ -53,6 +53,7 @@ namespace armarx
         virtual void loadSettings(QSettings*) {}
         virtual void saveSettings(QSettings*) {}
 
+        void setVisible(bool visible) override;
     protected slots:
         void updateContent();
     private slots:
@@ -80,6 +81,7 @@ namespace armarx
         int resetTimerId {0};
         int resetCount {0};
         std::atomic_bool isResetting {false};
+        std::atomic_bool doMetaCall {false};
     };
 
     template<class UI>
diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/SensorDevicesWidget.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/SensorDevicesWidget.cpp
index 070f04019..5afd04ce7 100644
--- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/SensorDevicesWidget.cpp
+++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/QWidgets/SensorDevicesWidget.cpp
@@ -62,7 +62,10 @@ namespace armarx
         if (statusUpdates[status.deviceName].timestampUSec < status.timestampUSec)
         {
             statusUpdates[status.deviceName] = status;
-            QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+            if (doMetaCall)
+            {
+                QMetaObject::invokeMethod(this, "updateContent", Qt::QueuedConnection);
+            }
         }
     }
 
diff --git a/source/RobotAPI/gui-plugins/RobotUnitPlugin/RobotUnitPlugin/RobotUnitPluginWidgetController.cpp b/source/RobotAPI/gui-plugins/RobotUnitPlugin/RobotUnitPlugin/RobotUnitPluginWidgetController.cpp
index 8fdc20d0a..7a0b8ca72 100644
--- a/source/RobotAPI/gui-plugins/RobotUnitPlugin/RobotUnitPlugin/RobotUnitPluginWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/RobotUnitPlugin/RobotUnitPlugin/RobotUnitPluginWidgetController.cpp
@@ -46,6 +46,7 @@ RobotUnitPluginWidgetController::RobotUnitPluginWidgetController()
         widget.groupBoxCDev->layout()->addWidget(controlDevices);
         widget.groupBoxCDev->setVisible(false);
         controlDevices->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
+        controlDevices->setVisible(false);
     }
     //add subwidget SensorDevices
     {
@@ -53,6 +54,7 @@ RobotUnitPluginWidgetController::RobotUnitPluginWidgetController()
         widget.groupBoxSDev->layout()->addWidget(sensorDevices);
         widget.groupBoxSDev->setVisible(false);
         sensorDevices->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
+        sensorDevices->setVisible(false);
     }
     //add subwidget NJointControllers
     {
@@ -60,6 +62,7 @@ RobotUnitPluginWidgetController::RobotUnitPluginWidgetController()
         widget.groupBoxNJointCtrl->layout()->addWidget(nJointControllers);
         widget.groupBoxNJointCtrl->setVisible(true);
         nJointControllers->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
+        nJointControllers->setVisible(true);
     }
     //add subwidget NJointControllerClasses
     {
@@ -67,6 +70,7 @@ RobotUnitPluginWidgetController::RobotUnitPluginWidgetController()
         widget.groupBoxNJointCtrlClasses->layout()->addWidget(nJointControllerClasses);
         widget.groupBoxNJointCtrlClasses->setVisible(false);
         nJointControllerClasses->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding);
+        nJointControllerClasses->setVisible(false);
     }
     updateToolBarActionCheckedState();
 }
@@ -157,6 +161,7 @@ QPointer<QWidget> RobotUnitPluginWidgetController::getCustomTitlebarWidget(QWidg
         showCDevs->setCheckable(true);
         showCDevs->setToolTip("Hide/Show the list of Control Devices");
         connect(showCDevs, SIGNAL(toggled(bool)), widget.groupBoxCDev, SLOT(setVisible(bool)));
+        connect(showCDevs, SIGNAL(toggled(bool)), controlDevices, SLOT(setVisible(bool)));
         customToolbar->addAction(showCDevs);
         customToolbar->addSeparator();
 
@@ -166,6 +171,7 @@ QPointer<QWidget> RobotUnitPluginWidgetController::getCustomTitlebarWidget(QWidg
         showSDevs->setCheckable(true);
         showSDevs->setToolTip("Hide/Show the list of Sensor Devices");
         connect(showSDevs, SIGNAL(toggled(bool)), widget.groupBoxSDev, SLOT(setVisible(bool)));
+        connect(showSDevs, SIGNAL(toggled(bool)), sensorDevices, SLOT(setVisible(bool)));
         customToolbar->addAction(showSDevs);
         customToolbar->addSeparator();
 
@@ -175,6 +181,7 @@ QPointer<QWidget> RobotUnitPluginWidgetController::getCustomTitlebarWidget(QWidg
         showNJoint->setCheckable(true);
         showNJoint->setToolTip("Hide/Show the list of NJointControllers");
         connect(showNJoint, SIGNAL(toggled(bool)), widget.groupBoxNJointCtrl, SLOT(setVisible(bool)));
+        connect(showNJoint, SIGNAL(toggled(bool)), nJointControllers, SLOT(setVisible(bool)));
         customToolbar->addAction(showNJoint);
         customToolbar->addSeparator();
 
@@ -184,6 +191,7 @@ QPointer<QWidget> RobotUnitPluginWidgetController::getCustomTitlebarWidget(QWidg
         showNJointClasses->setCheckable(true);
         showNJointClasses->setToolTip("Hide/Show the list of NJointControllers Classes");
         connect(showNJointClasses, SIGNAL(toggled(bool)), widget.groupBoxNJointCtrlClasses, SLOT(setVisible(bool)));
+        connect(showNJointClasses, SIGNAL(toggled(bool)), nJointControllerClasses, SLOT(setVisible(bool)));
         customToolbar->addAction(showNJointClasses);
         customToolbar->addSeparator();
 
@@ -265,7 +273,6 @@ void RobotUnitPluginWidgetController::updateToolBarActionCheckedState()
     }
 }
 
-
 void armarx::RobotUnitPluginWidgetController::timerEvent(QTimerEvent*)
 {
     if (!robotUnitPrx)
-- 
GitLab