Sascha: Difference between revisions
From Guiliani
No edit summary |
No edit summary |
||
Line 25: | Line 25: | ||
---------------- | ---------------- | ||
/* | |||
* 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 "GUIAbstractBar.h" | |||
#include "GUIRange.h" | |||
#include "GUINinePatch.h" | |||
#include "GUIImageResource.h" | |||
/** An example CGUIObject implementation that draws a rectangle with | |||
configureable border width and configurable colors. | |||
*/ | |||
class ExampleControl : public CGUIAbstractBar | |||
{ | |||
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(); | |||
void Init(); | |||
virtual void SetWidth(const eC_Value& vX); | |||
virtual void SetHeight(const eC_Value& vY); | |||
virtual eC_Bool DoButtonDown(const eC_Value &vAbsX, const eC_Value &vAbsY); | |||
virtual eC_Bool DoDrag(const eC_Value &vDeltaX, const eC_Value &vDeltaY, const eC_Value &vAbsX, const eC_Value &vAbsY); | |||
virtual eC_Bool DoDragEnd(const eC_Value &vAbsX, const eC_Value &vAbsY); | |||
virtual eC_Bool DoClick(const eC_Value &vAbsX, const eC_Value &vAbsY); | |||
#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 CalculateValues(); | |||
void CalculateHandle(); | |||
ImageResource_t m_eBackground; | |||
CGUINinePatch m_kBackground; | |||
ImageResource_t m_eRange; | |||
CGUINinePatch m_kRange; | |||
ImageResource_t m_eHandle1; | |||
ImageResource_t m_eHandle2; | |||
eC_Value m_vMarginX; | |||
eC_Value m_vMarginY; | |||
eC_UByte m_ubMovingHandle; | |||
CGUIRect m_kHandle1; | |||
CGUIRect m_kHandle2; | |||
eC_Value m_vHandleWidth; | |||
eC_Value m_vHandleHeight; | |||
eC_Value m_vBackgroundWidth; | |||
eC_Value m_vBackgroundHeight; | |||
eC_Value m_vBackgroundPosX; | |||
eC_Value m_vBackgroundPosY; | |||
CGUIRect m_kRangeRect; | |||
eC_Value m_vRangeHeight; | |||
eC_Value m_vLowerValue; | |||
eC_Value m_vUpperValue; | |||
}; | |||
#endif // EXAMPLE_CONTROL_H | |||
------------------------------- | |||
#include "ExampleControl.h" | |||
#include "GfxWrap.h" | |||
#include "GUIStreamReader.h" | |||
#include "GUIStreamWriter.h" | |||
#include "GUIStreamingException.h" | |||
#include "GUIControlResource.h" | |||
#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) : | |||
CGUIAbstractBar(pParent, vX, vY, vWidth, vHeight) | |||
{ | |||
Init(); | |||
} | |||
ExampleControl::ExampleControl() : | |||
CGUIAbstractBar() | |||
{ | |||
Init(); | |||
} | |||
void ExampleControl::Init() | |||
{ | |||
m_eBackground = IMG_STDCTRL_SLD_BG; | |||
GETRESMANAGER.RequestImageResource(m_eBackground); | |||
m_kBackground.Assign(0, 0, 0, 0); | |||
m_eHandle1 = IMG_STDCTRL_SLD_KNOB_NORMAL; | |||
GETRESMANAGER.RequestImageResource(m_eHandle1); | |||
m_eHandle2 = IMG_STDCTRL_SLD_KNOB_HIGHLIGHTED; | |||
GETRESMANAGER.RequestImageResource(m_eHandle2); | |||
m_eRange = IMG_STDCTRL_IMGBTN_FOCUSED ; | |||
GETRESMANAGER.RequestImageResource(m_eRange); | |||
m_kRange.Assign(0, 0, 0, 0); | |||
m_vMarginX = eC_FromInt(0); | |||
m_vMarginY = eC_FromInt(0); | |||
SetLevel(0); | |||
SetMinValue(0); | |||
SetMaxValue(100); | |||
SetStepSize(1); | |||
SetXMLTag("ExampleControl"); | |||
m_vHandleWidth = GETGFX.GetImgWidth(m_eHandle1); | |||
m_vHandleHeight = GETGFX.GetImgHeight(m_eHandle1); | |||
m_vRangeHeight = GETGFX.GetImgHeight(m_eRange); | |||
CalculateValues(); | |||
} | |||
void ExampleControl::CalculateValues() | |||
{ | |||
m_vBackgroundWidth = GetWidth(); | |||
m_vBackgroundHeight = GETGFX.GetImgHeight(m_eBackground); | |||
m_vBackgroundPosX = eC_FromInt(0); | |||
m_vBackgroundPosY = eC_Div(GetHeight() - m_vBackgroundHeight, 2); | |||
eC_Value vValue1 = GetRange().GetMinValue() + eC_Mul(eC_Div(GetRange().GetMaxValue(), GetWidth() - m_vHandleWidth), m_kHandle1.GetX1() - GetAbsXPos()); | |||
eC_Value vValue2 = GetRange().GetMinValue() + eC_Mul(eC_Div(GetRange().GetMaxValue(), GetWidth() - m_vHandleWidth), m_kHandle2.GetX1() - GetAbsXPos()); | |||
if (vValue1 < vValue2) | |||
{ | |||
m_vLowerValue = vValue1; | |||
m_vUpperValue = vValue2; | |||
} | |||
else | |||
{ | |||
m_vLowerValue = vValue2; | |||
m_vUpperValue = vValue1; | |||
} | |||
} | |||
void ExampleControl::CalculateHandle() | |||
{ | |||
m_kHandle1.Assign( | |||
eC_FromInt(0), eC_Div(GetHeight() - m_vHandleHeight, 2), | |||
m_vHandleWidth, eC_Div(GetHeight() - m_vHandleHeight, 2) + m_vHandleHeight); | |||
m_kHandle1.Move(GetAbsXPos(), GetAbsYPos()); | |||
m_kHandle2.Assign( | |||
eC_FromInt(0), eC_Div(GetHeight() - m_vHandleHeight, 2), | |||
m_vHandleWidth, eC_Div(GetHeight() - m_vHandleHeight, 2) + m_vHandleHeight); | |||
m_kHandle2.Move(GetAbsXPos(), GetAbsYPos()); | |||
} | |||
void ExampleControl::SetWidth(const eC_Value& vX) | |||
{ | |||
CGUIAbstractBar::SetWidth(vX); | |||
CalculateValues(); | |||
CalculateHandle(); | |||
} | |||
void ExampleControl::SetHeight(const eC_Value& vY) | |||
{ | |||
CGUIAbstractBar::SetHeight(vY); | |||
CalculateValues(); | |||
CalculateHandle(); | |||
} | |||
eC_Bool ExampleControl::DoButtonDown(const eC_Value &vAbsX, const eC_Value &vAbsY) | |||
{ | |||
// check handle for position | |||
if (m_kHandle1.IsInside(vAbsX, vAbsY)) | |||
{ | |||
m_ubMovingHandle = 1; | |||
} | |||
else if (m_kHandle2.IsInside(vAbsX, vAbsY)) | |||
{ | |||
m_ubMovingHandle = 2; | |||
} | |||
else | |||
{ | |||
return false; | |||
} | |||
CalculateValues(); | |||
InvalidateArea(); | |||
return true; | |||
} | |||
eC_Bool ExampleControl::DoDrag(const eC_Value &vDeltaX, const eC_Value &vDeltaY, const eC_Value &vAbsX, const eC_Value &vAbsY) | |||
{ | |||
if (m_ubMovingHandle == 0) | |||
return false; | |||
eC_Value vPosX = vAbsX; | |||
if (vPosX > GetAbsXPosREdge() - m_vHandleWidth) | |||
vPosX = GetAbsXPosREdge() - m_vHandleWidth; | |||
else if (vPosX < GetAbsXPos()) | |||
vPosX = GetAbsXPos(); | |||
if (m_ubMovingHandle == 1) | |||
{ | |||
m_kHandle1.MoveTo(vPosX, m_kHandle1.GetY1()); | |||
} | |||
else if (m_ubMovingHandle == 2) | |||
{ | |||
m_kHandle2.MoveTo(vPosX, m_kHandle2.GetY1()); | |||
} | |||
CalculateValues(); | |||
InvalidateArea(); | |||
return true; | |||
} | |||
eC_Bool ExampleControl::DoDragEnd(const eC_Value &vAbsX, const eC_Value &vAbsY) | |||
{ | |||
if (m_ubMovingHandle == 0) | |||
return false; | |||
eC_Value vPosX = vAbsX; | |||
if (vPosX > GetAbsXPosREdge() - m_vHandleWidth) | |||
vPosX = GetAbsXPosREdge() - m_vHandleWidth; | |||
else if (vPosX < GetAbsXPos()) | |||
vPosX = GetAbsXPos(); | |||
if (m_ubMovingHandle == 1) | |||
{ | |||
m_kHandle1.MoveTo(vPosX, m_kHandle1.GetY1()); | |||
} | |||
else if (m_ubMovingHandle == 2) | |||
{ | |||
m_kHandle2.MoveTo(vPosX, m_kHandle1.GetY1()); | |||
} | |||
m_ubMovingHandle = 0; | |||
CalculateValues(); | |||
InvalidateArea(); | |||
return true; | |||
} | |||
eC_Bool ExampleControl::DoClick(const eC_Value &vAbsX, const eC_Value &vAbsY) | |||
{ | |||
if (m_ubMovingHandle != 0) | |||
return false; | |||
eC_Value vPosX = vAbsX; | |||
if (vPosX > GetAbsXPosREdge() - m_vHandleWidth) | |||
vPosX = GetAbsXPosREdge() - m_vHandleWidth; | |||
else if (vPosX < GetAbsXPos()) | |||
vPosX = GetAbsXPos(); | |||
if (m_kHandle1.GetX1() < m_kHandle2.GetX1()) | |||
{ | |||
// click only left of handle1 or right or handle2 allowed | |||
if (vAbsX <= m_kHandle1.GetX2()) | |||
{ | |||
m_kHandle1.MoveTo(vPosX, m_kHandle1.GetY1()); | |||
} | |||
else if (vAbsX >= m_kHandle2.GetX1()) | |||
{ | |||
m_kHandle2.MoveTo(vPosX, m_kHandle2.GetY1()); | |||
} | |||
} | |||
else | |||
{ | |||
// click only left of handle1 or right or handle2 allowed | |||
if (vAbsX <= m_kHandle2.GetX2()) | |||
{ | |||
m_kHandle2.MoveTo(vPosX, m_kHandle2.GetY1()); | |||
} | |||
else if (vAbsX >= m_kHandle1.GetX1()) | |||
{ | |||
m_kHandle1.MoveTo(vPosX, m_kHandle1.GetY1()); | |||
} | |||
} | |||
CalculateValues(); | |||
InvalidateArea(); | |||
return true; | |||
} | |||
eC_Bool ExampleControl::DoDraw() | |||
{ | |||
CGUIRect kBackgroundRect(m_vMarginX, m_vMarginY, m_vMarginX + m_vBackgroundWidth, m_vMarginX + m_vBackgroundHeight); | |||
kBackgroundRect.Move(GetAbsXPos() + m_vMarginX + m_vBackgroundPosX, GetAbsYPos() + m_vMarginY + m_vBackgroundPosY); | |||
if (m_kHandle1.GetX1() < m_kHandle2.GetX1()) | |||
m_kRangeRect.Assign(m_kHandle1.GetX1(), GetAbsYPos() + eC_Div(GetHeight() - m_vRangeHeight, 2), m_kHandle2.GetX2(), GetAbsYPos() + eC_Div(GetHeight() - m_vRangeHeight, 2) + m_vRangeHeight); | |||
else | |||
m_kRangeRect.Assign(m_kHandle2.GetX1(), GetAbsYPos() + eC_Div(GetHeight() - m_vRangeHeight, 2), m_kHandle1.GetX2(), GetAbsYPos() + eC_Div(GetHeight() - m_vRangeHeight, 2) + m_vRangeHeight); | |||
GETGFX.BlitImgExt(m_eBackground, kBackgroundRect); | |||
GETGFX.BlitImgExt(m_eRange, m_kRangeRect); | |||
GETGFX.BlitImg(m_eHandle1, m_kHandle1.GetX1(), m_kHandle1.GetY1()); | |||
GETGFX.BlitImg(m_eHandle2, m_kHandle2.GetX1(), m_kHandle2.GetY1()); | |||
return true; | |||
} | |||
#if defined(GUILIANI_STREAM_GUI) | |||
void ExampleControl::ReadFromStream() | |||
{ | |||
const eC_UInt cuiVersion = ReadStreamingHeader(EXAMPLE_CONTROL_CLASS_VERSION, EXAMPLE_CONTROL_CLASS_MIN_VERSION); | |||
// always base-class first | |||
CGUIAbstractBar::ReadFromStream(); | |||
#if 0 | |||
// remove grouping | |||
GETINPUTSTREAM.DELETE_COMMENT_TAG("ExampleControl"); | |||
// remove grouping | |||
GETINPUTSTREAM.DELETE_COMMENT_TAG("/ExampleControl"); | |||
#endif | |||
CalculateValues(); | |||
CalculateHandle(); | |||
} | |||
#endif | |||
#if defined(GUILIANI_WRITE_GUI) | |||
void ExampleControl::WriteToStream(const eC_Bool bWriteClassID) | |||
{ | |||
WriteStreamingHeader(bWriteClassID, XMLTAG_CONTROLCLASSID, CTL_EXAMPLE, EXAMPLE_CONTROL_CLASS_VERSION); | |||
CGUIAbstractBar::WriteToStream(); | |||
#if 0 | |||
GETOUTPUTSTREAM.WriteCommentTag("ExampleControl"); | |||
// write attribute-group end | |||
GETOUTPUTSTREAM.WriteCommentTag("/ExampleControl"); | |||
#endif | |||
WriteStreamingFooter(bWriteClassID); | |||
} | |||
#endif | |||
---------------------------- | |||
https://welovewp.com/how-to-audit-your-user-interface-design/ | https://welovewp.com/how-to-audit-your-user-interface-design/ |
Revision as of 18:44, 26 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); } ---------------- /* * 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 "GUIAbstractBar.h" #include "GUIRange.h" #include "GUINinePatch.h" #include "GUIImageResource.h" /** An example CGUIObject implementation that draws a rectangle with configureable border width and configurable colors. */ class ExampleControl : public CGUIAbstractBar { 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(); void Init(); virtual void SetWidth(const eC_Value& vX); virtual void SetHeight(const eC_Value& vY); virtual eC_Bool DoButtonDown(const eC_Value &vAbsX, const eC_Value &vAbsY); virtual eC_Bool DoDrag(const eC_Value &vDeltaX, const eC_Value &vDeltaY, const eC_Value &vAbsX, const eC_Value &vAbsY); virtual eC_Bool DoDragEnd(const eC_Value &vAbsX, const eC_Value &vAbsY); virtual eC_Bool DoClick(const eC_Value &vAbsX, const eC_Value &vAbsY); #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 CalculateValues(); void CalculateHandle(); ImageResource_t m_eBackground; CGUINinePatch m_kBackground; ImageResource_t m_eRange; CGUINinePatch m_kRange; ImageResource_t m_eHandle1; ImageResource_t m_eHandle2; eC_Value m_vMarginX; eC_Value m_vMarginY; eC_UByte m_ubMovingHandle; CGUIRect m_kHandle1; CGUIRect m_kHandle2; eC_Value m_vHandleWidth; eC_Value m_vHandleHeight; eC_Value m_vBackgroundWidth; eC_Value m_vBackgroundHeight; eC_Value m_vBackgroundPosX; eC_Value m_vBackgroundPosY; CGUIRect m_kRangeRect; eC_Value m_vRangeHeight; eC_Value m_vLowerValue; eC_Value m_vUpperValue; }; #endif // EXAMPLE_CONTROL_H ------------------------------- #include "ExampleControl.h" #include "GfxWrap.h" #include "GUIStreamReader.h" #include "GUIStreamWriter.h" #include "GUIStreamingException.h" #include "GUIControlResource.h" #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) : CGUIAbstractBar(pParent, vX, vY, vWidth, vHeight) { Init(); } ExampleControl::ExampleControl() : CGUIAbstractBar() { Init(); } void ExampleControl::Init() { m_eBackground = IMG_STDCTRL_SLD_BG; GETRESMANAGER.RequestImageResource(m_eBackground); m_kBackground.Assign(0, 0, 0, 0); m_eHandle1 = IMG_STDCTRL_SLD_KNOB_NORMAL; GETRESMANAGER.RequestImageResource(m_eHandle1); m_eHandle2 = IMG_STDCTRL_SLD_KNOB_HIGHLIGHTED; GETRESMANAGER.RequestImageResource(m_eHandle2); m_eRange = IMG_STDCTRL_IMGBTN_FOCUSED ; GETRESMANAGER.RequestImageResource(m_eRange); m_kRange.Assign(0, 0, 0, 0); m_vMarginX = eC_FromInt(0); m_vMarginY = eC_FromInt(0); SetLevel(0); SetMinValue(0); SetMaxValue(100); SetStepSize(1); SetXMLTag("ExampleControl"); m_vHandleWidth = GETGFX.GetImgWidth(m_eHandle1); m_vHandleHeight = GETGFX.GetImgHeight(m_eHandle1); m_vRangeHeight = GETGFX.GetImgHeight(m_eRange); CalculateValues(); } void ExampleControl::CalculateValues() { m_vBackgroundWidth = GetWidth(); m_vBackgroundHeight = GETGFX.GetImgHeight(m_eBackground); m_vBackgroundPosX = eC_FromInt(0); m_vBackgroundPosY = eC_Div(GetHeight() - m_vBackgroundHeight, 2); eC_Value vValue1 = GetRange().GetMinValue() + eC_Mul(eC_Div(GetRange().GetMaxValue(), GetWidth() - m_vHandleWidth), m_kHandle1.GetX1() - GetAbsXPos()); eC_Value vValue2 = GetRange().GetMinValue() + eC_Mul(eC_Div(GetRange().GetMaxValue(), GetWidth() - m_vHandleWidth), m_kHandle2.GetX1() - GetAbsXPos()); if (vValue1 < vValue2) { m_vLowerValue = vValue1; m_vUpperValue = vValue2; } else { m_vLowerValue = vValue2; m_vUpperValue = vValue1; } } void ExampleControl::CalculateHandle() { m_kHandle1.Assign( eC_FromInt(0), eC_Div(GetHeight() - m_vHandleHeight, 2), m_vHandleWidth, eC_Div(GetHeight() - m_vHandleHeight, 2) + m_vHandleHeight); m_kHandle1.Move(GetAbsXPos(), GetAbsYPos()); m_kHandle2.Assign( eC_FromInt(0), eC_Div(GetHeight() - m_vHandleHeight, 2), m_vHandleWidth, eC_Div(GetHeight() - m_vHandleHeight, 2) + m_vHandleHeight); m_kHandle2.Move(GetAbsXPos(), GetAbsYPos()); } void ExampleControl::SetWidth(const eC_Value& vX) { CGUIAbstractBar::SetWidth(vX); CalculateValues(); CalculateHandle(); } void ExampleControl::SetHeight(const eC_Value& vY) { CGUIAbstractBar::SetHeight(vY); CalculateValues(); CalculateHandle(); } eC_Bool ExampleControl::DoButtonDown(const eC_Value &vAbsX, const eC_Value &vAbsY) { // check handle for position if (m_kHandle1.IsInside(vAbsX, vAbsY)) { m_ubMovingHandle = 1; } else if (m_kHandle2.IsInside(vAbsX, vAbsY)) { m_ubMovingHandle = 2; } else { return false; } CalculateValues(); InvalidateArea(); return true; } eC_Bool ExampleControl::DoDrag(const eC_Value &vDeltaX, const eC_Value &vDeltaY, const eC_Value &vAbsX, const eC_Value &vAbsY) { if (m_ubMovingHandle == 0) return false; eC_Value vPosX = vAbsX; if (vPosX > GetAbsXPosREdge() - m_vHandleWidth) vPosX = GetAbsXPosREdge() - m_vHandleWidth; else if (vPosX < GetAbsXPos()) vPosX = GetAbsXPos(); if (m_ubMovingHandle == 1) { m_kHandle1.MoveTo(vPosX, m_kHandle1.GetY1()); } else if (m_ubMovingHandle == 2) { m_kHandle2.MoveTo(vPosX, m_kHandle2.GetY1()); } CalculateValues(); InvalidateArea(); return true; } eC_Bool ExampleControl::DoDragEnd(const eC_Value &vAbsX, const eC_Value &vAbsY) { if (m_ubMovingHandle == 0) return false; eC_Value vPosX = vAbsX; if (vPosX > GetAbsXPosREdge() - m_vHandleWidth) vPosX = GetAbsXPosREdge() - m_vHandleWidth; else if (vPosX < GetAbsXPos()) vPosX = GetAbsXPos(); if (m_ubMovingHandle == 1) { m_kHandle1.MoveTo(vPosX, m_kHandle1.GetY1()); } else if (m_ubMovingHandle == 2) { m_kHandle2.MoveTo(vPosX, m_kHandle1.GetY1()); } m_ubMovingHandle = 0; CalculateValues(); InvalidateArea(); return true; } eC_Bool ExampleControl::DoClick(const eC_Value &vAbsX, const eC_Value &vAbsY) { if (m_ubMovingHandle != 0) return false; eC_Value vPosX = vAbsX; if (vPosX > GetAbsXPosREdge() - m_vHandleWidth) vPosX = GetAbsXPosREdge() - m_vHandleWidth; else if (vPosX < GetAbsXPos()) vPosX = GetAbsXPos(); if (m_kHandle1.GetX1() < m_kHandle2.GetX1()) { // click only left of handle1 or right or handle2 allowed if (vAbsX <= m_kHandle1.GetX2()) { m_kHandle1.MoveTo(vPosX, m_kHandle1.GetY1()); } else if (vAbsX >= m_kHandle2.GetX1()) { m_kHandle2.MoveTo(vPosX, m_kHandle2.GetY1()); } } else { // click only left of handle1 or right or handle2 allowed if (vAbsX <= m_kHandle2.GetX2()) { m_kHandle2.MoveTo(vPosX, m_kHandle2.GetY1()); } else if (vAbsX >= m_kHandle1.GetX1()) { m_kHandle1.MoveTo(vPosX, m_kHandle1.GetY1()); } } CalculateValues(); InvalidateArea(); return true; } eC_Bool ExampleControl::DoDraw() { CGUIRect kBackgroundRect(m_vMarginX, m_vMarginY, m_vMarginX + m_vBackgroundWidth, m_vMarginX + m_vBackgroundHeight); kBackgroundRect.Move(GetAbsXPos() + m_vMarginX + m_vBackgroundPosX, GetAbsYPos() + m_vMarginY + m_vBackgroundPosY); if (m_kHandle1.GetX1() < m_kHandle2.GetX1()) m_kRangeRect.Assign(m_kHandle1.GetX1(), GetAbsYPos() + eC_Div(GetHeight() - m_vRangeHeight, 2), m_kHandle2.GetX2(), GetAbsYPos() + eC_Div(GetHeight() - m_vRangeHeight, 2) + m_vRangeHeight); else m_kRangeRect.Assign(m_kHandle2.GetX1(), GetAbsYPos() + eC_Div(GetHeight() - m_vRangeHeight, 2), m_kHandle1.GetX2(), GetAbsYPos() + eC_Div(GetHeight() - m_vRangeHeight, 2) + m_vRangeHeight); GETGFX.BlitImgExt(m_eBackground, kBackgroundRect); GETGFX.BlitImgExt(m_eRange, m_kRangeRect); GETGFX.BlitImg(m_eHandle1, m_kHandle1.GetX1(), m_kHandle1.GetY1()); GETGFX.BlitImg(m_eHandle2, m_kHandle2.GetX1(), m_kHandle2.GetY1()); return true; } #if defined(GUILIANI_STREAM_GUI) void ExampleControl::ReadFromStream() { const eC_UInt cuiVersion = ReadStreamingHeader(EXAMPLE_CONTROL_CLASS_VERSION, EXAMPLE_CONTROL_CLASS_MIN_VERSION); // always base-class first CGUIAbstractBar::ReadFromStream(); #if 0 // remove grouping GETINPUTSTREAM.DELETE_COMMENT_TAG("ExampleControl"); // remove grouping GETINPUTSTREAM.DELETE_COMMENT_TAG("/ExampleControl"); #endif CalculateValues(); CalculateHandle(); } #endif #if defined(GUILIANI_WRITE_GUI) void ExampleControl::WriteToStream(const eC_Bool bWriteClassID) { WriteStreamingHeader(bWriteClassID, XMLTAG_CONTROLCLASSID, CTL_EXAMPLE, EXAMPLE_CONTROL_CLASS_VERSION); CGUIAbstractBar::WriteToStream(); #if 0 GETOUTPUTSTREAM.WriteCommentTag("ExampleControl"); // write attribute-group end GETOUTPUTSTREAM.WriteCommentTag("/ExampleControl"); #endif WriteStreamingFooter(bWriteClassID); } #endif ---------------------------- https://welovewp.com/how-to-audit-your-user-interface-design/ https://www.webdesignerdepot.com/2015/02/the-best-free-ui-kits-february-2015/ https://visual.ly/community/infographic/other/10-commandments-user-interface-design https://www.componentsource.com/news/feature-releases/2015/10/28/gui-design-studio 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