//*****************************************************************************
//
// slider.h - Prototypes for the slider widget class.
//
// Copyright (c) 2008-2020 Texas Instruments Incorporated.  All rights reserved.
// Software License Agreement
// 
// Texas Instruments (TI) is supplying this software for use solely and
// exclusively on TI's microcontroller products. The software is owned by
// TI and/or its suppliers, and is protected under applicable copyright
// laws. You may not combine this software with "viral" open-source
// software in order to form a larger program.
// 
// THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
// NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
// NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
// CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
// DAMAGES, FOR ANY REASON WHATSOEVER.
// 
// This is part of revision 2.2.0.295 of the Tiva Graphics Library.
//
//*****************************************************************************

#ifndef __SLIDER_H__
#define __SLIDER_H__

//*****************************************************************************
//
//! \addtogroup slider_api
//! @{
//
//*****************************************************************************

//*****************************************************************************
//
// If building with a C++ compiler, make all of the definitions in this header
// have a C binding.
//
//*****************************************************************************
#ifdef __cplusplus
extern "C"
{
#endif

//*****************************************************************************
//
//! The structure that describes a slider widget.
//
//*****************************************************************************
typedef struct
{
    //
    //! The generic widget information.
    //
    tWidget sBase;

    //
    //! The style for this widget.  This is a set of flags defined by
    //! SL_STYLE_xxx.
    //
    uint32_t ui32Style;

    //
    //! The 24-bit RGB color used to fill this slider, if SL_STYLE_FILL is
    //! selected, and to use as the background color if SL_STYLE_TEXT_OPAQUE is
    //! selected.
    //
    uint32_t ui32FillColor;

    //
    //! The 24-bit RGB color used to fill the background portion of the slider
    //! if SL_STYLE_FILL is selected, and to use as the background color if
    //! SL_STYLE_TEXT_OPAQUE is selected.
    //
    uint32_t ui32BackgroundFillColor;

    //
    //! The 24-bit RGB color used to outline this slider, if
    //! SL_STYLE_OUTLINE is selected.
    //
    uint32_t ui32OutlineColor;

    //
    //! The 24-bit RGB color used to draw text on the "active" portion of
    //! this slider, if SL_STYLE_TEXT is selected.
    //
    uint32_t ui32TextColor;

    //
    //! The 24-bit RGB color used to draw text on the background portion of
    //! this slider, if SL_STYLE_TEXT is selected.
    //
    uint32_t ui32BackgroundTextColor;

    //
    //! A pointer to the font used to render the slider text, if
    //! SL_STYLE_TEXT is selected.
    //
    const tFont *psFont;

    //
    //! A pointer to the text to draw on this slider, if SL_STYLE_TEXT is
    //! selected.
    //
    const char *pcText;

    //
    //! A pointer to the image to be drawn onto this slider, if
    //! SL_STYLE_IMG is selected.
    //
    const uint8_t *pui8Image;

    //
    //! A pointer to the image to be drawn onto this slider background if
    //! SL_STYLE_BACKG_IMG is selected.
    //
    const uint8_t *pui8BackgroundImage;

    //
    //! A pointer to the function to be called when the state of the slider
    //! changes.
    //
    void (*pfnOnChange)(tWidget *psWidget, int32_t i32Value);

    //
    //! The value represented by the slider at its zero position.  This
    //! value is returned if a horizontal slider is pulled to the far left or
    //! a vertical slider is pulled to the bottom of widget's bounding
    //! rectangle.
    //
    int32_t i32Min;

    //
    //! The value represented by the slider at its maximum position.  This value
    //! is returned if a horizontal slider is pulled to the far right or a
    //! vertical slider is pulled to the top of the widget's bounding
    //! rectangle.
    //
    int32_t i32Max;

    //
    //! The current slider value scaled according to the minimum and maximum
    //! values for the control.
    //
    int32_t i32Value;

    //
    //! This internal work variable stores the pixel position representing the
    //! current slider value.
    //
    int16_t i16Pos;
}
tSliderWidget;

//*****************************************************************************
//
//! This flag indicates that the slider should be outlined.
//
//*****************************************************************************
#define SL_STYLE_OUTLINE            0x00000001

//*****************************************************************************
//
//! This flag indicates that the active portion of the slider should be filled.
//
//*****************************************************************************
#define SL_STYLE_FILL               0x00000002

//*****************************************************************************
//
//! This flag indicates that the background portion of the slider should be
//! filled.
//
//*****************************************************************************
#define SL_STYLE_BACKG_FILL         0x00000004

//*****************************************************************************
//
//! This flag indicates that the slider should have text drawn on top of the
//! active portion.
//
//*****************************************************************************
#define SL_STYLE_TEXT               0x00000008

//*****************************************************************************
//
//! This flag indicates that the slider should have text drawn on top of the
//! background portion.
//
//*****************************************************************************
#define SL_STYLE_BACKG_TEXT         0x00000010

//*****************************************************************************
//
//! This flag indicates that the slider should have an image drawn on it.
//
//*****************************************************************************
#define SL_STYLE_IMG                0x00000020

//*****************************************************************************
//
//! This flag indicates that the slider should have an image drawn on its
//! background.
//
//*****************************************************************************
#define SL_STYLE_BACKG_IMG          0x00000040

//*****************************************************************************
//
//! This flag indicates that the slider text should be drawn opaque (in
//! other words, drawing the background pixels as well as the foreground
//! pixels) in the active portion of the slider.
//
//*****************************************************************************
#define SL_STYLE_TEXT_OPAQUE        0x00000080

//*****************************************************************************
//
//! This flag indicates that the slider text should be drawn opaque (in
//! other words, drawing the background pixels as well as the foreground
//! pixels) in the background portion of the slider.
//
//*****************************************************************************
#define SL_STYLE_BACKG_TEXT_OPAQUE  0x00000100

//*****************************************************************************
//
//! This flag indicates that the slider is vertical rather than horizontal.  If
//! the flag is absent, the slider is assumed to operate horizontally with the
//! reported value increasing from left to right.  If set, the reported value
//! increases from the bottom of the widget towards the top.
//
//*****************************************************************************
#define SL_STYLE_VERTICAL           0x00000200

//*****************************************************************************
//
//! This flag causes the slider to ignore pointer input and act as a passive
//! indicator.  An application may set its value and repaint it as normal but
//! its value will not be changed in response to any touchscreen activity.
//
//*****************************************************************************
#define SL_STYLE_LOCKED             0x00000400

//*****************************************************************************
//
//! Declares an initialized slider widget data structure.
//!
//! \param psParent is a pointer to the parent widget.
//! \param psNext is a pointer to the sibling widget.
//! \param psChild is a pointer to the first child widget.
//! \param psDisplay is a pointer to the display on which to draw the slider.
//! \param i32X is the X coordinate of the upper left corner of the slider.
//! \param i32Y is the Y coordinate of the upper left corner of the slider.
//! \param i32Width is the width of the slider.
//! \param i32Height is the height of the slider.
//! \param i32Min is the minimum value for the slider (corresponding to the
//!  left or bottom position).
//! \param i32Max is the maximum value for the slider (corresponding to the
//!  right or top position).
//! \param i32Value is the initial value of the slider.  This must lie in the
//!  range defined by \e i32Min and \e i32Max.
//! \param ui32Style is the style to be applied to the slider.
//! \param ui32FillColor is the color used to fill in the slider.
//! \param ui32BackgroundFillColor is the color used to fill the background
//! area of the slider.
//! \param ui32OutlineColor is the color used to outline the slider.
//! \param ui32TextColor is the color used to draw text on the slider.
//! \param ui32BackgroundTextColor is the color used to draw text on the
//! background portion of the slider.
//! \param psFont is a pointer to the font to be used to draw text on the
//! slider.
//! \param pcText is a pointer to the text to draw on this slider.
//! \param pui8Image is a pointer to the image to draw on this slider.
//! \param pui8BackgroundImage is a pointer to the image to draw on the slider
//! background.
//! \param pfnOnChange is a pointer to the function that is called to notify
//! the application of slider value changes.
//!
//! This macro provides an initialized slider widget data structure, which can
//! be used to construct the widget tree at compile time in global variables
//! (as opposed to run-time via function calls).  This must be assigned to a
//! variable, such as:
//!
//! \verbatim
//!     tSliderWidget g_sSlider = SliderStruct(...);
//! \endverbatim
//!
//! Or, in an array of variables:
//!
//! \verbatim
//!     tSliderWidget g_psSliders[] =
//!     {
//!         SliderStruct(...),
//!         SliderStruct(...)
//!     };
//! \endverbatim
//!
//! \e ui32Style is the logical OR of the following:
//!
//! - \b #SL_STYLE_OUTLINE to indicate that the slider should be outlined.
//! - \b #SL_STYLE_FILL to indicate that the slider should be filled.
//! - \b #SL_STYLE_BACKG_FILL to indicate that the background portion of the
//!   slider should be filled.
//! - \b #SL_STYLE_TEXT to indicate that the slider should have text drawn
//!   on its active portion (using \e psFont and \e pcText).
//! - \b #SL_STYLE_BACKG_TEXT to indicate that the slider should have text drawn
//!   on its background portion (using \e psFont and \e pcText).
//! - \b #SL_STYLE_IMG to indicate that the slider should have an image
//!   drawn on it (using \e pui8Image).
//! - \b #SL_STYLE_BACKG_IMG to indicate that the slider should have an image
//!   drawn on its background (using \e pui8BackgroundImage).
//! - \b #SL_STYLE_TEXT_OPAQUE to indicate that the slider text should be
//!   drawn opaque (in other words, drawing the background pixels).
//! - \b #SL_STYLE_BACKG_TEXT_OPAQUE to indicate that the slider text should be
//!   drawn opaque in the background portion of the widget. (in other words,
//!   drawing the background pixels).
//! - \b #SL_STYLE_VERTICAL to indicate that this is a vertical slider
//!   rather than a horizontal one (the default if this style flag is not set).
//! - \b #SL_STYLE_LOCKED to indicate that the slider is being used as an
//!   indicator and should ignore user input.
//!
//! \return Nothing; this is not a function.
//
//*****************************************************************************
#define SliderStruct(psParent, psNext, psChild, psDisplay, i32X, i32Y,        \
                     i32Width, i32Height, i32Min, i32Max, i32Value,           \
                     ui32Style, ui32FillColor, ui32BackgroundFillColor,       \
                     ui32OutlineColor, ui32TextColor,                         \
                     ui32BackgroundTextColor, psFont, pcText, pui8Image,      \
                     pui8BackgroundImage, pfnOnChange)                        \
        {                                                                     \
            {                                                                 \
                sizeof(tSliderWidget),                                        \
                (tWidget *)(psParent),                                        \
                (tWidget *)(psNext),                                          \
                (tWidget *)(psChild),                                         \
                psDisplay,                                                    \
                {                                                             \
                    i32X,                                                     \
                    i32Y,                                                     \
                    (i32X) + (i32Width) - 1,                                  \
                    (i32Y) + (i32Height) - 1                                  \
                },                                                            \
                SliderMsgProc                                                 \
            },                                                                \
            ui32Style,                                                        \
            ui32FillColor,                                                    \
            ui32BackgroundFillColor,                                          \
            ui32OutlineColor,                                                 \
            ui32TextColor,                                                    \
            ui32BackgroundTextColor,                                          \
            psFont,                                                           \
            pcText,                                                           \
            pui8Image,                                                        \
            pui8BackgroundImage,                                              \
            pfnOnChange,                                                      \
            i32Min,                                                           \
            i32Max,                                                           \
            i32Value,                                                         \
            0                                                                 \
        }

//*****************************************************************************
//
//! Declares an initialized variable containing a slider widget data structure.
//!
//! \param sName is the name of the variable to be declared.
//! \param psParent is a pointer to the parent widget.
//! \param psNext is a pointer to the sibling widget.
//! \param psChild is a pointer to the first child widget.
//! \param psDisplay is a pointer to the display on which to draw the slider.
//! \param i32X is the X coordinate of the upper left corner of the slider.
//! \param i32Y is the Y coordinate of the upper left corner of the slider.
//! \param i32Width is the width of the slider.
//! \param i32Height is the height of the slider.
//! \param i32Min is the minimum value for the slider (corresponding to the
//!  left or bottom position).
//! \param i32Max is the maximum value for the slider (corresponding to the
//!  right or top position).
//! \param i32Value is the initial value of the slider.  This must lie in the
//!  range defined by \e i32Min and \e i32Max.
//! \param ui32Style is the style to be applied to the slider.
//! \param ui32FillColor is the color used to fill in the slider.
//! \param ui32BackgroundFillColor is the color used to fill in the background
//!  area of the slider.
//! \param ui32OutlineColor is the color used to outline the slider.
//! \param ui32TextColor is the color used to draw text on the slider.
//! \param ui32BackgroundTextColor is the color used to draw text on the
//! background portion of the slider.
//! \param psFont is a pointer to the font to be used to draw text on the
//! slider.
//! \param pcText is a pointer to the text to draw on this slider.
//! \param pui8Image is a pointer to the image to draw on this slider.
//! \param pui8BackgroundImage is a pointer to the image to draw on the slider
//! background.
//! \param pfnOnChange is a pointer to the function that is called to notify
//! the application of slider value changes.
//!
//! This macro provides an initialized slider widget data structure, which can
//! be used to construct the widget tree at compile time in global variables
//! (as opposed to run-time via function calls).
//!
//! \e ui32Style is the logical OR of the following:
//!
//! - \b #SL_STYLE_OUTLINE to indicate that the slider should be outlined.
//! - \b #SL_STYLE_FILL to indicate that the slider should be filled.
//! - \b #SL_STYLE_BACKG_FILL to indicate that the background portion of the
//!   slider should be filled.
//! - \b #SL_STYLE_TEXT to indicate that the slider should have text drawn
//!   on its active portion (using \e psFont and \e pcText).
//! - \b #SL_STYLE_BACKG_TEXT to indicate that the slider should have text
//!   drawn on its background portion (using \e psFont and \e pcText).
//! - \b #SL_STYLE_IMG to indicate that the slider should have an image
//!   drawn on it (using \e pui8Image).
//! - \b #SL_STYLE_BACKG_IMG to indicate that the slider should have an image
//!   drawn on its background (using \e pui8BackgroundImage).
//! - \b #SL_STYLE_TEXT_OPAQUE to indicate that the slider text should be
//!   drawn opaque (in other words, drawing the background pixels).
//! - \b #SL_STYLE_BACKG_TEXT_OPAQUE to indicate that the slider text should be
//!   drawn opaque in the background portion of the widget. (in other words,
//!   drawing the background pixels).
//! - \b #SL_STYLE_VERTICAL to indicate that this is a vertical slider
//!   rather than a horizontal one (the default if this style flag is not set).
//! - \b #SL_STYLE_LOCKED to indicate that the slider is being used as an
//!   indicator and should ignore user input.
//!
//! \return Nothing; this is not a function.
//
//*****************************************************************************
#define Slider(sName, psParent, psNext, psChild, psDisplay, i32X, i32Y,       \
               i32Width, i32Height, i32Min, i32Max, i32Value, ui32Style,      \
               ui32FillColor, ui32BackgroundFillColor, ui32OutlineColor,      \
               ui32TextColor, ui32BackgroundTextColor, psFont, pcText,        \
               pui8Image, pui8BackgroundImage, pfnOnChange)                   \
        tSliderWidget sName =                                                 \
            SliderStruct(psParent, psNext, psChild, psDisplay, i32X, i32Y,    \
                         i32Width, i32Height, i32Min, i32Max, i32Value,       \
                         ui32Style, ui32FillColor, ui32BackgroundFillColor,   \
                         ui32OutlineColor, ui32TextColor,                     \
                         ui32BackgroundTextColor, psFont, pcText,             \
                         pui8Image, pui8BackgroundImage, pfnOnChange)

//*****************************************************************************
//
//! Sets the function to call when this slider widget's value changes.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//! \param pfnCallback is a pointer to the function to call.
//!
//! This function sets the function to be called when the value represented by
//! the slider changes.
//!
//! \return None.
//
//*****************************************************************************
#define SliderCallbackSet(psWidget, pfnCallback)                              \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->pfnOnChange = pfnCallback;                                   \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Sets the fill color for the active area of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to be modified.
//! \param ui32Color is the 24-bit RGB color to use to fill the slider.
//!
//! This function changes the color used to fill the active are of the slider
//! on the display.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderFillColorSet(psWidget, ui32Color)                               \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32FillColor = ui32Color;                                   \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Sets the fill color for the background area of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to be modified.
//! \param ui32Color is the 24-bit RGB color to use to fill the background area
//! of the slider.
//!
//! This function changes the color used to fill the background area of the
//! slider on the display.  The display is not updated until the next paint
//! request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderFillColorBackgroundedSet(psWidget, ui32Color)                   \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32BackgroundFillColor = ui32Color;                         \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Disables filling of the active area of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function disables the filling of the active area of a slider widget.
//! The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderFillOff(psWidget)                                               \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style &= ~(SL_STYLE_FILL);                               \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Enables filling of the active area of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function enables the filling of the active area of a slider widget.
//! The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderFillOn(psWidget)                                                \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style |= SL_STYLE_FILL;                                  \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Disables filling of the background area of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function disables the filling of the background area of a slider
//! widget.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderBackgroundFillOff(psWidget)                                     \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style &= ~(SL_STYLE_BACKG_FILL );                        \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Enables filling of the background area of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function enables the filling of the background area of a slider widget.
//! The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderBackgroundFillOn(psWidget)                                      \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style |= SL_STYLE_BACKG_FILL ;                           \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Sets the font for a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//! \param psFnt is a pointer to the font to use to draw text on the slider.
//!
//! This function changes the font used to draw text on the slider.  The
//! display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderFontSet(psWidget, psFnt)                                        \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            const tFont *psF = psFnt;                                         \
            psW->psFont = psF;                                                \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Changes the image drawn on the active area of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to be modified.
//! \param pImg is a pointer to the image to draw onto the slider.
//!
//! This function changes the image that is drawn on the active area of the
//! slider.  This image will be centered within the widget rectangle and the
//! portion represented by the current slider value will be visible.  The
//! display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderImageSet(psWidget, pImg)                                        \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            const uint8_t *pI = pImg;                                         \
            psW->pui8Image = pI;                                              \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Changes the image drawn on the background area of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to be modified.
//! \param pImg is a pointer to the image to draw onto the background area of
//! the slider.
//!
//! This function changes the image that is drawn onto the background area of
//! the slider.  This image will be centered within the widget rectangle and
//! the portion in the area not represented by the current slider value will
//! be visible.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderBackgroundImageSet(psWidget, pImg)                              \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            const uint8_t *pI = pImg;                                         \
            psW->pui8BackgroundImage = pI;                                    \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Disables the image on the active area of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function disables the drawing of an image on the active area of a
//! slider widget.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderImageOff(psWidget)                                              \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style &= ~(SL_STYLE_IMG);                                \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Enables the image on the active area of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function enables the drawing of an image on the active area of a
//! slider widget.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderImageOn(psWidget)                                               \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style |= SL_STYLE_IMG;                                   \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Disables the image on the background area of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function disables the drawing of an image on the background area of a
//! slider widget.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderBackgroundImageOff(psWidget)                                    \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style &= ~(SL_STYLE_BACKG_IMG);                          \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Enables the image on the background area of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function enables the drawing of an image on the background area of a
//! slider widget.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderBackgroundImageOn(psWidget)                                     \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style |= SL_STYLE_BACKG_IMG;                             \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Sets the outline color of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to be modified.
//! \param ui32Color is the 24-bit RGB color to use to outline the slider.
//!
//! This function changes the color used to outline the slider on the
//! display.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderOutlineColorSet(psWidget, ui32Color)                            \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32OutlineColor = ui32Color;                                \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Disables outlining of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function disables the outlining of a slider widget.  The display
//! is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderOutlineOff(psWidget)                                            \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style &= ~(SL_STYLE_OUTLINE);                            \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Enables outlining of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function enables the outlining of a slider widget.  The display
//! is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderOutlineOn(psWidget)                                             \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style |= SL_STYLE_OUTLINE;                               \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Sets the text color of the active portion of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to be modified.
//! \param ui32Color is the 24-bit RGB color to use to draw text on the slider.
//!
//! This function changes the color used to draw text on the active portion of
//! the slider on the display.  The display is not updated until the next paint
//! request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderTextColorSet(psWidget, ui32Color)                               \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32TextColor = ui32Color;                                   \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Sets the background text color of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to be modified.
//! \param ui32Color is the 24-bit RGB color to use to draw background text on
//! the slider.
//!
//! This function changes the color used to draw text on the slider's
//! background portion on the display.  The display is not updated until the
//! next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderBackgroundTextColorSet(psWidget, ui32Color)                     \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32BackgroundTextColor = ui32Color;                         \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Disables the text on the active portion of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function disables the drawing of text on the active portion of a
//! slider widget.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderTextOff(psWidget)                                               \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style &= ~(SL_STYLE_TEXT);                               \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Enables the text on the active portion of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function enables the drawing of text on the active portion of a slider
//! widget.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderTextOn(psWidget)                                                \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style |= SL_STYLE_TEXT;                                  \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Disables opaque text on the active portion of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function disables the use of opaque text on the active portion of this
//! slider.  When not using opaque text, only the foreground pixels of the text
//! are drawn on the screen, allowing the previously drawn pixels (such as the
//! slider image) to show through the text.  Note that SL_STYLE_TEXT must also
//! be cleared to disable text rendering on the slider active area.
//!
//! \return None.
//
//*****************************************************************************
#define SliderTextOpaqueOff(psWidget)                                         \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style &= ~(SL_STYLE_TEXT_OPAQUE);                        \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Enables opaque text on the active portion of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function enables the use of opaque text on  the active portion of this
//! slider.  When using opaque text, both the foreground and background pixels
//! of the text are drawn on the screen, blocking out the previously drawn
//! pixels.    Note that SL_STYLE_TEXT must also be set to enable text
//! rendering on the slider active area.
//!
//! \return None.
//
//*****************************************************************************
#define SliderTextOpaqueOn(psWidget)                                          \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style |= SL_STYLE_TEXT_OPAQUE;                           \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Disables the text on the background portion of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function disables the drawing of text on the background portion of
//! a slider widget.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderBackgroundTextOff(psWidget)                                     \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style &= ~(SL_STYLE_BACKG_TEXT);                         \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Enables the text on the background portion of a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function enables the drawing of text on the background portion of a
//! slider widget.  The display is not updated until the next paint request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderBackgroundTextOn(psWidget)                                      \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style |= SL_STYLE_BACKG_TEXT;                            \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Disables opaque background text on a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function disables the use of opaque text on the background portion of
//! this slider.  When not using opaque text, only the foreground pixels of the
//! text are drawn on the screen, allowing the previously drawn pixels (such as
//! the slider image) to show through the text.  Note that SL_STYLE_BACKG_TEXT
//! must also be cleared to disable text rendering on the slider background
//! area.
//!
//! \return None.
//
//*****************************************************************************
#define SliderBackgroundTextOpaqueOff(psWidget)                               \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style &= ~(SL_STYLE_BACKG_TEXT_OPAQUE);                  \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Enables opaque background text on a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function enables the use of opaque text on the background portion of
//! this slider.  When using opaque text, both the foreground and background
//! pixels of the text are drawn on the screen, blocking out the previously
//! drawn pixels.  Note that SL_STYLE_BACKG_TEXT must also be set to enable
//! text rendering on the slider background area.
//!
//! \return None.
//
//*****************************************************************************
#define SliderBackgroundTextOpaqueOn(psWidget)                                \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style |= SL_STYLE_BACKG_TEXT_OPAQUE;                     \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Locks a slider making it ignore pointer input.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function locks a slider widget and makes it ignore all pointer input.
//! When locked, a slider acts as a passive indicator.  Its value may be
//! changed using SliderValueSet() and the value display updated using
//! WidgetPaint() but no user interaction via the pointer will change the
//! widget value.
//!
//! \return None.
//
//*****************************************************************************
#define SliderLock(psWidget)                                                  \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style |= SL_STYLE_LOCKED;                                \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Unlocks a slider making it pay attention to pointer input.
//!
//! \param psWidget is a pointer to the slider widget to modify.
//!
//! This function unlocks a slider widget.  When unlocked, a slider will
//! respond to pointer input by setting its value appropriately and informing
//! the application via callbacks.
//!
//! \return None.
//
//*****************************************************************************
#define SliderUnlock(psWidget)                                                \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->ui32Style &= ~(SL_STYLE_LOCKED);                             \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Changes the text drawn on a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to be modified.
//! \param pcTxt is a pointer to the text to draw onto the slider.
//!
//! This function changes the text that is drawn onto the slider.  The string
//! is centered across the slider and straddles the active and background
//! portions of the widget.  The display is not updated until the next paint
//! request.
//!
//! \return None.
//
//*****************************************************************************
#define SliderTextSet(psWidget, pcTxt)                                        \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            const char *pcT = pcTxt;                                          \
            psW->pcText = pcT;                                                \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Changes the value range for a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to be modified.
//! \param i32Minimum is the minimum value that the slider will report.
//! \param i32Maximum is the maximum value that the slider will report.
//!
//! This function changes the range of a slider.  Slider positions are reported
//! in terms of this range with the current position of the slider on the
//! display being scaled and translated into this range such that the minimum
//! value represents the left position of a horizontal slider or the bottom
//! position of a vertical slider and the maximum value represents the other
//! end of the slider range.  Note that this function does not cause the slider
//! to be redrawn.  The caller must call WidgetPaint() explicitly after this
//! call to ensure that the widget is redrawn.
//!
//! \return None.
//
//*****************************************************************************
#define SliderRangeSet(psWidget, i32Minimum, i32Maximum)                      \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->i32Min = (i32Minimum);                                       \
            psW->i32Max = (i32Maximum);                                       \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Changes the minimum value for a slider widget.
//!
//! \param psWidget is a pointer to the slider widget to be modified.
//! \param i32Val is the new value to set for the slider.  This is in terms of
//! the value range currently set for the slider.
//!
//! This function changes the value that the slider will display the next time
//! the widget is painted.  The caller is responsible for ensuring that the
//! value passed is within the range specified for the target widget.  The
//! caller must call WidgetPaint() explicitly after this call to ensure that
//! the widget is redrawn.
//!
//! \return None.
//
//*****************************************************************************
#define SliderValueSet(psWidget, i32Val)                                      \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            psW->i32Value = (i32Val);                                         \
        }                                                                     \
        while(0)

//*****************************************************************************
//
//! Sets the vertical or horizontal style for a slider widget
//!
//! \param psWidget is a pointer to the slider widget to be modified.
//! \param bVertical is \b true to set the vertical slider style or \b false
//! to set the horizontal slider style.
//!
//! This function allows the vertical or horizontal style to be set when
//! creating slider widgets dynamically.  The function will typically be called
//! before the slider is first attached to the active widget tree.  Since the
//! vertical or horizontal style is intimately linked with the slider size
//! and position on the display, it seldom makes sense to change this style for
//! a widget which is already on the display.
//!
//! \return None.
//
//*****************************************************************************
#define SliderVerticalSet(psWidget, bVertical)                                \
        do                                                                    \
        {                                                                     \
            tSliderWidget *psW = psWidget;                                    \
            if(bVertical)                                                     \
            {                                                                 \
                psW->ui32Style |= (SL_STYLE_VERTICAL);                        \
            }                                                                 \
            else                                                              \
            {                                                                 \
                psW->ui32Style &= ~(SL_STYLE_VERTICAL);                       \
            }                                                                 \
        }                                                                     \
        while(0)

//*****************************************************************************
//
// Prototypes for the slider widget APIs.
//
//*****************************************************************************
extern int32_t SliderMsgProc(tWidget *psWidget, uint32_t ui32Msg,
                          uint32_t ui32Param1, uint32_t ui32Param2);
extern void SliderInit(tSliderWidget *psWidget,
                       const tDisplay *psDisplay, int32_t i32X, int32_t i32Y,
                       int32_t i32Width, int32_t i32Height);

//*****************************************************************************
//
// Mark the end of the C bindings section for C++ compilers.
//
//*****************************************************************************
#ifdef __cplusplus
}
#endif

//*****************************************************************************
//
// Close the Doxygen group.
//! @}
//
//*****************************************************************************

#endif // __SLIDER_H__
