Difference between revisions of "Sascha"
From Guiliani
Line 230: | Line 230: | ||
---------------- | ---------------- | ||
+ | |||
+ | - auto-stretch for text | ||
+ | - invalidate layout after resizing | ||
</nowiki> | </nowiki> |
Revision as of 18:21, 12 July 2018
#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); } ---------------- - auto-stretch for text - invalidate layout after resizing