|
|
Line 26: |
Line 26: |
| ---------------- | | ---------------- |
|
| |
|
| /* | | # ========== CustomExtensions ========== |
| * Copyright (C) TES Electronic Solutions GmbH,
| | FILE(GLOB CUSTOMEXTENSIONS_CPP "${GSE_ROOT_PATH_STREAMRUNTIME}/Source/CustomExtension/*.cpp") |
| * All Rights Reserved.
| | SOURCE_GROUP("Source Files\\Custom Extension" FILES ${CUSTOMEXTENSIONS_CPP}) |
| * 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)
| | FILE(GLOB CUSTOMEXTENSIONS_H "${GSE_ROOT_PATH_STREAMRUNTIME}/Include/CustomExtension/*.h") |
| #define EXAMPLE_CONTROL_H
| | SOURCE_GROUP("Header Files\\Custom Extension" FILES ${CUSTOMEXTENSIONS_H}) |
|
| |
|
| #include "GUIAbstractBar.h"
| | SET(CUSTOM_EXTENSIONS_LIST |
| #include "GUIRange.h"
| | ${CUSTOMEXTENSIONS_CPP} |
| #include "GUINinePatch.h"
| | ${CUSTOMEXTENSIONS_H} |
| | ${GSE_GUICONFIG_CPP} |
| | ) |
|
| |
|
| #include "GUIImageResource.h"
| | ADD_LIBRARY(CustomExtensions STATIC ${CUSTOM_EXTENSIONS_LIST}) |
|
| |
|
| /** An example CGUIObject implementation that draws a rectangle with
| | SET_TARGET_PROPERTIES(CustomExtensions PROPERTIES COMPILE_DEFINITIONS "${PREPROCESSOR_DEFINES}") |
| 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
| |
|
| |
|
| ---------------------------- | | ---------------------------- |