From ccc5ec17aae9a1a7715bf334d316aae1f99c7250 Mon Sep 17 00:00:00 2001
From: Fabian Reister <fabian.reister@kit.edu>
Date: Thu, 3 Aug 2023 13:09:20 +0200
Subject: [PATCH] finishing implementation

---
 .../applications/ArmarXGui/ArmarXGuiApp.cpp   | 20 +----------
 .../ScenarioManagerWidgetController.cpp       | 35 +++++++++++++------
 .../ScenarioManagerWidgetController.h         |  4 +++
 .../StatechartEditorController.cpp            |  4 +--
 4 files changed, 32 insertions(+), 31 deletions(-)

diff --git a/source/ArmarXGui/applications/ArmarXGui/ArmarXGuiApp.cpp b/source/ArmarXGui/applications/ArmarXGui/ArmarXGuiApp.cpp
index 5e26bded..1a2a1ea2 100644
--- a/source/ArmarXGui/applications/ArmarXGui/ArmarXGuiApp.cpp
+++ b/source/ArmarXGui/applications/ArmarXGui/ArmarXGuiApp.cpp
@@ -98,24 +98,6 @@ namespace armarx
         return armarx::Application::run(argc, argv);
     }
 
-    inline std::vector<std::string> allArmarXSourcePackages()
-    {
-        auto packagesStd = CMakePackageFinder::FindAllArmarXSourcePackages();
-
-        // force deterministic loading of plugins by name
-        std::sort(packagesStd.begin(), packagesStd.end(),
-        [](const std::string& lhs, const std::string& rhs) -> bool {
-            return simox::alg::to_lower(lhs) < simox::alg::to_lower(rhs);
-        });
-
-        ARMARX_VERBOSE << "Discovered: ";
-        for(const auto& pkg : packagesStd)
-        {
-            ARMARX_VERBOSE << "- " << pkg;
-        }
-
-        return packagesStd;
-    }
 
 
     int ArmarXGuiApp::exec(const ArmarXManagerPtr& armarXManager)
@@ -128,7 +110,7 @@ namespace armarx
         (void)coin_setenv("COIN_SEPARATE_DIFFUSE_TRANSPARENCY_OVERRIDE", "1", TRUE);
 
         {
-            const std::vector<std::string> packageNames = allArmarXSourcePackages(); // getDefaultPackageNames();
+            const std::vector<std::string> packageNames = getArmarXPackageNames();
             QString configToLoad;
             if (getProperty<std::string>("GuiConfigFile").isSet())
             {
diff --git a/source/ArmarXGui/gui-plugins/ScenarioManager/ScenarioManagerWidgetController.cpp b/source/ArmarXGui/gui-plugins/ScenarioManager/ScenarioManagerWidgetController.cpp
index dee6c917..2b85b2bf 100644
--- a/source/ArmarXGui/gui-plugins/ScenarioManager/ScenarioManagerWidgetController.cpp
+++ b/source/ArmarXGui/gui-plugins/ScenarioManager/ScenarioManagerWidgetController.cpp
@@ -62,18 +62,28 @@ ScenarioManagerWidgetController::ScenarioManagerWidgetController() :
     QSettings q_settings(QString(settingsFile.c_str()), QSettings::NativeFormat);
     bool editModeState = q_settings.value("editMode", false).toBool();
     editMode(editModeState);
-
-    autoDiscoverArmarXPackages();
 }
 
 ScenarioManagerWidgetController::~ScenarioManagerWidgetController()
 {
 }
 
+bool ScenarioManagerWidgetController::isPackageAutoDiscoveryEnabled()
+{
+    if(hasProperty("AutodiscoverPackages"))
+    {
+        return getProperty<bool>("AutodiscoverPackages").getValue();
+    }
+    ARMARX_WARNING << "AutodiscoverPackages property not found"; 
+
+    return false; // Property not available. Default: don't use autodiscovery
+}
+
 
 void ScenarioManagerWidgetController::autoDiscoverArmarXPackages() 
 {
-    QSettings autosettings("KIT", "ScenarioManager");
+    QSettings autosettings(QString(settingsFile.c_str()), QSettings::NativeFormat);
+
 
     auto packagesStd = CMakePackageFinder::FindAllArmarXSourcePackages();
     std::sort(packagesStd.begin(), packagesStd.end(),
@@ -82,11 +92,11 @@ void ScenarioManagerWidgetController::autoDiscoverArmarXPackages()
     });
 
     QStringList packages;
-    ARMARX_VERBOSE << "Discovered: ";
+    ARMARX_INFO << "Discovered the following ArmarX packages: ";
     for(const auto& pkg : packagesStd)
     {
         packages.push_back(QString::fromStdString(pkg));
-        ARMARX_VERBOSE << "- " << pkg;
+        ARMARX_INFO << "- " << pkg;
     }
 
     autosettings.setValue("packages", packages);
@@ -97,13 +107,13 @@ ScenarioManagerWidgetController::loadSettings(QSettings* settings)
     QSettings autosettings(QString(settingsFile.c_str()), QSettings::NativeFormat);
     QStringList scenarios = settings->value("scenarios", QStringList()).toStringList();
     scenarios.removeDuplicates();
-    if (scenarios.size() > 0)
+    if (not scenarios.empty())
     {
         autosettings.setValue("scenarios", scenarios);
     }
     QStringList packages = settings->value("packages", QStringList()).toStringList();
     packages.removeDuplicates();
-    if (packages.size() > 0)
+    if (not packages.empty())
     {
         autosettings.setValue("packages", packages);
     }
@@ -272,6 +282,12 @@ ScenarioManagerWidgetController::init()
                      widget.applicationDatabase,
                      SLOT(setModel(FilterableTreeModelSortFilterProxyModelPtr)));
 
+    if(isPackageAutoDiscoveryEnabled())
+    {
+        ARMARX_IMPORTANT << "ArmarX package autodiscovery enabled.";
+        autoDiscoverArmarXPackages();
+    }
+
     widget.scenarioView->setModel(scenarioListController.getTreeModel());
 
     connect(editModeAction, SIGNAL(toggled(bool)), this, SLOT(editMode(bool)));
@@ -284,13 +300,12 @@ ScenarioManagerWidgetController::init()
     QStringList packages = settings.value("packages").toStringList();
     packages.removeDuplicates();
 
-    if (packages.size() == 0)
+    if (packages.empty())
     {
-        //armarx::ArmarXMainWindow* mainWindow = static_cast<ArmarXMainWindow*>();
         armarx::ApplicationPtr application = Application::getInstance();
         if (application.get() != nullptr)
         {
-            for (auto package : application->getDefaultPackageNames())
+            for (const auto& package : application->getArmarXPackageNames())
             {
                 packages << QString::fromStdString(package);
             }
diff --git a/source/ArmarXGui/gui-plugins/ScenarioManager/ScenarioManagerWidgetController.h b/source/ArmarXGui/gui-plugins/ScenarioManager/ScenarioManagerWidgetController.h
index 56b0b96d..29473c4f 100644
--- a/source/ArmarXGui/gui-plugins/ScenarioManager/ScenarioManagerWidgetController.h
+++ b/source/ArmarXGui/gui-plugins/ScenarioManager/ScenarioManagerWidgetController.h
@@ -157,5 +157,9 @@ namespace armarx
         {
             return QIcon(":icons/ArmarX_Play_Store.svg");
         }
+
+    private:
+        bool isPackageAutoDiscoveryEnabled();
+
     };
 }
diff --git a/source/ArmarXGui/gui-plugins/StatechartEditorPlugin/StatechartEditorController.cpp b/source/ArmarXGui/gui-plugins/StatechartEditorPlugin/StatechartEditorController.cpp
index 9a828da8..dd6163d8 100644
--- a/source/ArmarXGui/gui-plugins/StatechartEditorPlugin/StatechartEditorController.cpp
+++ b/source/ArmarXGui/gui-plugins/StatechartEditorPlugin/StatechartEditorController.cpp
@@ -168,7 +168,7 @@ namespace armarx
         if (!profiles)
         {
             profiles = StatechartProfiles::ReadProfileFiles(
-                Application::getInstance()->getDefaultPackageNames());
+                Application::getInstance()->getArmarXPackageNames());
         }
 
         if (settings->contains("selectedProfile"))
@@ -909,7 +909,7 @@ armarx::StatechartEditorController::getConfigDialog(QWidget* parent)
     if (!dialog)
     {
         profiles = StatechartProfiles::ReadProfileFiles(
-            Application::getInstance()->getDefaultPackageNames());
+            Application::getInstance()->getArmarXPackageNames());
         dialog = new StatechartEditorConfigDialog(profiles, parent);
     }
 
-- 
GitLab