attach vtk context to gcompose

This commit is contained in:
AndreaRigoni
2026-03-22 12:18:33 +00:00
parent a8f786d8d1
commit 324aaa91b7
36 changed files with 674 additions and 19 deletions

View File

@@ -10,6 +10,7 @@ set(HEADERS
Macros.h
Mpl.h
Object.h
ObjectFactory.h
ObjectsContext.h
Options.h
Serializable.h
@@ -27,6 +28,7 @@ set(SOURCES
Archives.cpp
Debug.cpp
Object.cpp
ObjectFactory.cpp
ObjectsContext.cpp
Options.cpp
Serializable.cpp

View File

@@ -56,7 +56,8 @@ public:
GenericMFPtr sloptr;
std::string slostr;
};
std::string m_InstanceName;
Vector<Signal> sigv;
Vector<Slot> slov;
};
@@ -147,6 +148,15 @@ GenericMFPtr *Object::findSlotImpl(const char *name) const {
void Object::Updated() { ULIB_SIGNAL_EMIT(Object::Updated); }
const std::string& Object::GetInstanceName() const {
return d->m_InstanceName;
}
void Object::SetInstanceName(const std::string& name) {
d->m_InstanceName = name;
this->Updated();
}
// std::ostream &
// operator << (std::ostream &os, uLib::Object &ob)
// {

View File

@@ -27,6 +27,7 @@
#define U_CORE_OBJECT_H
#include <iostream>
#include <string>
// WARNING: COPILE ERROR if this goes after mpl/vector //
// #include "Core/Vector.h"
@@ -74,6 +75,10 @@ public:
Object(const Object &copy);
~Object();
virtual const char * GetClassName() const { return "Object"; }
const std::string& GetInstanceName() const;
void SetInstanceName(const std::string& name);
////////////////////////////////////////////////////////////////////////////
// PARAMETERS //

View File

@@ -0,0 +1,32 @@
#include "ObjectFactory.h"
namespace uLib {
ObjectFactory& ObjectFactory::Instance() {
static ObjectFactory instance;
return instance;
}
void ObjectFactory::Register(const std::string& className, FactoryFunction func) {
if (m_factoryMap.find(className) == m_factoryMap.end()) {
m_factoryMap[className] = func;
}
}
Object* ObjectFactory::Create(const std::string& className) {
auto it = m_factoryMap.find(className);
if (it != m_factoryMap.end()) {
return (it->second)();
}
return nullptr;
}
std::vector<std::string> ObjectFactory::GetRegisteredClasses() const {
std::vector<std::string> classes;
for (auto const& [name, func] : m_factoryMap) {
classes.push_back(name);
}
return classes;
}
} // namespace uLib

68
src/Core/ObjectFactory.h Normal file
View File

@@ -0,0 +1,68 @@
#ifndef U_CORE_OBJECTFACTORY_H
#define U_CORE_OBJECTFACTORY_H
#include <string>
#include <map>
#include <vector>
#include <functional>
#include "Core/Object.h"
namespace uLib {
/**
* @brief Singleton factory for dynamic Object instantiation based on class name.
*/
class ObjectFactory {
public:
typedef std::function<Object*()> FactoryFunction;
/** @brief Get the singleton instance. */
static ObjectFactory& Instance();
/** @brief Register a factory function for a given class name. */
void Register(const std::string& className, FactoryFunction func);
/** @brief Create a new instance of the specified class. */
Object* Create(const std::string& className);
/** @brief Get the names of all registered classes. */
std::vector<std::string> GetRegisteredClasses() const;
private:
ObjectFactory() = default;
~ObjectFactory() = default;
// Prevent copy and assignment
ObjectFactory(const ObjectFactory&) = delete;
ObjectFactory& operator=(const ObjectFactory&) = delete;
std::map<std::string, FactoryFunction> m_factoryMap;
};
/**
* @brief Helper class to statically register a factory function.
*/
template <typename T>
class ObjectRegistrar {
public:
ObjectRegistrar(const std::string& className) {
ObjectFactory::Instance().Register(className, []() -> Object* { return new T(); });
}
};
#define ULIB_REG_CONCAT_IMPL(a, b) a##b
#define ULIB_REG_CONCAT(a, b) ULIB_REG_CONCAT_IMPL(a, b)
/**
* @brief Macro to register a class to the factory.
* Put this in the .cpp file of the class.
*/
#define ULIB_REGISTER_OBJECT(className) \
static uLib::ObjectRegistrar<className> ULIB_REG_CONCAT(g_ObjectRegistrar_, __LINE__)(#className);
#define ULIB_REGISTER_OBJECT_NAME(className, registeredName) \
static uLib::ObjectRegistrar<className> ULIB_REG_CONCAT(g_ObjectRegistrar_, __LINE__)(registeredName);
} // namespace uLib
#endif // U_CORE_OBJECTFACTORY_H

View File

@@ -10,6 +10,7 @@ ObjectsContext::~ObjectsContext() {}
void ObjectsContext::AddObject(Object* obj) {
if (obj && std::find(m_objects.begin(), m_objects.end(), obj) == m_objects.end()) {
m_objects.push_back(obj);
ULIB_SIGNAL_EMIT(ObjectsContext::ObjectAdded, obj);
this->Updated(); // Signal that the context has been updated
}
}
@@ -17,13 +18,18 @@ void ObjectsContext::AddObject(Object* obj) {
void ObjectsContext::RemoveObject(Object* obj) {
auto it = std::find(m_objects.begin(), m_objects.end(), obj);
if (it != m_objects.end()) {
Object* removedObj = *it;
m_objects.erase(it);
ULIB_SIGNAL_EMIT(ObjectsContext::ObjectRemoved, removedObj);
this->Updated(); // Signal that the context has been updated
}
}
void ObjectsContext::Clear() {
if (!m_objects.empty()) {
for (auto obj : m_objects) {
ULIB_SIGNAL_EMIT(ObjectsContext::ObjectRemoved, obj);
}
m_objects.clear();
this->Updated();
}
@@ -44,4 +50,12 @@ Object* ObjectsContext::GetObject(size_t index) const {
return nullptr;
}
void ObjectsContext::ObjectAdded(Object* obj) {
ULIB_SIGNAL_EMIT(ObjectsContext::ObjectAdded, obj);
}
void ObjectsContext::ObjectRemoved(Object* obj) {
ULIB_SIGNAL_EMIT(ObjectsContext::ObjectRemoved, obj);
}
} // namespace uLib

View File

@@ -14,6 +14,8 @@ public:
ObjectsContext();
virtual ~ObjectsContext();
virtual const char * GetClassName() const { return "ObjectsContext"; }
/**
* @brief Adds an object to the context.
* @param obj Pointer to the object to add.
@@ -36,6 +38,12 @@ public:
* @return Const reference to the vector of object pointers.
*/
const std::vector<Object*>& GetObjects() const;
signals:
/** @brief Signal emitted when an object is added. */
virtual void ObjectAdded(Object* obj);
/** @brief Signal emitted when an object is removed. */
virtual void ObjectRemoved(Object* obj);
/**
* @brief Returns the number of objects in the context.

View File

@@ -43,11 +43,23 @@ using namespace boost::placeholders;
// Signals macro //
#define default(vlaue)
#define slots
#ifndef Q_MOC_RUN
#ifndef signals
#define signals /*virtual void init_signals();*/ public
#endif
#ifndef slots
#define slots
#endif
#ifndef emit
#define emit
#endif
#endif
#ifndef SLOT
#define SLOT(a) BOOST_STRINGIZE(a)
#endif
#ifndef SIGNAL
#define SIGNAL(a) BOOST_STRINGIZE(a)
#endif
#define _ULIB_DETAIL_SIGNAL_EMIT(_name, ...) \
do { \