From 7c8d084edfd0dccd103070c03cff0d90b4e04d0f Mon Sep 17 00:00:00 2001
From: Raul Radu <raul.radu@mail.polimi.it>
Date: Thu, 25 Jan 2024 10:03:23 +0100
Subject: [PATCH] [Modules] Final design of Module class w/smart ptr

- Fixed error in Module.cpp: std::shared_ptr<Module>(this) is a mistake
  that can lead to crashes, plus replaceMe accepts raw pointers.
-  customContextMenuActions is now a list of unique pointers since the
   custom actions are stored within the class and used by QT directly.
---
 src/shared/Modules/Module.cpp | 13 ++++++++++---
 src/shared/Modules/Module.h   |  5 ++++-
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/shared/Modules/Module.cpp b/src/shared/Modules/Module.cpp
index a3474ea5..43b12f3e 100644
--- a/src/shared/Modules/Module.cpp
+++ b/src/shared/Modules/Module.cpp
@@ -37,8 +37,7 @@ Module::Module(ModuleId id) : id(id)
 
                     QAction *close = new QAction("Close");
                     connect(close, &QAction::triggered, this,
-                            [this]()
-                            { emit closeMe(std::shared_ptr<Module>(this)); });
+                            [this]() { emit closeMe(this); });
                     menu.addAction(close);
 
                     QAction *replace = new QAction("Replace");
@@ -50,7 +49,7 @@ Module::Module(ModuleId id) : id(id)
                     if (customContextMenuActions.size() > 0)
                     {
                         menu.addSeparator();
-                        menu.addActions(customContextMenuActions);
+                        this->addActionsToMenu(menu);
                     }
 
                     // Load hub actions
@@ -61,6 +60,14 @@ Module::Module(ModuleId id) : id(id)
     }
 }
 
+void Module::addActionsToMenu(QMenu &menu)
+{
+    std::for_each(customContextMenuActions.begin(),
+                  customContextMenuActions.end(),
+                  [&menu](std::unique_ptr<QAction> action)
+                  { menu.addAction(action.get()); });
+}
+
 ModuleId Module::getId() const { return id; }
 
 QString Module::getModuleName() const
diff --git a/src/shared/Modules/Module.h b/src/shared/Modules/Module.h
index 416063ee..7d1800bc 100644
--- a/src/shared/Modules/Module.h
+++ b/src/shared/Modules/Module.h
@@ -62,5 +62,8 @@ signals:
 
 protected:
     ModuleId id;
-    QList<QAction*> customContextMenuActions;
+    QList<std::unique_ptr<QAction>> customContextMenuActions;
+
+private:
+    void addActionsToMenu(QMenu& menu);
 };
-- 
GitLab