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