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