From 6fb8538f36f04dcba29f2d1096e35e9b8fa3f001 Mon Sep 17 00:00:00 2001
From: Naumann <uhxkb@student.kit.edu>
Date: Fri, 20 Oct 2023 18:32:56 +0200
Subject: [PATCH] Indicate source scenario and package for linked applications

---
 .../gui/detailedapplicationview.cpp           | 45 ++++++++++++++++++-
 1 file changed, 43 insertions(+), 2 deletions(-)

diff --git a/source/ArmarXGui/gui-plugins/ScenarioManager/gui/detailedapplicationview.cpp b/source/ArmarXGui/gui-plugins/ScenarioManager/gui/detailedapplicationview.cpp
index 3e5637e3..e62a0cf3 100644
--- a/source/ArmarXGui/gui-plugins/ScenarioManager/gui/detailedapplicationview.cpp
+++ b/source/ArmarXGui/gui-plugins/ScenarioManager/gui/detailedapplicationview.cpp
@@ -31,12 +31,35 @@
 #include <ArmarXCore/core/util/algorithm.h>
 #include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
 #include <ArmarXCore/core/application/properties/PropertyDefinitionHelpFormatter.h>
+#include <ArmarXCore/util/ScenarioManagerCommon/parser/XMLScenarioParser.h>
+#include <ArmarXCore/util/ScenarioManagerCommon/parser/PackageBuilder.h>
 
 #define UPDATE_TIMER_INTERVAL 500
 
 using namespace ScenarioManager;
 using namespace Data_Structure;
 
+// Returns {package, scenario}
+std::pair<std::string, std::string> scenarioInfoFromLink(const std::filesystem::path& linkpath)
+{
+    auto instancePath = std::filesystem::canonical(linkpath);
+    auto scenarioFolder = instancePath.parent_path().parent_path();
+    std::string scenarioName = scenarioFolder.filename();
+    auto scenarioScx = scenarioFolder / (scenarioName + ".scx");
+    if (!std::filesystem::exists(scenarioScx))
+    {
+        return {"unknown", "unknown"};
+    }
+    auto packageName = ScenarioManager::Parser::XMLScenarioParser().getPackageNameFromScx(scenarioScx);
+
+    if (packageName.empty())
+    {
+        return {"unknown", scenarioName};
+    }
+
+    return {packageName, scenarioName};
+}
+
 DetailedApplicationView::DetailedApplicationView(QWidget* parent) :
     QWidget(parent),
     ui(new Ui::DetailedApplicationView),
@@ -210,9 +233,27 @@ void DetailedApplicationView::showApplicationInstance(ApplicationInstancePtr app
     ui->makeLocalButton->setVisible(readOnly);
     ui->addParameterButton->setVisible(!readOnly);
 
+    std::string label = appInstance->getName();
+    if (readOnly)
+    {
+        auto [package, scenario] = scenarioInfoFromLink(appInstance->getConfigPath());
+        label += " -> " + scenario;
+        std::string tooltip;
+        if (package == "unknown")
+        {
+            tooltip = "Could not determine original scenario for config '" +
+                      std::string(std::filesystem::canonical(appInstance->getConfigPath())) + "'";
+        }
+        else
+        {
+            tooltip = "Original is in " +
+                      (package == "unknown" ? "unknown package" : "package " + package) +
+                      ", scenario " + scenario;
+        }
+        ui->dataLabel->setToolTip(QString::fromStdString(tooltip));
+    }
+    ui->dataLabel->setText(QString::fromStdString(label));
 
-    ui->dataLabel->setText(QString::fromStdString(appInstance->getName()));
-    ui->stateLabel->setText(QString::fromStdString(appInstance->getStatus()));
     statusUpdateRelevant = true;
     lastAppInstance = appInstance;
     lastScenario = ScenarioPtr(nullptr);
-- 
GitLab