summaryrefslogtreecommitdiff
path: root/src/diagramitemfactory.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/diagramitemfactory.h')
-rw-r--r--src/diagramitemfactory.h62
1 files changed, 58 insertions, 4 deletions
diff --git a/src/diagramitemfactory.h b/src/diagramitemfactory.h
index 274957e..5874541 100644
--- a/src/diagramitemfactory.h
+++ b/src/diagramitemfactory.h
@@ -17,15 +17,69 @@
#ifndef DIAGRAMITEMFACTORY_H
#define DIAGRAMITEMFACTORY_H
-#include "utils/factory.h"
-
+#include <QMap>
+#include <QStringList>
+#include "utils/singelton.h"
class DiagramItem;
+class DiagramItemProperties;
-class DiagramItemFactory : public Factory<DiagramItemFactory, DiagramItem>
+class DiagramItemFactory : public Singelton<DiagramItemFactory>
{
-private:
+
+ class CreatorBase
+ {
+ public:
+ virtual DiagramItem *create() = 0;
+ virtual DiagramItemProperties *createPropertiesEditor(QWidget *parent = 0) = 0;
+ };
+
+ template <typename ItemType>
+ class Creator : public CreatorBase
+ {
+ public:
+ DiagramItem *create()
+ { return new ItemType(); }
+ DiagramItemProperties *createPropertiesEditor(QWidget *parent = 0)
+ { return ItemType::createPropertiesEditor(parent); }
+ };
+
+public:
+
+ static DiagramItem *create(const QString &key)
+ {
+ DiagramItemFactory *inst = DiagramItemFactory::instance();
+ if (!inst->m_map.contains(key))
+ return NULL;
+ return inst->m_map[key]->create();
+ }
+
+ static DiagramItemProperties *createPropertiesEditor(const QString &key, QWidget *parent = 0)
+ {
+ DiagramItemFactory *inst = DiagramItemFactory::instance();
+ if (!inst->m_map.contains(key))
+ return NULL;
+ return inst->m_map[key]->createPropertiesEditor(parent);
+ }
+
+ static QStringList keys()
+ {
+ DiagramItemFactory *inst = DiagramItemFactory::instance();
+ return inst->m_map.keys();
+ }
+
+protected:
+
+ template <typename Type> void add()
+ {
+ m_map[Type::staticTypeName()] = new Creator<Type>();
+ }
+
+ QMap<QString, CreatorBase*> m_map;
+
DiagramItemFactory();
friend class Singelton<DiagramItemFactory>;
};
+#define FACTORY_ADD_TYPE(ST) add<ST>();
+
#endif