Difference between revisions of "Sascha"
From Guiliani
Line 64: | Line 64: | ||
------------------ | ------------------ | ||
+ | /* | ||
+ | * Copyright (C) TES Electronic Solutions GmbH, | ||
+ | * All Rights Reserved. | ||
+ | * Contact: info@guiliani.de | ||
+ | * | ||
+ | * This file is part of the Guiliani HMI framework | ||
+ | * for the development of graphical user interfaces on embedded systems. | ||
+ | */ | ||
+ | |||
+ | #if !defined(EXAMPLE_CONTROL_H) | ||
+ | #define EXAMPLE_CONTROL_H | ||
+ | |||
+ | #include "GUIObject.h" | ||
+ | |||
+ | #include "GUIFontResource.h" | ||
+ | #include "GUIImageResource.h" | ||
+ | #include "GUINinePatch.h" | ||
+ | |||
+ | /** An example CGUIObject implementation that draws a rectangle with | ||
+ | configureable border width and configurable colors. | ||
+ | */ | ||
+ | class ExampleControl : public CGUIObject | ||
+ | { | ||
+ | public: | ||
+ | /** Constructor. | ||
+ | @param pParent Pointer to the designated parent object. | ||
+ | @param vX X-position relative to its parent object, i.e. the x-offset from the left border of the parent object | ||
+ | @param vY Y-position relative to its parent object, i.e. the y-offset from the upper border of the parent object | ||
+ | @param vWidth Width of the object | ||
+ | @param vHeight Height of the object | ||
+ | @param uiInnerColor Color to be used for drawing this control's center | ||
+ | rectangle (everything except the border) in ARGB format. | ||
+ | @param uiBorderColor Color to be used for drawing this control's frame | ||
+ | in ARGB format. | ||
+ | @param vBorderWidth The width of the border in pixels. | ||
+ | @param eID Object identifier of this object (choose NO_HANDLE if none is required). | ||
+ | */ | ||
+ | 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 = eC_FromInt(1), | ||
+ | const ObjectHandle_t &eID = NO_HANDLE); | ||
+ | |||
+ | /// Default constructor to be used by the factory. | ||
+ | ExampleControl(); | ||
+ | |||
+ | #if defined(GUILIANI_STREAM_GUI) | ||
+ | /** Reads all object attributes from streaming file. | ||
+ | This method is called by CGUIFactoryManager after one of the registered | ||
+ | factories has created an instance of this class. | ||
+ | */ | ||
+ | virtual void ReadFromStream(); | ||
+ | #endif | ||
+ | |||
+ | #if defined(GUILIANI_WRITE_GUI) | ||
+ | /** Writes all object attributes to the streaming file. A CGUIStreamWriter | ||
+ | has to be initialized first. | ||
+ | @param bWriteClassID This flag is used to select if writing of ControlID, | ||
+ | leading and trailing tags is performed. | ||
+ | */ | ||
+ | virtual void WriteToStream(const eC_Bool bWriteClassID=false); | ||
+ | #endif | ||
+ | |||
+ | protected: | ||
+ | /// Called by the Guiliani framework when this control should paint itself. | ||
+ | eC_Bool DoDraw(); | ||
+ | |||
+ | private: | ||
+ | void Init(); | ||
+ | |||
+ | private: | ||
+ | /// The color used for drawing the center of this control. | ||
+ | eC_UInt m_uiInnerColor; | ||
+ | |||
+ | /// The color used for drawing the border of this control. | ||
+ | eC_UInt m_uiBorderColor; | ||
+ | |||
+ | /// The width of the border in (sub-) pixels. | ||
+ | eC_Value m_vBorderWidth; | ||
+ | |||
+ | eC_UByte m_ubDay; | ||
+ | eC_UByte m_ubMonth; | ||
+ | eC_UInt m_uiYear; | ||
+ | ImageResource_t m_eBackgroundImageID; | ||
+ | CGUINinePatch m_kBackground; | ||
+ | ImageResource_t m_eMarkerImageID; | ||
+ | CGUINinePatch m_kMarker; | ||
+ | FontResource_t m_eFontID; | ||
+ | eC_Value m_vRowHeight; | ||
+ | eC_Bool m_bFillEmptySpaces; | ||
+ | |||
+ | eC_UByte m_ubStartingWeekday; | ||
+ | eC_UByte m_ubNumberOfDays; | ||
+ | }; | ||
+ | |||
+ | #endif // EXAMPLE_CONTROL_H | ||
+ | |||
+ | -------------------- | ||
+ | |||
+ | #include "ExampleControl.h" | ||
+ | #include "GfxWrap.h" | ||
+ | #include "GUIStreamReader.h" | ||
+ | #include "GUIStreamWriter.h" | ||
+ | #include "GUIStreamingException.h" | ||
+ | #include "GUIControlResource.h" | ||
+ | |||
+ | #include <string> | ||
+ | |||
+ | #include "GUIResourceManager.h" | ||
+ | |||
+ | #include "GUIMemLeakWatcher.h" // <-- has to be the last include | ||
+ | |||
+ | #define EXAMPLE_CONTROL_CLASS_VERSION 2 | ||
+ | // 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) : | ||
+ | CGUIObject(pParent, vX, vY, vWidth, vHeight, eID), | ||
+ | m_uiInnerColor(uiInnerColor), | ||
+ | m_uiBorderColor(uiBorderColor), | ||
+ | m_vBorderWidth(vBorderWidth) | ||
+ | { | ||
+ | Init(); | ||
+ | } | ||
+ | |||
+ | ExampleControl::ExampleControl() : | ||
+ | m_uiInnerColor(0), | ||
+ | m_uiBorderColor(0), | ||
+ | m_vBorderWidth(eC_FromInt(0)) | ||
+ | { | ||
+ | Init(); | ||
+ | } | ||
+ | |||
+ | eC_Bool IsLeapYear(eC_UInt uiYear) | ||
+ | { | ||
+ | if (uiYear % 400 == 0) | ||
+ | return true; | ||
+ | else if (uiYear % 100 == 0) | ||
+ | return false; | ||
+ | else if (uiYear % 4 == 0) | ||
+ | return true; | ||
+ | else | ||
+ | return false; | ||
+ | } | ||
+ | |||
+ | eC_UByte CalculateNumberOfDays(eC_UByte ubMonth, eC_UInt uiYear) | ||
+ | { | ||
+ | const eC_UByte aubDayCount[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; | ||
+ | |||
+ | if ((ubMonth == 2) && (IsLeapYear(uiYear))) | ||
+ | return 29; | ||
+ | else | ||
+ | return aubDayCount[ubMonth - 1]; | ||
+ | } | ||
+ | |||
+ | eC_UByte CalcWeekdayFromDate(eC_UByte ubDay, eC_UByte ubMonth, eC_UInt uiYear) | ||
+ | { | ||
+ | ubMonth = (ubMonth + 9) % 12; | ||
+ | uiYear -= ubMonth / 10; | ||
+ | eC_UInt uiWeekday = 365 * uiYear + uiYear / 4 - uiYear / 100 + uiYear / 400 + (ubMonth * 306 + 5) / 10 + (ubDay - 1) + 3; | ||
+ | |||
+ | return uiWeekday % 7; | ||
+ | } | ||
+ | |||
+ | void ExampleControl::Init() | ||
+ | { | ||
+ | m_ubDay = 19; | ||
+ | m_ubMonth = 1; | ||
+ | m_uiYear = 1982; | ||
+ | m_eBackgroundImageID = IMG_NAVIGATION; | ||
+ | m_kBackground.Assign(0, 0, 0, 0); | ||
+ | m_eMarkerImageID = IMG_MAIN_PLAY; | ||
+ | m_kMarker.Assign(0, 0, 0, 0); | ||
+ | m_eFontID = FNT_DEFAULT; | ||
+ | m_vRowHeight = eC_FromInt(40); | ||
+ | |||
+ | m_ubStartingWeekday = 0; | ||
+ | m_ubNumberOfDays = 0; | ||
+ | |||
+ | m_ubStartingWeekday = CalcWeekdayFromDate(1, m_ubMonth, m_uiYear); | ||
+ | m_ubNumberOfDays = CalculateNumberOfDays(m_ubMonth, m_uiYear); | ||
+ | |||
+ | GETRESMANAGER.RequestImageResource(m_eBackgroundImageID); | ||
+ | GETRESMANAGER.RequestImageResource(m_eMarkerImageID); | ||
+ | SetXMLTag("ExampleControl"); | ||
+ | } | ||
+ | |||
+ | eC_Bool ExampleControl::DoDraw() | ||
+ | { | ||
+ | CGUIRect kAbsRect(GetAbsRect()); | ||
+ | |||
+ | GETGFX.BlitImgNinePatch(m_eBackgroundImageID, kAbsRect, m_kBackground); | ||
+ | |||
+ | m_vRowHeight = eC_Div(GetHeight(), eC_FromInt(6)); | ||
+ | eC_Value vDayWidth = eC_Div(GetWidth(), eC_FromInt(7)); | ||
+ | GETGFX.SetFont(FNT_KEYBOARD); | ||
+ | |||
+ | eC_String kDay; | ||
+ | eC_UByte ubCurrentDay = m_ubStartingWeekday; | ||
+ | kAbsRect.Move(eC_Mul(eC_FromInt(m_ubStartingWeekday - 1), vDayWidth), eC_FromInt(0)); | ||
+ | for (eC_UByte ubDayIndex = 1; ubDayIndex <= m_ubNumberOfDays; ++ubDayIndex) | ||
+ | { | ||
+ | kDay = eC_String(ubDayIndex); | ||
+ | if (ubDayIndex == m_ubDay) | ||
+ | GETGFX.BlitImgNinePatch(m_eMarkerImageID, CGUIRect(kAbsRect.GetTopLeft(), vDayWidth, m_vRowHeight), m_kMarker); | ||
+ | GETGFX.Text(kAbsRect.GetX1(), kAbsRect.GetY1(), &kDay); | ||
+ | |||
+ | if ((ubCurrentDay % 7) == 0) | ||
+ | kAbsRect.MoveTo(GetAbsXPos(), kAbsRect.GetY1() + m_vRowHeight); | ||
+ | else | ||
+ | kAbsRect.Move(vDayWidth, eC_FromInt(0)); | ||
+ | ++ubCurrentDay; | ||
+ | } | ||
+ | |||
+ | return true; | ||
+ | } | ||
+ | |||
+ | #if defined(GUILIANI_STREAM_GUI) | ||
+ | void ExampleControl::ReadFromStream() | ||
+ | { | ||
+ | const eC_UInt cuiVersion = ReadStreamingHeader(EXAMPLE_CONTROL_CLASS_VERSION, EXAMPLE_CONTROL_CLASS_MIN_VERSION); | ||
+ | |||
+ | if (cuiVersion <= 1) | ||
+ | { | ||
+ | m_uiInnerColor = GETINPUTSTREAM.READ_HEX("InnerColor"); | ||
+ | m_uiBorderColor = GETINPUTSTREAM.READ_HEX("BorderColor"); | ||
+ | m_vBorderWidth = eC_FromFloat(GETINPUTSTREAM.READ_FLOAT("BorderWidth")); | ||
+ | |||
+ | CGUIObject::ReadFromStream(); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | // always base-class first | ||
+ | CGUIObject::ReadFromStream(); | ||
+ | |||
+ | // remove grouping | ||
+ | GETINPUTSTREAM.DELETE_COMMENT_TAG("ExampleControl"); | ||
+ | |||
+ | m_uiInnerColor = GETINPUTSTREAM.READ_HEX("InnerColor"); | ||
+ | m_uiBorderColor = GETINPUTSTREAM.READ_HEX("BorderColor"); | ||
+ | m_vBorderWidth = eC_FromFloat(GETINPUTSTREAM.READ_FLOAT("BorderWidth")); | ||
+ | |||
+ | // remove grouping | ||
+ | GETINPUTSTREAM.DELETE_COMMENT_TAG("/ExampleControl"); | ||
+ | } | ||
+ | } | ||
+ | #endif | ||
+ | |||
+ | #if defined(GUILIANI_WRITE_GUI) | ||
+ | void ExampleControl::WriteToStream(const eC_Bool bWriteClassID) | ||
+ | { | ||
+ | WriteStreamingHeader(bWriteClassID, XMLTAG_CONTROLCLASSID, CTL_EXAMPLE, EXAMPLE_CONTROL_CLASS_VERSION); | ||
+ | |||
+ | CGUIObject::WriteToStream(); | ||
+ | GETOUTPUTSTREAM.WriteCommentTag("ExampleControl"); | ||
+ | GETOUTPUTSTREAM.WriteHex(m_uiInnerColor, "InnerColor"); | ||
+ | GETOUTPUTSTREAM.WriteHex(m_uiBorderColor, "BorderColor"); | ||
+ | GETOUTPUTSTREAM.WriteFloat(eC_ToFloat(m_vBorderWidth), "BorderWidth"); | ||
+ | |||
+ | // write attribute-group end | ||
+ | GETOUTPUTSTREAM.WriteCommentTag("/ExampleControl"); | ||
+ | |||
+ | WriteStreamingFooter(bWriteClassID); | ||
+ | } | ||
+ | #endif | ||
+ | |||
+ | ------------------ | ||
https://www.appcues.com/blog/30-awesome-free-ui-vector-kits-for-your-mockups-and-wireframes | https://www.appcues.com/blog/30-awesome-free-ui-vector-kits-for-your-mockups-and-wireframes | ||
designmodo.github.io/Flat-UI/ | designmodo.github.io/Flat-UI/ |
Revision as of 22:39, 19 July 2018
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); } ---------------- eC_Bool ExampleBehaviour::DoClick( const eC_Value &vAbsX, const eC_Value &vAbsY) { if ( (m_eContainer != NO_HANDLE) && (m_eTargetObject != NO_HANDLE) ) { CGUICompositeObject* pkContainer = dynamic_cast<CGUICompositeObject*>(GETGUI.GetObjectByID(m_eContainer)); if (NULL != pkContainer) { for (eC_UInt uiChild = 0; uiChild < pkContainer->GetNumberOfChildren(); ++uiChild) { CGUIObject* pkCurrentChild = pkContainer->GetChild(uiChild); if (pkCurrentChild->GetID() == m_eTargetObject) pkCurrentChild->SetInvisible(false); else pkCurrentChild->SetInvisible(true); } } } return true; } ---------------- eC_UInt CalcDayNumFromDate(eC_UInt y, eC_UByte m, eC_UByte d) { m = (m + 9) % 12; y -= m / 10; eC_UInt dn = 365 * y + y / 4 - y / 100 + y / 400 + (m * 306 + 5) / 10 + (d - 1) + 3; return dn % 7; } ------------------ /* * Copyright (C) TES Electronic Solutions GmbH, * All Rights Reserved. * Contact: info@guiliani.de * * This file is part of the Guiliani HMI framework * for the development of graphical user interfaces on embedded systems. */ #if !defined(EXAMPLE_CONTROL_H) #define EXAMPLE_CONTROL_H #include "GUIObject.h" #include "GUIFontResource.h" #include "GUIImageResource.h" #include "GUINinePatch.h" /** An example CGUIObject implementation that draws a rectangle with configureable border width and configurable colors. */ class ExampleControl : public CGUIObject { public: /** Constructor. @param pParent Pointer to the designated parent object. @param vX X-position relative to its parent object, i.e. the x-offset from the left border of the parent object @param vY Y-position relative to its parent object, i.e. the y-offset from the upper border of the parent object @param vWidth Width of the object @param vHeight Height of the object @param uiInnerColor Color to be used for drawing this control's center rectangle (everything except the border) in ARGB format. @param uiBorderColor Color to be used for drawing this control's frame in ARGB format. @param vBorderWidth The width of the border in pixels. @param eID Object identifier of this object (choose NO_HANDLE if none is required). */ 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 = eC_FromInt(1), const ObjectHandle_t &eID = NO_HANDLE); /// Default constructor to be used by the factory. ExampleControl(); #if defined(GUILIANI_STREAM_GUI) /** Reads all object attributes from streaming file. This method is called by CGUIFactoryManager after one of the registered factories has created an instance of this class. */ virtual void ReadFromStream(); #endif #if defined(GUILIANI_WRITE_GUI) /** Writes all object attributes to the streaming file. A CGUIStreamWriter has to be initialized first. @param bWriteClassID This flag is used to select if writing of ControlID, leading and trailing tags is performed. */ virtual void WriteToStream(const eC_Bool bWriteClassID=false); #endif protected: /// Called by the Guiliani framework when this control should paint itself. eC_Bool DoDraw(); private: void Init(); private: /// The color used for drawing the center of this control. eC_UInt m_uiInnerColor; /// The color used for drawing the border of this control. eC_UInt m_uiBorderColor; /// The width of the border in (sub-) pixels. eC_Value m_vBorderWidth; eC_UByte m_ubDay; eC_UByte m_ubMonth; eC_UInt m_uiYear; ImageResource_t m_eBackgroundImageID; CGUINinePatch m_kBackground; ImageResource_t m_eMarkerImageID; CGUINinePatch m_kMarker; FontResource_t m_eFontID; eC_Value m_vRowHeight; eC_Bool m_bFillEmptySpaces; eC_UByte m_ubStartingWeekday; eC_UByte m_ubNumberOfDays; }; #endif // EXAMPLE_CONTROL_H -------------------- #include "ExampleControl.h" #include "GfxWrap.h" #include "GUIStreamReader.h" #include "GUIStreamWriter.h" #include "GUIStreamingException.h" #include "GUIControlResource.h" #include <string> #include "GUIResourceManager.h" #include "GUIMemLeakWatcher.h" // <-- has to be the last include #define EXAMPLE_CONTROL_CLASS_VERSION 2 // 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) : CGUIObject(pParent, vX, vY, vWidth, vHeight, eID), m_uiInnerColor(uiInnerColor), m_uiBorderColor(uiBorderColor), m_vBorderWidth(vBorderWidth) { Init(); } ExampleControl::ExampleControl() : m_uiInnerColor(0), m_uiBorderColor(0), m_vBorderWidth(eC_FromInt(0)) { Init(); } eC_Bool IsLeapYear(eC_UInt uiYear) { if (uiYear % 400 == 0) return true; else if (uiYear % 100 == 0) return false; else if (uiYear % 4 == 0) return true; else return false; } eC_UByte CalculateNumberOfDays(eC_UByte ubMonth, eC_UInt uiYear) { const eC_UByte aubDayCount[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if ((ubMonth == 2) && (IsLeapYear(uiYear))) return 29; else return aubDayCount[ubMonth - 1]; } eC_UByte CalcWeekdayFromDate(eC_UByte ubDay, eC_UByte ubMonth, eC_UInt uiYear) { ubMonth = (ubMonth + 9) % 12; uiYear -= ubMonth / 10; eC_UInt uiWeekday = 365 * uiYear + uiYear / 4 - uiYear / 100 + uiYear / 400 + (ubMonth * 306 + 5) / 10 + (ubDay - 1) + 3; return uiWeekday % 7; } void ExampleControl::Init() { m_ubDay = 19; m_ubMonth = 1; m_uiYear = 1982; m_eBackgroundImageID = IMG_NAVIGATION; m_kBackground.Assign(0, 0, 0, 0); m_eMarkerImageID = IMG_MAIN_PLAY; m_kMarker.Assign(0, 0, 0, 0); m_eFontID = FNT_DEFAULT; m_vRowHeight = eC_FromInt(40); m_ubStartingWeekday = 0; m_ubNumberOfDays = 0; m_ubStartingWeekday = CalcWeekdayFromDate(1, m_ubMonth, m_uiYear); m_ubNumberOfDays = CalculateNumberOfDays(m_ubMonth, m_uiYear); GETRESMANAGER.RequestImageResource(m_eBackgroundImageID); GETRESMANAGER.RequestImageResource(m_eMarkerImageID); SetXMLTag("ExampleControl"); } eC_Bool ExampleControl::DoDraw() { CGUIRect kAbsRect(GetAbsRect()); GETGFX.BlitImgNinePatch(m_eBackgroundImageID, kAbsRect, m_kBackground); m_vRowHeight = eC_Div(GetHeight(), eC_FromInt(6)); eC_Value vDayWidth = eC_Div(GetWidth(), eC_FromInt(7)); GETGFX.SetFont(FNT_KEYBOARD); eC_String kDay; eC_UByte ubCurrentDay = m_ubStartingWeekday; kAbsRect.Move(eC_Mul(eC_FromInt(m_ubStartingWeekday - 1), vDayWidth), eC_FromInt(0)); for (eC_UByte ubDayIndex = 1; ubDayIndex <= m_ubNumberOfDays; ++ubDayIndex) { kDay = eC_String(ubDayIndex); if (ubDayIndex == m_ubDay) GETGFX.BlitImgNinePatch(m_eMarkerImageID, CGUIRect(kAbsRect.GetTopLeft(), vDayWidth, m_vRowHeight), m_kMarker); GETGFX.Text(kAbsRect.GetX1(), kAbsRect.GetY1(), &kDay); if ((ubCurrentDay % 7) == 0) kAbsRect.MoveTo(GetAbsXPos(), kAbsRect.GetY1() + m_vRowHeight); else kAbsRect.Move(vDayWidth, eC_FromInt(0)); ++ubCurrentDay; } return true; } #if defined(GUILIANI_STREAM_GUI) void ExampleControl::ReadFromStream() { const eC_UInt cuiVersion = ReadStreamingHeader(EXAMPLE_CONTROL_CLASS_VERSION, EXAMPLE_CONTROL_CLASS_MIN_VERSION); if (cuiVersion <= 1) { m_uiInnerColor = GETINPUTSTREAM.READ_HEX("InnerColor"); m_uiBorderColor = GETINPUTSTREAM.READ_HEX("BorderColor"); m_vBorderWidth = eC_FromFloat(GETINPUTSTREAM.READ_FLOAT("BorderWidth")); CGUIObject::ReadFromStream(); } else { // always base-class first CGUIObject::ReadFromStream(); // remove grouping GETINPUTSTREAM.DELETE_COMMENT_TAG("ExampleControl"); m_uiInnerColor = GETINPUTSTREAM.READ_HEX("InnerColor"); m_uiBorderColor = GETINPUTSTREAM.READ_HEX("BorderColor"); m_vBorderWidth = eC_FromFloat(GETINPUTSTREAM.READ_FLOAT("BorderWidth")); // remove grouping GETINPUTSTREAM.DELETE_COMMENT_TAG("/ExampleControl"); } } #endif #if defined(GUILIANI_WRITE_GUI) void ExampleControl::WriteToStream(const eC_Bool bWriteClassID) { WriteStreamingHeader(bWriteClassID, XMLTAG_CONTROLCLASSID, CTL_EXAMPLE, EXAMPLE_CONTROL_CLASS_VERSION); CGUIObject::WriteToStream(); GETOUTPUTSTREAM.WriteCommentTag("ExampleControl"); GETOUTPUTSTREAM.WriteHex(m_uiInnerColor, "InnerColor"); GETOUTPUTSTREAM.WriteHex(m_uiBorderColor, "BorderColor"); GETOUTPUTSTREAM.WriteFloat(eC_ToFloat(m_vBorderWidth), "BorderWidth"); // write attribute-group end GETOUTPUTSTREAM.WriteCommentTag("/ExampleControl"); WriteStreamingFooter(bWriteClassID); } #endif ------------------ https://www.appcues.com/blog/30-awesome-free-ui-vector-kits-for-your-mockups-and-wireframes designmodo.github.io/Flat-UI/ https://mashable.com/2013/07/29/flat-design-ui-kits/?europe=true - auto-stretch for text - invalidate layout after resizing - calendar-widget - rating-slider (bargraph) - multiedge-slider