diff options
Diffstat (limited to 'src/diagramitemfactory.h')
-rw-r--r-- | src/diagramitemfactory.h | 62 |
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 |