Sascha: Difference between revisions
From Guiliani
No edit summary |
No edit summary |
||
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 20: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