From 9fb0a48f7daf342fecb8575cfc984696d13b5002 Mon Sep 17 00:00:00 2001
From: Naumann <uhxkb@student.kit.edu>
Date: Thu, 19 Oct 2023 18:20:31 +0200
Subject: [PATCH] Make linked app instance properties non-editable

---
 .../ScenarioManager/gui/OptionalEdit.cpp      | 20 ++++++++++++++++
 .../ScenarioManager/gui/OptionalEdit.h        | 12 ++++++----
 .../gui/OptionalPropertyFactory.cpp           | 23 ++++++++++++-------
 .../gui/OptionalPropertyManager.cpp           |  6 ++---
 .../gui/detailedapplicationview.cpp           |  3 +++
 5 files changed, 49 insertions(+), 15 deletions(-)

diff --git a/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalEdit.cpp b/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalEdit.cpp
index 4f7bc719..3e4a4cea 100644
--- a/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalEdit.cpp
+++ b/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalEdit.cpp
@@ -57,6 +57,10 @@ OptionalEdit::OptionalEdit(const QString& elementName, const QString& propertyNa
     combo->setAutoCompletionCaseSensitivity(Qt::CaseInsensitive);
     combo->addItems(valueList);
 
+    readOnlyLineEdit = new QLineEdit();
+    readOnlyLineEdit->setReadOnly(true);
+    readOnlyLineEdit->setVisible(false);
+
     checkbox = new QCheckBox(nullptr);
     checkbox->setToolTip("If checked, this property will be written into the config file");
     checkbox->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred));
@@ -74,7 +78,9 @@ OptionalEdit::OptionalEdit(const QString& elementName, const QString& propertyNa
 
     layout->addWidget(checkbox);
     layout->addWidget(combo);
+    layout->addWidget(readOnlyLineEdit);
 
+    this->isReadOnly = false;
 
     this->setLayout(layout);
 }
@@ -103,6 +109,19 @@ void OptionalEdit::setPropertyEnabled(const bool& enabled)
     }
 }
 
+void OptionalEdit::setReadOnly(bool readOnly)
+{
+    if (readOnly == this->isReadOnly)
+    {
+        return;
+    }
+
+    checkbox->setDisabled(readOnly);
+
+    combo->setVisible(not readOnly);
+    readOnlyLineEdit->setVisible(readOnly);
+}
+
 
 void OptionalEdit::setValue(const QString& value)
 {
@@ -110,6 +129,7 @@ void OptionalEdit::setValue(const QString& value)
     bool enabledState = checkbox->isChecked();
     //    ARMARX_INFO << VAROUT(value.toStdString()) << VAROUT(enabledState);
     combo->setCurrentText(value);
+    readOnlyLineEdit->setText(value);
 
     if (checkbox->isChecked() != enabledState)
     {
diff --git a/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalEdit.h b/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalEdit.h
index eec66bc1..2a4124f1 100644
--- a/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalEdit.h
+++ b/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalEdit.h
@@ -67,6 +67,7 @@ namespace armarx
 
     public slots:
         void setPropertyEnabled(const bool& enabled = true);
+        void setReadOnly(bool readOnly);
         void setValue(const QString& value);
         void updateHistory(const QString& value);
 
@@ -81,10 +82,13 @@ namespace armarx
 
     private:
         bool fixComboboxValues = false;
-        QHBoxLayout* layout;
-        //        QLineEdit* edit;
-        QComboBox* combo;
-        QCheckBox* checkbox;
+        QHBoxLayout* layout = nullptr;
+
+        QComboBox* combo = nullptr;
+        QLineEdit* readOnlyLineEdit = nullptr;
+        bool isReadOnly;
+
+        QCheckBox* checkbox = nullptr;
         QString elementName;
         QString propertyName;
         QStringList valueList;
diff --git a/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalPropertyFactory.cpp b/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalPropertyFactory.cpp
index 018ad9e7..c8430ee6 100644
--- a/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalPropertyFactory.cpp
+++ b/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalPropertyFactory.cpp
@@ -68,13 +68,12 @@ QWidget* OptionalVariantFactory::createEditor(QtVariantPropertyManager* manager,
         }
         editor->setValue(manager->value(property).toString());
         editor->setPropertyEnabled(static_cast<OptionalVariantManager*>(manager)->attributeValue(property, QLatin1String("enabled")).toBool());
+        editor->setReadOnly(static_cast<OptionalVariantManager*>(manager)->attributeValue(property, QLatin1String("readOnly")).toBool());
 
         createdEditors[property].append(editor);
         editorToProperty[editor] = property;
 
 
-
-
         connect(editor, SIGNAL(valueChanged(QString)),
                 this, SLOT(slotSetValue(const QString&)));
         connect(editor, SIGNAL(enabledChanged(bool)),
@@ -119,16 +118,24 @@ void OptionalVariantFactory::slotPropertyAttributeChanged(QtProperty* property,
         return;
     }
 
-    if (attribute != QLatin1String("enabled"))
+    if (attribute == QLatin1String("enabled"))
     {
-        return;
+        QList<OptionalEdit*> editors = createdEditors[property];
+        QListIterator<OptionalEdit*> itEditor(editors);
+        while (itEditor.hasNext())
+        {
+            itEditor.next()->setPropertyEnabled(value.toBool());
+        }
     }
 
-    QList<OptionalEdit*> editors = createdEditors[property];
-    QListIterator<OptionalEdit*> itEditor(editors);
-    while (itEditor.hasNext())
+    if (attribute == QLatin1String("readOnly"))
     {
-        itEditor.next()->setPropertyEnabled(value.toBool());
+        QList<OptionalEdit*> editors = createdEditors[property];
+        QListIterator<OptionalEdit*> itEditor(editors);
+        while (itEditor.hasNext())
+        {
+            itEditor.next()->setReadOnly(value.toBool());
+        }
     }
 }
 
diff --git a/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalPropertyManager.cpp b/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalPropertyManager.cpp
index d51af51a..6cfbc040 100644
--- a/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalPropertyManager.cpp
+++ b/source/ArmarXGui/gui-plugins/ScenarioManager/gui/OptionalPropertyManager.cpp
@@ -187,7 +187,6 @@ void OptionalVariantManager::setAttribute(QtProperty* property,
 {
     if (dataMap.contains(property))
     {
-
         // special legacy case
         if (attribute == QLatin1String("enabled"))
         {
@@ -209,11 +208,12 @@ void OptionalVariantManager::setAttribute(QtProperty* property,
         {
             dataMap[property][attribute].variant = val;
             emit propertyChanged(property);
-            emit attributeChanged(property, attribute, true);
+            emit attributeChanged(property, attribute, val);
         }
         return;
-
     }
+
+
     QtVariantPropertyManager::setAttribute(property, attribute, val);
 }
 
diff --git a/source/ArmarXGui/gui-plugins/ScenarioManager/gui/detailedapplicationview.cpp b/source/ArmarXGui/gui-plugins/ScenarioManager/gui/detailedapplicationview.cpp
index 8d7e3328..7fe2f365 100644
--- a/source/ArmarXGui/gui-plugins/ScenarioManager/gui/detailedapplicationview.cpp
+++ b/source/ArmarXGui/gui-plugins/ScenarioManager/gui/detailedapplicationview.cpp
@@ -325,6 +325,9 @@ void DetailedApplicationView::showApplicationInstance(ApplicationInstancePtr app
             {
                 //nothing to do
             }
+
+            appPropertyItem->setAttribute(QLatin1String("readOnly"), QVariant(appInstance->isReadOnly()));
+
             appPropertyTopItem->addSubProperty(appPropertyItem);
         }
     }
-- 
GitLab