ISXMr/libs/isxdk/include/ISUI/LGUIElement.h

688 lines
22 KiB
C++

#pragma once
#include "LGUIManager.h"
#define NOTIFICATION_USER (0x10000000)
#define NOTIFICATION_NULL 0
#define NOTIFICATION_CLICKED 1
//#define NOTIFICATION_CLOSE 2
#define NOTIFICATION_CHANGETEXT 3
#define NOTIFICATION_CHANGENUMBER 4
#define NOTIFICATION_ENTER 5
#define NOTIFICATION_LMOUSEDOWN 6
#define NOTIFICATION_LMOUSEUP NOTIFICATION_CLICKED
#define NOTIFICATION_RMOUSEDOWN 7
#define NOTIFICATION_RMOUSEUP 8
#define NOTIFICATION_CHANGESELECTION 9
#define NOTIFICATION_LMOUSEDOUBLECLICK 10
#define NOTIFICATION_RMOUSEDOUBLECLICK 11
#define NOTIFICATION_DOUBLECLICKSELECTION 12
#define NOTIFICATION_CHANGEORDER 13
#define NOTIFICATION_MOUSEMOVE 14
#define NOTIFICATION_MOUSEWHEEL 15
#define NOTIFICATION_FONTCHANGED 50
#define NOTIFICATION_DELETING 51
enum eElementPositionType
{
EPT_FIXED=0,
EPT_VARIABLE=1,
EPT_PERCENT=2,
EPT_REVERSE_FIXED=3,
};
enum eElementFadeState
{
EFS_NORMAL=0,
EFS_DELAYING=1,
EFS_FADING=2,
EFS_FADED=3,
EFS_IN_DELAYING=4,
EFS_IN_FADING=5,
EFS_IN_FADED=6,
};
struct ElementPosition
{
eElementPositionType Type;
union
{
unsigned int Size;
float fSize;
};
};
class XMLHelper
{
public:
LGUI_API static bool GetToggle(class XMLNode *pXML, const char *Name, bool Default=0);
LGUI_API static unsigned int GetIntValue(class XMLNode *pXML, const char *Name, unsigned int Default=0);
LGUI_API static float GetFloatValue(class XMLNode *pXML, const char *Name, float Default=0.0f);
LGUI_API static unsigned int GetHexValue(class XMLNode *pXML, const char *Name, unsigned int Default=0);
LGUI_API static unsigned int GetFactorValue(class XMLNode *pXML, const char *Name, float &FactorResult, unsigned int Default=0);
LGUI_API static unsigned int GetElementPositionValue(class XMLNode *pXML, const char *Name, ElementPosition &EPResult, unsigned int Default=0);
LGUI_API static bool GetElementPositionValueEx(class XMLNode *pXML, const char *Name, ElementPosition &EPResult, unsigned int &ulResult);
LGUI_API static const char *GetStringValue(class XMLNode *pXML, const char *Name, const char *Default = "");
LGUI_API static class XMLNode *GetChild(class XMLNode *pXML, const char *Name);
LGUI_API static const char *GetText(class XMLNode *pXML);
LGUI_API static class XMLNode *GetPrev(class XMLNode *pXML);
LGUI_API static class XMLNode *GetParent(class XMLNode *pXML);
LGUI_API static class XMLNode *GetNext(class XMLNode *pXML);
LGUI_API static class XMLNode *GetFirstChild(class XMLNode *pXML);
LGUI_API static unsigned int GetIntAttribute(class XMLNode *pXML, const char *Name, unsigned int Default=0);
LGUI_API static float GetFloatAttribute(class XMLNode *pXML, const char *Name, float Default=0.0f);
LGUI_API static unsigned int GetHexAttribute(class XMLNode *pXML, const char *Name, unsigned int Default=0);
LGUI_API static unsigned int GetFactorAttribute(class XMLNode *pXML, const char *Name, float &FactorResult, unsigned int Default=0);
LGUI_API static unsigned int GetElementPositionAttribute(class XMLNode *pXML, const char *Name, ElementPosition &EPResult, unsigned int Default=0);
LGUI_API static const char *GetStringAttribute(class XMLNode *pXML, const char *Name, const char *Default="");
static inline bool GetTemplateToggle(class XMLNode *pXML, const char *Name, class XMLNode *pTemplate, bool Default=0)
{
Default=GetToggle(pTemplate,Name,Default);
return GetToggle(pXML,Name,Default);
}
static inline unsigned int GetTemplateIntValue(class XMLNode *pXML, const char *Name, class XMLNode *pTemplate, unsigned int Default=0)
{
Default=GetIntValue(pTemplate,Name,Default);
return GetIntValue(pXML,Name,Default);
}
static inline float GetTemplateFloatValue(class XMLNode *pXML, const char *Name, class XMLNode *pTemplate, float Default=0)
{
Default=GetFloatValue(pTemplate,Name,Default);
return GetFloatValue(pXML,Name,Default);
}
static inline unsigned int GetTemplateHexValue(class XMLNode *pXML, const char *Name, class XMLNode *pTemplate, unsigned int Default=0)
{
Default=GetHexValue(pTemplate,Name,Default);
return GetHexValue(pXML,Name,Default);
}
static inline unsigned int GetTemplateFactorValue(class XMLNode *pXML, const char *Name, float &FactorResult, class XMLNode *pTemplate)
{
float TempFactorResult;
unsigned int Default=GetFactorValue(pTemplate,Name,TempFactorResult,0);
unsigned int Ret=GetFactorValue(pXML,Name,FactorResult,0);
if (!Ret && !FactorResult)
{
FactorResult=TempFactorResult;
return Default;
}
return Ret;
}
static inline unsigned int GetTemplateElementPositionValue(class XMLNode *pXML, const char *Name, ElementPosition &EPResult, class XMLNode *pTemplate)
{
unsigned int Ret=0;
if (GetElementPositionValueEx(pXML,Name,EPResult,Ret))
return Ret;
return GetElementPositionValue(pTemplate,Name,EPResult,0);
}
static inline const char *GetTemplateStringValue(class XMLNode *pXML, const char *Name, class XMLNode *pTemplate, const char *Default="")
{
Default=GetStringValue(pTemplate,Name,Default);
return GetStringValue(pXML,Name,Default);
}
static inline class XMLNode *GetTemplateChild(class XMLNode *pXML, const char *Name, class XMLNode *pTemplate)
{
class XMLNode *pNode=GetChild(pXML,Name);
if (pNode)
return pNode;
return GetChild(pTemplate,Name);
}
static inline unsigned int GetTemplateIntAttribute(class XMLNode *pXML, const char *Name, class XMLNode *pTemplate, unsigned int Default=0)
{
Default=GetIntAttribute(pTemplate,Name,Default);
return GetIntAttribute(pXML,Name,Default);
}
static inline float GetTemplateFloatAttribute(class XMLNode *pXML, const char *Name, class XMLNode *pTemplate, float Default=0)
{
Default=GetFloatAttribute(pTemplate,Name,Default);
return GetFloatAttribute(pXML,Name,Default);
}
static inline unsigned int GetTemplateHexAttribute(class XMLNode *pXML, const char *Name, class XMLNode *pTemplate,unsigned int Default=0)
{
Default=GetHexAttribute(pTemplate,Name,Default);
return GetHexAttribute(pXML,Name,Default);
}
static inline unsigned int GetTemplateFactorAttribute(class XMLNode *pXML, const char *Name, float &FactorResult, class XMLNode *pTemplate)
{
float TempFactorResult;
unsigned int Default=GetFactorAttribute(pTemplate,Name,TempFactorResult,0);
unsigned int Ret=GetFactorAttribute(pXML,Name,FactorResult,0);
if (!Ret && !FactorResult)
{
FactorResult=TempFactorResult;
return Default;
}
return Ret;
}
static inline const char *GetTemplateStringAttribute(class XMLNode *pXML, const char *Name, class XMLNode *pTemplate, const char *Default = "")
{
Default=GetStringAttribute(pTemplate,Name,Default);
return GetStringAttribute(pXML,Name,Default);
}
};
struct _Line
{
POINT2I A;
POINT2I B;
};
/*
struct _TexturedPoint
{
POINT2I pt;
LGUITexture *pTexture;
unsigned int Weight;
};
/**/
struct _CreateElement
{
int X;
int Y;
unsigned int Width;
unsigned int Height;
ElementPosition XFactor;
ElementPosition YFactor;
ElementPosition HeightFactor;
ElementPosition WidthFactor;
bool bVisible;
char bAlwaysOnTop;
};
struct FullElementPosition
{
int X;
ElementPosition XFactor;
int Y;
ElementPosition YFactor;
unsigned int Height;
ElementPosition HeightFactor;
unsigned int Width;
ElementPosition WidthFactor;
};
class LGUIElement
{
public:
LGUI_API LGUIElement(const char *p_Factory, LGUIElement *p_pParent, const char *p_Name);
LGUI_API virtual ~LGUIElement();
LGUI_API void Delete(); // dont call this. use Destroy() instead.
LGUI_API bool TextureFromArgs(int argc, char *argv[], LGUITexture **ppTexture);
LGUI_API virtual bool FromXML(class XMLNode *pXML, class XMLNode *pTemplate=0);
LGUI_API virtual LGUITexture *TextureFromXML(class XMLNode *pXML, const char *ValueName, class XMLNode *pTemplate = 0);
LGUI_API virtual LGUIFont *FontFromXML(class XMLNode *pXML, const char *ValueName, class XMLNode *pTemplate = 0);
LGUI_API virtual LGUIFixedFont *FixedFontFromXML(class XMLNode *pXML, const char *ValueName, class XMLNode *pTemplate = 0);
LGUI_API virtual LGUIEmbeddedScript *EmbeddedScriptFromXML(class XMLNode *pXML, const char *ValueName, class XMLNode *pTemplate = 0, const char *Parameters = "");
LGUI_API virtual bool IsTypeOf(char *TestFactory);
LGUI_API virtual void RecalculateSize(bool RecalculateChildren);
LGUI_API virtual void RecalculateChildrenSize();
LGUI_API virtual void SizeRecalculated(bool Changed) {};
LGUI_API virtual void Render();
LGUI_API virtual void RenderChildren();
LGUI_API virtual void Show(bool bShow) {bVisible=bShow;}
LGUI_API virtual void Center();
LGUI_API virtual bool OnLMouseUp(POINT2I &pt);// {return false;}
LGUI_API virtual bool OnLMouseDown(POINT2I &pt);// {return false;}
LGUI_API virtual bool OnRMouseUp(POINT2I &pt);// {return false;}
LGUI_API virtual bool OnRMouseDown(POINT2I &pt);// {return false;}
LGUI_API virtual bool OnLMouseDoubleClick(POINT2I &pt);// {return false;}
LGUI_API virtual bool OnRMouseDoubleClick(POINT2I &pt);// {return false;}
LGUI_API virtual bool OnMouseMove(POINT2I &pt);// {return false;}
LGUI_API virtual bool OnMouseWheel(int Offset);// {return false;};
LGUI_API virtual bool OnKeyUp(unsigned int VKey);// {return false;}
LGUI_API virtual bool OnKeyDown(unsigned int VKey);// {return false;}
LGUI_API virtual void OnNotify(LGUIElement *pElement, unsigned int Notification, UINT_PTR Value) {if (pParent) pParent->OnNotify(pElement,Notification,Value);};
LGUI_API virtual void OnMouseEnter(POINT2I &pt);// {}
LGUI_API virtual void OnMouseExit(LGUIElement *pNewFocus);// {}
LGUI_API virtual void OnKeyboardEnter();// {}
LGUI_API virtual void OnKeyboardExit(LGUIElement *pNewFocus);// {}
LGUI_API virtual void OnLMouseDownOther(LGUIElement *pOther) {}
LGUI_API virtual void OnCreate() {}
LGUI_API virtual void OnDestroy() {}
LGUI_API virtual class LSTypeDefinition *GetLSType();
LGUI_API virtual bool GetStoragePosition(int &StoreX, int &StoreY, unsigned int &StoreWidth, unsigned int &StoreHeight);
inline LGUIElement *GetParent() {return pParent;}
inline LGUIElement *GetFirstChild() {return pFirstChild;}
inline LGUIElement *GetLastChild() {return pLastChild;}
inline LGUIElement *GetPrev() {return pPrev;}
inline LGUIElement *GetNext() {return pNext;}
LGUI_API LGUIElement *Walk(bool bRequireVisible, LGUIElement *pStopAtParent);
LGUI_API LGUIElement *WalkReverse(bool bRequireVisible, LGUIElement *pStopAtParent);
inline void SetNext(LGUIElement *pElement) {pNext=pElement;}
inline void SetPrev(LGUIElement *pElement) {pPrev=pElement;}
inline void SetLastChild(LGUIElement *pElement) {pLastChild=pElement;}
inline void SetFirstChild(LGUIElement *pElement) {pFirstChild=pElement;}
inline bool IsDescendentOf(LGUIElement *pElement)
{
LGUIElement *pTest=pParent;
while(pTest)
{
if (pElement==pTest)
return true;
pTest=pTest->pParent;
}
return false;
}
inline char *GetName() {return Name;}
inline char *GetFullName() {return FullName;}
inline char *GetFactory() {return Factory;}
LGUI_API void AddChild(LGUIElement *pElement);
LGUI_API void DeleteChild(LGUIElement *pElement);
LGUI_API virtual LGUIElement *FindChild(const char *Name);
LGUI_API LGUIElement *FindUsableChild(const char *Name, const char *Type);
inline void SetLeft(int NewValue) {X=NewValue;}
inline void SetTop(int NewValue) {Y=NewValue;}
inline void GetXFactor(ElementPosition &EP) {EP=XFactor;}
inline void GetYFactor(ElementPosition &EP) {EP=YFactor;}
inline void GetHeightFactor(ElementPosition &EP) {EP=HeightFactor;}
inline void GetWidthFactor(ElementPosition &EP) {EP=WidthFactor;}
inline void SetWidth(unsigned int NewValue) {Width=NewValue;}
inline void SetHeight(unsigned int NewValue) {Height=NewValue;}
inline int GetRight() {return X+Width;}
inline int GetBottom() {return Y+Height;}
inline int GetTop() {return Y;}
inline int GetLeft() {return X;}
inline unsigned int GetHeight() {return Height;}
inline unsigned int GetWidth() {return Width;}
inline unsigned int GetID() {return ID;}
inline bool IsVisible() {return bVisible;}
LGUI_API bool IsReallyVisible();
inline unsigned char GetAlwaysOnTop() {return bAlwaysOnTop;}
inline void SetAlwaysOnTop(unsigned char NewValue) { bAlwaysOnTop = NewValue; }
inline bool GetStorePosition() {return bStorePosition;}
inline void Destroy() {pParent->DeleteChild(this);}
inline void GetOriginalPosition(FullElementPosition &Dest) {Dest=OriginalPosition;}
inline void ResetPosition()
{
X=OriginalPosition.X;
Y=OriginalPosition.Y;
Height=OriginalPosition.Height;
Width=OriginalPosition.Width;
XFactor=OriginalPosition.XFactor;
YFactor=OriginalPosition.YFactor;
HeightFactor=OriginalPosition.HeightFactor;
WidthFactor=OriginalPosition.WidthFactor;
RecalculateSize(true);
}
LGUI_API virtual bool SetFocus();
LGUI_API virtual bool SetMouseOver();
LGUI_API bool IsMouseOver();
LGUI_API bool IsFocus();
LGUI_API bool FillRect(RECT &r,unsigned int Color);
LGUI_API bool FillRectBordered(RECT &r,unsigned int Color,unsigned int BorderSize,unsigned int BorderColor);
LGUI_API bool DrawBorder(RECT &r,unsigned int BorderSize,unsigned int BorderColor);
LGUI_API bool TexturedRect(RECT &r,LGUITexture *pTexture);
LGUI_API bool TexturedRectBordered(RECT &r,LGUITexture *pTexture, unsigned int BorderSize);
LGUI_API bool TexturedRects(unsigned int nRects, LGUITexturedRect *pRects);
LGUI_API bool FillTriangle(LGUITriangle &t,unsigned int Color);
LGUI_API bool TexturedTriangle(LGUITriangle &t,LGUITexture *pTexture);
LGUI_API bool TexturedTriangles(unsigned int nTriangles, LGUITexturedTriangle *pTriangles);
LGUI_API bool DrawLine(_Line &Line, LGUITexture *pTexture, unsigned int Weight=1);
LGUI_API bool DrawLines(_Line *Lines, unsigned int nLines, LGUITexture *pTexture, unsigned int Weight=1);
LGUI_API bool DrawLine(_Line &Line, unsigned int Color, unsigned int Weight=1);
LGUI_API bool DrawLines(_Line *Lines, unsigned int nLines, unsigned int Color, unsigned int Weight=1);
// LGUI_API bool DrawPoint(_ColoredPoint &pt);
// LGUI_API bool DrawPoints(_ColoredPoint *Points, unsigned int nPoints);
LGUI_API size_t DrawText(LGUIFont *pFont,const char *Text,int X, int Y);
LGUI_API size_t DrawTextClipped(LGUIFont *pFont,const char *Text,int X, int Y);
LGUI_API size_t DrawTextCenter(LGUIFont *pFont,const char *Text,int X, int Y);
LGUI_API size_t DrawTextRight(LGUIFont *pFont,const char *Text,int X, int Y);
LGUI_API size_t DrawTextClipped(LGUIFont *pFont,const char *Text,int X, int Y, int RightX);
LGUI_API size_t DrawTextCenter(LGUIFont *pFont,const char *Text,int X, int Y, int RightX);
LGUI_API size_t DrawTextRight(LGUIFont *pFont,const char *Text,int X, int Y, int RightX);
LGUI_API size_t DrawColoredText(LGUIFont *pFont,const char *buffer, int X, int Y);
LGUI_API size_t DrawColoredTextClipped(LGUIFont *pFont,const char *buffer, int X, int Y, int RightX);
static LGUI_API void StripColor(const char *In, char *Out);
static LGUI_API size_t ColorStrlen(const char *Text);
LGUI_API virtual LGUIElement *FindMouseOver(POINT2I &pt, LGUIElement *pStart);
LGUI_API bool HitTest(POINT2I &pt);
inline void SetAbsolute(POINT2I &pt) {Absolute=pt;}
inline void GetAbsolute(POINT2I &pt) {pt=Absolute;}
inline bool GetLeftClickThru() {return bLeftClickThru;}
inline bool GetRightClickThru() {return bRightClickThru;}
inline void SetLeftClickThru(bool Value) {bLeftClickThru=Value;}
inline void SetRightClickThru(bool Value) {bRightClickThru=Value;}
inline void SetAbsoluteAlpha(float Value) {AbsoluteAlpha=Value;}
inline float GetAbsoluteAlpha() {return AbsoluteAlpha;}
inline void SetAlpha(float Value) {AlphaLevel=Value;}
inline float GetAlpha() {return AlphaLevel;}
inline void SetFadeAlpha(float Value) {FadeAlphaLevel=Value;}
inline float GetFadeAlpha() {return FadeAlphaLevel;}
inline unsigned int GetFadeDelay() {return FadeDelay;}
inline void SetFadeDelay(unsigned int Value) {FadeDelay=Value;}
inline unsigned int GetFadeDuration() {return FadeDuration;}
inline void SetFadeDuration(unsigned int Value) {FadeDuration=Value;}
inline void BeginFade() {FadeState=EFS_DELAYING;FadeBegan=g_UIManager.RenderTime;}
inline void InstantFade() {FadeState=EFS_FADED;} // FadeDelay must be non-zero to fade normally.
inline void ResetFade() {FadeState=EFS_NORMAL;}
inline eElementFadeState GetFadeState() {return FadeState;}
inline void UpdateFadeState()
{
if (!FadeDelay)
return;
if (FadeState==EFS_NORMAL)
{
if (!HitTest(g_UIManager.MousePos))
{
BeginFade();
}
}
else
{
if (HitTest(g_UIManager.MousePos))
{
ResetFade();
}
}
}
LGUI_API float GetCurrentAlpha();
inline unsigned char ApplyAlpha(unsigned char Value)
{
float fValue=((((float)Value/255.0f)*AbsoluteAlpha)*255.0f);
if (fValue>255)
return 255;
return (unsigned char)fValue;
}
inline unsigned int ApplyAlpha(unsigned int &Value)
{
RGBCOLOR Color;
Color.ARGB=Value;
Color.A=ApplyAlpha(Color.A);
return Color.ARGB;
}
inline float ApplyAlpha(float Value)
{
return Value*AbsoluteAlpha;
}
inline void ExecuteOnLoad() {if (pOnLoad) pOnLoad->Execute();}
inline void ExecuteOnRender() {if (pOnRender) pOnRender->Execute();}
LGUI_API virtual void MoveZUp();
LGUI_API virtual void MoveZDown();
LGUI_API virtual void MoveZTop(bool bAncestorsToo=true);
LGUI_API virtual void MoveZBottom();
void MoveContainerZTop();
static void StripSlashes(char *Text);
// void GetAbsolute();
protected:
char *Factory;
unsigned int ID; // globally unique
char *Name;
char *FullName;
LGUIElement *pParent;
LGUIElement *pPrev;
LGUIElement *pNext;
LGUIElement *pFirstChild;
LGUIElement *pLastChild; // top of Z order
LGUIEmbeddedScript *pOnLoad;
LGUIEmbeddedScript *pOnUnload;
LGUIEmbeddedScript *pOnLeftClick;
LGUIEmbeddedScript *pOnRightClick;
LGUIEmbeddedScript *pOnDoubleLeftClick;
LGUIEmbeddedScript *pOnDoubleRightClick;
LGUIEmbeddedScript *pOnMouseEnter;
LGUIEmbeddedScript *pOnMouseExit;
LGUIEmbeddedScript *pOnMouseMove;
LGUIEmbeddedScript *pOnMouseWheel;
LGUIEmbeddedScript *pOnKeyboardEnter;
LGUIEmbeddedScript *pOnKeyboardExit;
LGUIEmbeddedScript *pOnKeyUp;
LGUIEmbeddedScript *pOnKeyDown;
LGUIEmbeddedScript *pOnLeftDown;
LGUIEmbeddedScript *pOnRightDown;
LGUIEmbeddedScript *pOnRender;
int X;
ElementPosition XFactor;
int Y;
ElementPosition YFactor;
unsigned int Height;
ElementPosition HeightFactor;
unsigned int Width;
ElementPosition WidthFactor;
FullElementPosition OriginalPosition;
bool bStorePosition;
bool bVisible;
char bAlwaysOnTop;
bool bLeftClickThru;
bool bRightClickThru;
float AlphaLevel;
unsigned int FadeBegan;
unsigned int FadeDelay;
unsigned int FadeDuration;
float FadeAlphaLevel;
eElementFadeState FadeState;
unsigned int FadeInDelay;
unsigned int FadeInDuration;
char *AutoTooltip;
inline void Create(_CreateElement &CreateInfo)
{
X=CreateInfo.X;
Y=CreateInfo.Y;
Width=CreateInfo.Width;
Height=CreateInfo.Height;
bVisible=CreateInfo.bVisible;
XFactor=CreateInfo.XFactor;
YFactor=CreateInfo.YFactor;
WidthFactor=CreateInfo.WidthFactor;
HeightFactor=CreateInfo.HeightFactor;
bAlwaysOnTop=CreateInfo.bAlwaysOnTop;
MoveZTop();
}
float AbsoluteAlpha;
POINT2I Absolute;
};
class LGUIElementDeleter
{
public:
virtual void Delete(LGUIElement *pElement)
{
pElement->OnDestroy();
delete pElement;
}
};
class LGUIElementFactory
{
public:
LGUIElementFactory(const char *p_Type, unsigned int LGUIVersion)
{
Register(p_Type,LGUIVersion);
pDeleter = new LGUIElementDeleter;
}
~LGUIElementFactory()
{
if (Type)
{
map<LGUIElement*,unsigned int>::iterator i=Elements.begin();
while(i!=Elements.end())
{
map<LGUIElement*,unsigned int>::iterator cur=i;
i++;
if (cur->second)
{
cur->first->OnDestroy();
if (cur->first->GetParent())
cur->first->GetParent()->DeleteChild(cur->first);
else
{
// delete i->first; // fuck it, avoid crashing
}
}
}
}
Unregister();
delete pDeleter;
}
LGUI_API void Register(const char *p_Type, unsigned int LGUIVersion);
LGUI_API void Unregister();
LGUI_API virtual LGUIElement *CreateUIElement(LGUIElement *pParent, const char *Name, class XMLNode *pXML, const char *Template = 0) = 0;
LGUI_API virtual LGUIElement *CreateUIElement(LGUIElement *pParent, const char *Name) = 0;
virtual void UnregisterUIElement(LGUIElement *pElement)
{
Elements.erase(pElement);
}
inline const char *GetTypeName()
{
return Type;
}
map<LGUIElement*,unsigned int> Elements;
void DeleteUIElement(LGUIElement *pElement)
{
//pElement->OnDestroy();
pDeleter->Delete(pElement);
}
protected:
LGUIElementDeleter *pDeleter;
const char *Type;
};
template<class T>
class LGUIFactory : public LGUIElementFactory
{
public:
LGUIFactory(const char *p_Type) :LGUIElementFactory(p_Type, LGUI_VERSION)
{
}
~LGUIFactory()
{
}
virtual LGUIElement *CreateUIElement(LGUIElement *pParent, const char *Name, class XMLNode *pXML, const char *Template = 0)
{
T *pElement = new T((char*)Type,pParent,(char*)Name);
if (!pElement->FromXML(pXML,g_UIManager.FindTemplate(Template)))
{
if (pParent)
pParent->DeleteChild(pElement);
else
delete pElement;
return 0;
}
Elements[pElement]=1;
return pElement;
}
virtual LGUIElement *CreateUIElement(LGUIElement *pParent, const char *Name)
{
T *pElement = new T((char*)Type,pParent,(char*)Name);
Elements[pElement]=1;
return pElement;
}
};
template<class T>
class DelayedLGUIFactory
{
public:
DelayedLGUIFactory(const char *p_Type)
{
Type=strdup(p_Type);
pFactory=0;
}
~DelayedLGUIFactory()
{
Shutdown();
free((void*)Type);
}
void Initialize()
{
if (pFactory)
return;
pFactory = new LGUIFactory<T>(Type);
}
void Shutdown()
{
if (!pFactory)
return;
delete pFactory;
pFactory=0;
}
const char *Type;
LGUIFactory<T> *pFactory;
};