00001 00017 #ifndef GFXPROXY_H 00018 #define GFXPROXY_H 00019 00020 #include "GfxBase.h" 00021 #include <Midad/Util/NamedProxy.h> 00022 #include "GfxMenu.h" 00023 #include <sigc++/sigc++.h> 00024 #include <sigc++/class_slot.h> 00025 #include <list> 00026 #include <iostream> 00027 00028 class EVD; 00029 class GfxProxyBase: public NamedProxy 00030 { 00031 static std::list<const char*> fNames; 00032 GfxMenu* fMenu; 00033 public: 00034 GfxProxyBase(const char* name, GfxMenu* menu = 0) 00035 : NamedProxy(name,"Gfx") 00036 ,fMenu(menu) { 00037 00038 fNames.push_back(name); 00039 gfx_added.emit(name); 00040 } 00041 virtual ~GfxProxyBase() {}; 00042 static SigC::Signal1<void,const char*> gfx_added; 00043 00044 virtual GfxBase* Create() = 0; 00045 virtual GuiMenu* MakeMenu(EVD* mp) { return fMenu ? fMenu->MakeMenu(mp) : 0; } 00046 00047 static std::list<const char*> GetRegisteredNames() { return fNames; } 00048 }; 00049 00050 template<class T> 00051 class GfxProxy : public GfxProxyBase 00052 { 00053 std::list<T*> fInstances; 00054 void Remove(T *t) { fInstances.remove(t); } 00055 00056 public: 00057 00058 GfxProxy(const char* name, GfxMenu* menu = 0) : GfxProxyBase(name,menu) {} 00059 virtual ~GfxProxy() {} 00060 00061 T* Create() { 00062 T* t = new T(); 00063 fInstances.push_back(t); 00064 t->destroyed.connect(SigC::bind(SigC::slot_class(*this,&GfxProxy<T>::Remove),t)); 00065 return t; 00066 } 00067 std::list<T*> GetInstances() { return fInstances; }; 00068 00069 }; // end of class GfxProxy 00070 00071 #endif // GFXPROXY_H
1.3.9.1