00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef OST_GUI_WIDGET_REGISTRY_HH
00020 #define OST_GUI_WIDGET_REGISTRY_HH
00021
00022 #include <QWidget>
00023 #include <QMap>
00024
00025 #include <ost/gui/module_config.hh>
00026
00027
00028
00029
00030 namespace ost { namespace gui {
00031
00032 class Widget;
00033
00034 class DLLEXPORT_OST_GUI WidgetFactory : public QObject {
00035 protected:
00036 WidgetFactory(const QString& id, const QString& name):
00037 id_(id), name_(name)
00038 {}
00039 public:
00040 const QString& GetUniqueID() const { return id_; }
00041 const QString& GetFullName() const { return name_; }
00042
00043 virtual Widget* Create(QWidget* parent)=0;
00044 private:
00045 QString id_;
00046 QString name_;
00047 };
00048
00049 #define OST_REGISTER_WIDGET_WITH_DEFAULT_FACTORY(ns, class_name, full_name) \
00050 class class_name##Factory : public WidgetFactory { \
00051 public: \
00052 class_name##Factory(): WidgetFactory(#ns"::"#class_name, full_name) {} \
00053 Widget* Create(QWidget* parent) \
00054 { \
00055 return new class_name(parent); \
00056 } \
00057 }; \
00058 bool class_name##_registered=WidgetRegistry::Instance()-> \
00059 RegisterWidgetFactory(new class_name##Factory)
00060
00061 #define OST_REGISTER_WIDGET(class_name, factory) \
00062 bool class_name##_registered=WidgetRegistry::Instance()-> \
00063 RegisterWidgetFactory(new factory)
00064
00065
00067 class DLLEXPORT_OST_GUI WidgetRegistry : public QObject {
00068 public:
00069 static WidgetRegistry* Instance();
00073 bool RegisterWidgetFactory(WidgetFactory* factory);
00074
00078 bool UnregisterWidgetFactory(const QString& id);
00079
00081 Widget* Create(const QString& id, QWidget* parent);
00082 QString GetFullName(const QString& id);
00083 private:
00084 WidgetRegistry() {}
00085 QMap<QString, WidgetFactory*> id_to_factory_;
00086 };
00087
00088
00089 }}
00090
00091 #endif