#include "ExampleControl.h"
#include "GfxWrap.h"
#include "GUIStreamReader.h"
#include "GUIStreamWriter.h"
#include "GUIStreamingException.h"
#include "GUIControlResource.h"
#include "GUIMemLeakWatcher.h" // <-- has to be the last include
#define EXAMPLE_CONTROL_CLASS_VERSION 1
// The minimal class version allowed.
#define EXAMPLE_CONTROL_CLASS_MIN_VERSION 1
ExampleControl::ExampleControl(
CGUICompositeObject *const pParent,
const eC_Value &vX, const eC_Value &vY,
const eC_Value &vWidth, const eC_Value &vHeight,
eC_UInt uiInnerColor, eC_UInt uiBorderColor,
eC_Value vBorderWidth,
const ObjectHandle_t &eID)
: CGUICompositeObject(pParent, vX, vY, vWidth, vHeight, eID),
m_uiInnerColor(uiInnerColor),
m_uiBorderColor(uiBorderColor),
m_vBorderWidth(vBorderWidth)
{
SetXMLTag("ExampleControl");
}
ExampleControl::ExampleControl()
: m_uiInnerColor(0), m_uiBorderColor(0), m_vBorderWidth(eC_FromInt(0))
{
SetXMLTag("ExampleControl");
}
void ExampleControl::SetCenterColor(eC_UInt uiInnerColor)
{
if (uiInnerColor != m_uiInnerColor)
{
m_uiInnerColor = uiInnerColor;
InvalidateArea();
}
}
void ExampleControl::SetBorderColor(eC_UInt uiBorderColor)
{
if (uiBorderColor != m_uiBorderColor)
{
m_uiBorderColor = uiBorderColor;
InvalidateArea();
}
}
void ExampleControl::SetBorderWidth(eC_Value vBorderWidth)
{
if (vBorderWidth != m_vBorderWidth)
{
m_vBorderWidth = vBorderWidth;
InvalidateArea();
}
}
void ExampleControl::Flip(const eC_Bool& rbVertical)
{
if (rbVertical)
{
// flip vertical means swap left and right side
CGUIObject* pkCurrentObject;
for (int i = 0; i < GetNumberOfChildren(); ++i)
{
pkCurrentObject = GetChild(i);
if (pkCurrentObject->IsCompositeObject())
pkCurrentObject->IsAnimating(); //Flip(rbVertical);
else
{
pkCurrentObject->SetRelXPos(GetWidth() - (pkCurrentObject->GetWidth() + pkCurrentObject->GetRelXPos()));
pkCurrentObject->InvalidateArea();
}
}
}
else
{
// flip horizontal means swap top and bottom side
CGUIObject* pkCurrentObject;
for (int i = 0; i < GetNumberOfChildren(); ++i)
{
pkCurrentObject = GetChild(i);
if (pkCurrentObject->IsCompositeObject())
pkCurrentObject->IsAnimating(); //Flip(rbVertical);
else
{
pkCurrentObject->SetRelYPos(GetHeight() - (pkCurrentObject->GetHeight() + pkCurrentObject->GetRelYPos()));
pkCurrentObject->InvalidateArea();
}
}
}
}
void ExampleControl::Rotate(const eC_Int& riDegrees)
{
switch (riDegrees)
{
case 0:
default:
// do nothing
break;
case 90:
{
// rotate 90 degrees clockwise
// width and height will be swapped
// x and y of every object will be re-calculated and swapped
CGUIRect r = GetRelRect();
SetWidth(r.GetHeight());
SetHeight(r.GetWidth());
CGUIObject* pkCurrentObject;
for (int i = 0; i < GetNumberOfChildren(); ++i)
{
pkCurrentObject = GetChild(i);
r = pkCurrentObject->GetRelRect();
pkCurrentObject->SetRelXPos(GetWidth() - (r.GetWidth() + r.GetY1()));
pkCurrentObject->SetRelYPos(r.GetX1());
pkCurrentObject->SetWidth(r.GetHeight());
pkCurrentObject->SetHeight(r.GetWidth());
}
InvalidateArea();
InvalidateChildren();
}
break;
case 180:
Flip(false);
Flip(true);
break;
case 270:
{
// rotate 270 degrees clockwise
// width and height will be swapped
// x and y of every object will be swapped
CGUIRect r = GetRelRect();
SetWidth(r.GetHeight());
SetHeight(r.GetWidth());
CGUIObject* pkCurrentObject;
for (int i = 0; i < GetNumberOfChildren(); ++i)
{
pkCurrentObject = GetChild(i);
r = pkCurrentObject->GetRelRect();
pkCurrentObject->SetRelXPos(r.GetY1());
pkCurrentObject->SetRelYPos(r.GetX1());
pkCurrentObject->SetWidth(r.GetHeight());
pkCurrentObject->SetHeight(r.GetWidth());
}
InvalidateArea();
InvalidateChildren();
}
break;
}
}
eC_Bool ExampleControl::DoDraw()
{
CGUIRect kAbsRect(GetAbsRect());
if (m_vBorderWidth != eC_FromInt(0))
{
GETGFX.SetForegroundColor(m_uiBorderColor);
GETGFX.FilledRect(kAbsRect);
kAbsRect.Expand(-m_vBorderWidth);
}
GETGFX.SetForegroundColor(m_uiInnerColor);
GETGFX.FilledRect(kAbsRect);
return true;
}
#if defined(GUILIANI_STREAM_GUI)
void ExampleControl::ReadFromStream()
{
ReadStreamingHeader(EXAMPLE_CONTROL_CLASS_VERSION, EXAMPLE_CONTROL_CLASS_MIN_VERSION);
CGUICompositeObject::ReadFromStream();
m_uiInnerColor = GETINPUTSTREAM.READ_HEX("InnerColor");
m_uiBorderColor = GETINPUTSTREAM.READ_HEX("BorderColor");
m_vBorderWidth = eC_FromFloat(GETINPUTSTREAM.READ_FLOAT("BorderWidth"));
}
#endif
#if defined(GUILIANI_WRITE_GUI)
void ExampleControl::WriteToStream(const eC_Bool bWriteClassID)
{
WriteStreamingHeader(bWriteClassID, XMLTAG_CONTROLCLASSID, CTL_EXAMPLE, EXAMPLE_CONTROL_CLASS_VERSION);
CGUICompositeObject::WriteToStream();
GETOUTPUTSTREAM.WriteHex(m_uiInnerColor, "InnerColor");
GETOUTPUTSTREAM.WriteHex(m_uiBorderColor, "BorderColor");
GETOUTPUTSTREAM.WriteFloat(eC_ToFloat(m_vBorderWidth), "BorderWidth");
WriteStreamingFooter(bWriteClassID);
}
#endif
----------------
CGfxWrapeGML* pkWrap = dynamic_cast<CGfxWrapeGML*>(&GETGFX);
if (NULL != pkWrap)
{
eGML_Screen* pkScreen = pkWrap->GetScreen();
unsigned short* memory = (unsigned short*)pkScreen->Lock();
eC_UInt uiWidth = pkScreen->GetWidth();
eC_UInt uiHeight = pkScreen->GetHeight();
memset(memory, 0xf1, uiWidth * uiHeight);
for (eC_UInt y = 0; y < uiHeight; ++y)
{
for (eC_UInt x = 0; x < uiWidth; ++x)
{
unsigned short val = memory[y * uiWidth + x];
memory[y * uiWidth + x] = (val + (x * y)) & 0xffff;
}
}
pkScreen->Unlock();
// pkScreen->DrawLine(eGML_Vector2(0, 0), eGML_Vector2(10, 10), 0xff004400, 0, 1, 1);
}
----------------