1352 lines
37 KiB
C++
1352 lines
37 KiB
C++
/****************************************************************************
|
|
* include/cnxwidget.hxx
|
|
*apps/include/graphics/nxwidgets/
|
|
*
|
|
* Copyright (C) 2012 Gregory Nutt. All rights reserved.
|
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in
|
|
* the documentation and/or other materials provided with the
|
|
* distribution.
|
|
* 3. Neither the name NuttX, NxWidgets, nor the names of its contributors
|
|
* me be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
****************************************************************************
|
|
*
|
|
* Portions of this package derive from Woopsi (http://woopsi.org/) and
|
|
* portions are original efforts. It is difficult to determine at this
|
|
* point what parts are original efforts and which parts derive from Woopsi.
|
|
* However, in any event, the work of Antony Dzeryn will be acknowledged
|
|
* in most NxWidget files. Thanks Antony!
|
|
*
|
|
* Copyright (c) 2007-2011, Antony Dzeryn
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* * Neither the names "Woopsi", "Simian Zombie" nor the
|
|
* names of its contributors may be used to endorse or promote products
|
|
* derived from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY Antony Dzeryn ``AS IS'' AND ANY
|
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL Antony Dzeryn BE LIABLE FOR ANY
|
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef __APPS_INCLUDE_GRAPHICS_NXWIDGETS_CNXWIDGET_HXX
|
|
#define __APPS_INCLUDE_GRAPHICS_NXWIDGETS_CNXWIDGET_HXX
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <ctime>
|
|
|
|
#include <nuttx/nx/nxglib.h>
|
|
|
|
#include "graphics/nxwidgets/cnxstring.hxx"
|
|
#include "graphics/nxwidgets/cnxfont.hxx"
|
|
#include "graphics/nxwidgets/crect.hxx"
|
|
#include "graphics/nxwidgets/cwidgetstyle.hxx"
|
|
#include "graphics/nxwidgets/cwidgeteventargs.hxx"
|
|
#include "graphics/nxwidgets/cwidgeteventhandler.hxx"
|
|
#include "graphics/nxwidgets/cwidgeteventhandlerlist.hxx"
|
|
#include "graphics/nxwidgets/tnxarray.hxx"
|
|
|
|
/****************************************************************************
|
|
* Implementation Classes
|
|
****************************************************************************/
|
|
|
|
#if defined(__cplusplus)
|
|
|
|
namespace NXWidgets
|
|
{
|
|
/**
|
|
* Forward references
|
|
*/
|
|
|
|
class CWidgetControl;
|
|
class CGraphicsPort;
|
|
class CNxFont;
|
|
class CWidgetEventHandlerList;
|
|
|
|
/**
|
|
* Class providing all the basic functionality of a NxWidget. All other
|
|
* widgets must must inherit from this class.
|
|
*/
|
|
|
|
class CNxWidget
|
|
{
|
|
public:
|
|
|
|
/**
|
|
* Enum listing flags that can be set in the constructor's "flags" parameter.
|
|
*/
|
|
|
|
enum WidgetFlagType
|
|
{
|
|
WIDGET_BORDERLESS = 0x0001, /**< Widget has no border */
|
|
WIDGET_DRAGGABLE = 0x0002, /**< Widget can be dragged by the user */
|
|
WIDGET_PERMEABLE = 0x0004, /**< Widget's children can exceed this widget's edges */
|
|
WIDGET_DOUBLE_CLICKABLE = 0x0008, /**< Widget can be double-clicked */
|
|
WIDGET_NO_RAISE_EVENTS = 0x0010, /**< Widget does not raise events */
|
|
};
|
|
|
|
/**
|
|
* Struct describing some basic properties of a widget.
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t clicked : 1; /**< True if the widget is currently clicked. */
|
|
uint8_t hasFocus : 1; /**< True if the widget has focus. */
|
|
uint8_t dragging : 1; /**< True if the widget is being dragged. */
|
|
uint8_t deleted : 1; /**< True if the widget has been deleted. */
|
|
uint8_t borderless : 1; /**< True if the widget is borderless. */
|
|
uint8_t draggable : 1; /**< True if the widget can be dragged. */
|
|
uint8_t drawingEnabled : 1; /**< True if the widget can be drawn. */
|
|
uint8_t enabled : 1; /**< True if the widget is enabled. */
|
|
uint8_t permeable : 1; /**< True if the widget's children can exceed its dimensions. */
|
|
uint8_t erased : 1; /**< True if the widget is currently erased from the frame buffer. */
|
|
uint8_t hidden : 1; /**< True if the widget is hidden. */
|
|
uint8_t doubleClickable : 1; /**< True if the widget can be double-clicked. */
|
|
} Flags;
|
|
|
|
/**
|
|
* Struct describing the size of all four borders of a widget.
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
uint8_t top; /**< Height of the top border. */
|
|
uint8_t right; /**< Width of the right border. */
|
|
uint8_t bottom; /**< Height of the bottom border. */
|
|
uint8_t left; /**< Width of the left border. */
|
|
} WidgetBorderSize;
|
|
|
|
protected:
|
|
CWidgetControl *m_widgetControl; /**< The controlling widget for the display */
|
|
CRect m_rect; /**< Rectangle bounding the widget. */
|
|
|
|
// Dragging variables
|
|
|
|
nxgl_coord_t m_grabPointX; /**< Physical space x coordinate where dragging began. */
|
|
nxgl_coord_t m_grabPointY; /**< Physical space y coordinate where dragging began. */
|
|
nxgl_coord_t m_newX; /**< Physical x coordinate where widget is being dragged to. */
|
|
nxgl_coord_t m_newY; /**< Physical y coordinate where widget is being dragged to. */
|
|
|
|
// Style
|
|
|
|
CWidgetStyle m_style; /**< All style information used by a widget. */
|
|
|
|
// Status
|
|
|
|
Flags m_flags; /**< Flags struct. */
|
|
|
|
// Event handling
|
|
|
|
CWidgetEventHandlerList *m_widgetEventHandlers; /**< List of event handlers. */
|
|
|
|
// Double-clicking
|
|
|
|
struct timespec m_lastClickTime; /**< System timer when last clicked. */
|
|
nxgl_coord_t m_lastClickX; /**< X coordinate of last click. */
|
|
nxgl_coord_t m_lastClickY; /**< Y coordinate of last click. */
|
|
int m_doubleClickBounds; /**< Area in which a click is assumed to be a double-click. */
|
|
|
|
// Hierarchy control
|
|
|
|
CNxWidget *m_parent; /**< Pointer to the widget's parent. */
|
|
CNxWidget *m_focusedChild; /**< Pointer to the child widget that has focus. */
|
|
TNxArray<CNxWidget*> m_children; /**< List of child widgets. */
|
|
|
|
// Borders
|
|
|
|
WidgetBorderSize m_borderSize; /**< Size of the widget borders. */
|
|
|
|
/**
|
|
* Draw the area of this widget that falls within the clipping region.
|
|
* Called by the redraw() function to draw all visible regions.
|
|
*
|
|
* @param port The CGraphicsPort to draw to.
|
|
* @see redraw().
|
|
*/
|
|
|
|
virtual void drawContents(CGraphicsPort* port);
|
|
|
|
/**
|
|
* Draw the area of this widget that falls within the clipping region.
|
|
* Called by the redraw() function to draw all visible regions.
|
|
*
|
|
* @param port The CGraphicsPort to draw to.
|
|
* @see redraw().
|
|
*/
|
|
|
|
virtual void drawBorder(CGraphicsPort* port) { }
|
|
|
|
/**
|
|
* Draw all visible regions of this widget's children.
|
|
*/
|
|
|
|
void drawChildren(void);
|
|
|
|
/**
|
|
* Erase and remove the supplied child widget from this widget and
|
|
* send it to the deletion queue.
|
|
*
|
|
* @param widget The widget to close.
|
|
* @see close().
|
|
*/
|
|
|
|
void closeChild(CNxWidget *widget);
|
|
|
|
/**
|
|
* Notify this widget that it is being dragged, and set its drag point.
|
|
*
|
|
* @param x The x coordinate of the drag position relative to this widget.
|
|
* @param y The y coordinate of the drag position relative to this widget.
|
|
*/
|
|
|
|
void startDragging(nxgl_coord_t x, nxgl_coord_t y);
|
|
|
|
/**
|
|
* Notify this widget that it is no longer being dragged.
|
|
*/
|
|
|
|
void stopDragging(nxgl_coord_t x, nxgl_coord_t y);
|
|
|
|
/**
|
|
* Copy constructor is protected to prevent usage.
|
|
*/
|
|
|
|
inline CNxWidget(const CNxWidget &widget) { }
|
|
|
|
/**
|
|
* Called when the widget is clicked. Override this when creating new
|
|
* widgets if the widget should exhibit additional behaviour when it is
|
|
* clicked.
|
|
*
|
|
* @param x The x coordinate of the click.
|
|
* @param y The y coordinate of the click.
|
|
*/
|
|
|
|
virtual inline void onClick(nxgl_coord_t x, nxgl_coord_t y) { }
|
|
|
|
/**
|
|
* Called when the widget is double-clicked. Override this when
|
|
* creating new widgets if the widget should exhibit additional
|
|
* behaviour when it is double-clicked. To change the conditions that
|
|
* apply in detecting a double-click, override the isDoubleClicked()
|
|
* method.
|
|
*
|
|
* @param x The x coordinate of the click.
|
|
* @param y The y coordinate of the click.
|
|
*/
|
|
|
|
virtual inline void onDoubleClick(nxgl_coord_t x, nxgl_coord_t y) { }
|
|
|
|
/**
|
|
* Called just before the widget is released; the widget will be in the
|
|
* clicked stated. Override this when creating new widgets if the
|
|
* widget should exhibit additional behaviour when it is released.
|
|
*
|
|
* @param x The x coordinate of the mouse when released.
|
|
* @param y The y coordinate of the mouse when released.
|
|
*/
|
|
|
|
virtual inline void onPreRelease(nxgl_coord_t x, nxgl_coord_t y) { }
|
|
|
|
/**
|
|
* Called just after the widget is released; the widget will be in the
|
|
* released stated. Override this when creating new widgets if the
|
|
* widget should exhibit additional behaviour when it is released.
|
|
*
|
|
* @param x The x coordinate of the mouse when released.
|
|
* @param y The y coordinate of the mouse when released.
|
|
*/
|
|
|
|
virtual inline void onRelease(nxgl_coord_t x, nxgl_coord_t y) { }
|
|
|
|
/**
|
|
* Called when the widget is released outside of its boundaries.
|
|
* Override this when creating new widgets if the widget should exhibit
|
|
* additional behaviour when it is released outside of its boundaries.
|
|
*
|
|
* @param x The x coordinate of the mouse when released.
|
|
* @param y The y coordinate of the mouse when released.
|
|
*/
|
|
|
|
virtual inline void onReleaseOutside(nxgl_coord_t x, nxgl_coord_t y) { }
|
|
|
|
/**
|
|
* Called when the widget is dragged. Override this when creating new
|
|
* widgets if the widget should exhibit additional behaviour when it is
|
|
* dragged.
|
|
*
|
|
* @param x The x coordinate of the mouse.
|
|
* @param y The y coordinate of the mouse.
|
|
* @param vX X distance dragged.
|
|
* @param vY Y distance dragged.
|
|
*/
|
|
|
|
virtual inline void onDrag(nxgl_coord_t x, nxgl_coord_t y,
|
|
nxgl_coord_t vX, nxgl_coord_t vY) { }
|
|
|
|
/**
|
|
* Called when the widget starts being dragged. Override this when
|
|
* creating new widgets if the widget should exhibit additional
|
|
* behaviour when dragging starts.
|
|
*/
|
|
|
|
virtual inline void onDragStart(void) { }
|
|
|
|
/**
|
|
* Called when the widget stops being dragged. Override this when
|
|
* creating new widgets if the widget should exhibit additional
|
|
* behaviour when dragging stops.
|
|
*/
|
|
|
|
virtual inline void onDragStop(void) { }
|
|
|
|
/**
|
|
* Called when the widget gains focus. Override this when creating new
|
|
* widgets if the widget should exhibit additional behaviour when
|
|
* gaining focus.
|
|
*/
|
|
|
|
virtual inline void onFocus(void) { }
|
|
|
|
/**
|
|
* Called when the widget loses focus. Override this when creating new
|
|
* widgets if the widget should exhibit additional behaviour when
|
|
* losing focus.
|
|
*/
|
|
|
|
virtual inline void onBlur(void) { }
|
|
|
|
/**
|
|
* Called when the widget is enabled. Override this when creating new
|
|
* widgets if the widget should exhibit additional behaviour when
|
|
* enabled.
|
|
*/
|
|
|
|
virtual inline void onEnable(void) { }
|
|
|
|
/**
|
|
* Called when the widget is disabled. Override this when creating new
|
|
* widgets if the widget should exhibit additional behaviour when
|
|
* disabled.
|
|
*/
|
|
|
|
virtual inline void onDisable(void) { }
|
|
|
|
/**
|
|
* Called when the widget is resized. Override this when creating new
|
|
* widgets if the widget should exhibit additional behaviour when
|
|
* resized.
|
|
*
|
|
* @param width The new width.
|
|
* @param height The new height.
|
|
*/
|
|
|
|
virtual inline void onResize(nxgl_coord_t width, nxgl_coord_t height) { }
|
|
|
|
public:
|
|
|
|
/**
|
|
* CNxWidget constructor.
|
|
*
|
|
* @param pWidgetControl The controllwing widget for the display
|
|
* @param x The x coordinate of the widget.
|
|
* @param y The y coordinate of the widget.
|
|
* @param width The width of the widget.
|
|
* @param height The height of the widget.
|
|
* @param flags Bitmask specifying some set-up values for the widget.
|
|
* @param style The style that the button should use. If this is not
|
|
* specified, the button will use the global default widget
|
|
* style.
|
|
* @see WidgetFlagType.
|
|
*/
|
|
|
|
CNxWidget(CWidgetControl *pWidgetControl,
|
|
nxgl_coord_t x, nxgl_coord_t y,
|
|
nxgl_coord_t width, nxgl_coord_t height,
|
|
uint32_t flags,
|
|
FAR const CWidgetStyle *style = (FAR const CWidgetStyle *)NULL);
|
|
|
|
/**
|
|
* Destructor.
|
|
*/
|
|
|
|
virtual ~CNxWidget(void);
|
|
|
|
/**
|
|
* Get the x coordinate of the widget in "Widget space".
|
|
*
|
|
* @return Widget space x coordinate.
|
|
*/
|
|
|
|
nxgl_coord_t getX(void) const;
|
|
|
|
/**
|
|
* Get the y coordinate of the widget in "Widget space".
|
|
*
|
|
* @return Widget space y coordinate.
|
|
*/
|
|
|
|
nxgl_coord_t getY(void) const;
|
|
|
|
/**
|
|
* Get the x coordinate of the widget relative to its parent.
|
|
*
|
|
* @return Parent-space x coordinate.
|
|
*/
|
|
|
|
nxgl_coord_t getRelativeX(void) const;
|
|
|
|
/**
|
|
* Get the y coordinate of the widget relative to its parent.
|
|
*
|
|
* @return Parent-space y coordinate.
|
|
*/
|
|
|
|
nxgl_coord_t getRelativeY(void) const;
|
|
|
|
/**
|
|
* Is the widget active?
|
|
* A value of true indicates that this widget has focus or is an ancestor
|
|
* of the widget with focus.
|
|
*
|
|
* @return True if active.
|
|
*/
|
|
|
|
inline bool hasFocus(void) const
|
|
{
|
|
return m_flags.hasFocus;
|
|
}
|
|
|
|
/**
|
|
* Has the widget been marked for deletion? This function recurses up the widget
|
|
* hierarchy and only returns true if all of the widgets in the ancestor
|
|
* chain are not deleted.
|
|
*
|
|
* Widgets marked for deletion are automatically deleted and should not be
|
|
* interacted with.
|
|
*
|
|
* @return True if marked for deletion.
|
|
*/
|
|
|
|
bool isDeleted(void) const;
|
|
|
|
/**
|
|
* Is the widget allowed to draw? This function recurses up the widget
|
|
* hierarchy and only returns true if all of the widgets in the ancestor
|
|
* chain are visible.
|
|
*
|
|
* @return True if drawing is enabled.
|
|
*/
|
|
|
|
bool isDrawingEnabled(void) const;
|
|
|
|
/**
|
|
* Is the widget hidden? This function recurses up the widget
|
|
* hierarchy and returns true if any of the widgets in the ancestor
|
|
* chain are hidden.
|
|
*
|
|
* @return True if hidden.
|
|
*/
|
|
|
|
bool isHidden(void) const;
|
|
|
|
/**
|
|
* Is the widget enabled? This function recurses up the widget
|
|
* hierarchy and only returns true if all of the widgets in the ancestor
|
|
* chain are enabled.
|
|
*
|
|
* @return True if enabled.
|
|
*/
|
|
|
|
bool isEnabled(void) const;
|
|
|
|
/**
|
|
* Are the widget's edges permeable or solid?
|
|
* Permeable widgets do not enforce their dimensions on the
|
|
* coordinates and dimensions of child widgets.
|
|
*
|
|
* @return True if permeable.
|
|
*/
|
|
|
|
inline bool isPermeable(void) const
|
|
{
|
|
return m_flags.permeable;
|
|
}
|
|
|
|
/**
|
|
* IS the widget double-clickable?
|
|
* @return True if the widget watches for double-clicks.
|
|
*/
|
|
|
|
inline bool isDoubleClickable(void) const
|
|
{
|
|
return m_flags.doubleClickable;
|
|
}
|
|
|
|
/**
|
|
* Does the widget have a border?
|
|
*
|
|
* @return True if the widget does not have a border.
|
|
*/
|
|
|
|
inline bool isBorderless(void) const
|
|
{
|
|
return m_flags.borderless;
|
|
}
|
|
|
|
/**
|
|
* Is the widget clicked?
|
|
*
|
|
* @return True if the widget is currently clicked.
|
|
*/
|
|
|
|
inline bool isClicked(void) const
|
|
{
|
|
return m_flags.clicked;
|
|
}
|
|
|
|
/**
|
|
* Is the widget being dragged?
|
|
*
|
|
* @return True if the widget is currently being dragged.
|
|
*/
|
|
|
|
inline bool isBeingDragged(void) const
|
|
{
|
|
return m_flags.dragging;
|
|
}
|
|
|
|
/**
|
|
* Get the width of the widget.
|
|
*
|
|
* @return The widget width.
|
|
*/
|
|
|
|
inline nxgl_coord_t getWidth(void) const
|
|
{
|
|
return m_rect.getWidth();
|
|
}
|
|
|
|
/**
|
|
* Get the height of the widget.
|
|
*
|
|
* @return The widget height.
|
|
*/
|
|
|
|
inline nxgl_coord_t getHeight(void) const
|
|
{
|
|
return m_rect.getHeight();
|
|
}
|
|
|
|
/**
|
|
* Get the size of the widget
|
|
*
|
|
* @return The widgets's size
|
|
*/
|
|
|
|
inline void getSize(struct nxgl_size_s &size) const
|
|
{
|
|
size.h = m_rect.getHeight();
|
|
size.w = m_rect.getWidth();
|
|
}
|
|
|
|
/**
|
|
* Get the position of the widget
|
|
*
|
|
* @return The widgets's position
|
|
*/
|
|
|
|
inline void getPos(struct nxgl_point_s &pos) const
|
|
{
|
|
pos.x = m_rect.getX();
|
|
pos.y = m_rect.getY();
|
|
}
|
|
|
|
/**
|
|
* Get the window bounding box in physical display coordinated.
|
|
*
|
|
* @return This function returns the window handle.
|
|
*/
|
|
|
|
inline CRect getBoundingBox(void)
|
|
{
|
|
return CRect(m_rect);
|
|
}
|
|
|
|
/**
|
|
* Get the dimensions of the border
|
|
*
|
|
*/
|
|
|
|
inline void getBorderSize(WidgetBorderSize &borderSize)
|
|
{
|
|
borderSize.top = m_borderSize.top;
|
|
borderSize.left = m_borderSize.left;
|
|
borderSize.bottom = m_borderSize.bottom;
|
|
borderSize.right = m_borderSize.right;
|
|
}
|
|
|
|
/**
|
|
* Get a pointer to this widget's parent.
|
|
*
|
|
* @return This widget's parent.
|
|
*/
|
|
|
|
inline CNxWidget *getParent(void) const
|
|
{
|
|
return m_parent;
|
|
}
|
|
|
|
/**
|
|
* Get a pointer to this widget's focused child.
|
|
*
|
|
* @return This widget's focused child.
|
|
*/
|
|
|
|
inline CNxWidget *getFocusedWidget(void)
|
|
{
|
|
return m_focusedChild;
|
|
}
|
|
|
|
/**
|
|
* Insert the dimensions that this widget wants to have into the rect
|
|
* passed in as a parameter. All coordinates are relative to the widget's
|
|
* parent.
|
|
*
|
|
* @param rect Reference to a rect to populate with data.
|
|
*/
|
|
|
|
virtual void getPreferredDimensions(CRect &rect) const;
|
|
|
|
/**
|
|
* Insert the properties of the space within this widget that is
|
|
* available for children into the rect passed in as a parameter.
|
|
* All coordinates are relative to this widget.
|
|
*
|
|
* @param rect Reference to a rect to populate with data.
|
|
*/
|
|
|
|
void getClientRect(CRect &rect) const;
|
|
|
|
/**
|
|
* Insert the properties of the space within this widget that is
|
|
* available for children into the rect passed in as a parameter.
|
|
* Identical to getClientRect() except that all coordinates are
|
|
* absolute positions within the window.
|
|
*
|
|
* @param rect Reference to a rect to populate with data.
|
|
*/
|
|
|
|
void getRect(CRect &rect) const;
|
|
|
|
/**
|
|
* Gets a pointer to the widget's font.
|
|
*
|
|
* @return A pointer to the widget's font.
|
|
*/
|
|
|
|
inline CNxFont *getFont(void) const
|
|
{
|
|
return m_style.font;
|
|
}
|
|
|
|
/**
|
|
* Gets the color used for the normal background fill.
|
|
*
|
|
* @return Background fill color.
|
|
*/
|
|
|
|
inline nxgl_mxpixel_t getBackgroundColor(void) const
|
|
{
|
|
return m_style.colors.background;
|
|
}
|
|
|
|
/**
|
|
* Gets the color used for the background fill when the widget is selected.
|
|
*
|
|
* @return Dark color.
|
|
*/
|
|
|
|
inline nxgl_mxpixel_t getSelectedBackgroundColor(void) const
|
|
{
|
|
return m_style.colors.selectedBackground;
|
|
}
|
|
|
|
/**
|
|
* Gets the color used as the light edge in bevelled boxes.
|
|
*
|
|
* @return Shine color.
|
|
*/
|
|
|
|
inline nxgl_mxpixel_t getShineEdgeColor(void) const
|
|
{
|
|
return m_style.colors.shineEdge;
|
|
}
|
|
|
|
/**
|
|
* Gets the color used as the dark edge in bevelled boxes.
|
|
*
|
|
* @return Shadow color.
|
|
*/
|
|
|
|
inline nxgl_mxpixel_t getShadowEdgeColor(void) const
|
|
{
|
|
return m_style.colors.shadowEdge;
|
|
}
|
|
|
|
/**
|
|
* Gets the color used as the fill in focused window borders.
|
|
*
|
|
* @return Highlight color.
|
|
*/
|
|
|
|
inline nxgl_mxpixel_t getHighlightColor(void) const
|
|
{
|
|
return m_style.colors.highlight;
|
|
}
|
|
|
|
/**
|
|
* Gets the color used for text in a disabled widget.
|
|
*
|
|
* @return Disabled text color.
|
|
*/
|
|
|
|
inline nxgl_mxpixel_t getDisabledTextColor(void) const
|
|
{
|
|
return m_style.colors.disabledText;
|
|
}
|
|
|
|
/**
|
|
* Gets the color used for text in a enabled widget.
|
|
*
|
|
* @return Enabled text color.
|
|
*/
|
|
|
|
inline nxgl_mxpixel_t getEnabledTextColor(void) const
|
|
{
|
|
return m_style.colors.enabledText;
|
|
}
|
|
|
|
/**
|
|
* Gets the color used for text in a clicked widget.
|
|
*
|
|
* @return Selected text color.
|
|
*/
|
|
|
|
inline nxgl_mxpixel_t getSelectedTextColor(void) const
|
|
{
|
|
return m_style.colors.selectedText;
|
|
}
|
|
|
|
/**
|
|
* Get the style used by this widget
|
|
*
|
|
* @return Const pointer to CWidgetStyle stored inside this widget.
|
|
*/
|
|
|
|
inline const CWidgetStyle *getWidgetStyle() const { return &m_style; }
|
|
|
|
/**
|
|
* Use the provided widget style
|
|
*/
|
|
|
|
void useWidgetStyle(const CWidgetStyle *style);
|
|
|
|
/**
|
|
* Sets this widget's border state.
|
|
*
|
|
* @param isBorderless The border state.
|
|
*/
|
|
|
|
void setBorderless(bool isBorderless);
|
|
|
|
/**
|
|
* Sets whether or not this widget can be dragged.
|
|
*
|
|
* @param isDraggable The draggable state.
|
|
*/
|
|
|
|
inline void setDraggable(bool isDraggable)
|
|
{
|
|
m_flags.draggable = isDraggable;
|
|
}
|
|
|
|
/**
|
|
* Sets whether or not child widgets can exceed this widget's dimensions.
|
|
*
|
|
* @param permeable The permeable state.
|
|
*/
|
|
|
|
inline void setPermeable(bool permeable)
|
|
{
|
|
m_flags.permeable = permeable;
|
|
}
|
|
|
|
/**
|
|
* Sets whether or not the widgets processes double-clicks.
|
|
*
|
|
* @param doubleClickable The double-clickable state.
|
|
*/
|
|
|
|
inline void setDoubleClickable(bool doubleClickable)
|
|
{
|
|
m_flags.doubleClickable = doubleClickable;
|
|
}
|
|
|
|
/**
|
|
* Adds a widget event handler. The event handler will receive
|
|
* all events raised by this widget.
|
|
*
|
|
* @param eventHandler A pointer to the event handler.
|
|
*/
|
|
|
|
inline void addWidgetEventHandler(CWidgetEventHandler *eventHandler)
|
|
{
|
|
m_widgetEventHandlers->addWidgetEventHandler(eventHandler);
|
|
}
|
|
|
|
/**
|
|
* Remove a widget event handler.
|
|
*
|
|
* @param eventHandler A pointer to the event handler to remove.
|
|
*/
|
|
|
|
inline void removeWidgetEventHandler(CWidgetEventHandler* eventHandler)
|
|
{
|
|
m_widgetEventHandlers->removeWidgetEventHandler(eventHandler);
|
|
}
|
|
|
|
/**
|
|
* Return the number of registered event handlers
|
|
*
|
|
* @return The number of registered event handlers
|
|
*/
|
|
|
|
inline int nWidgetEventHandlers(void) const
|
|
{
|
|
return m_widgetEventHandlers->size();
|
|
}
|
|
|
|
/**
|
|
* Enables or disables event firing for this widget.
|
|
*
|
|
* @param raises True to enable events, false to disable.
|
|
*/
|
|
|
|
inline void setRaisesEvents(bool raises)
|
|
{
|
|
raises ? m_widgetEventHandlers->enable() : m_widgetEventHandlers->disable();
|
|
}
|
|
|
|
/**
|
|
* Check if event handling is enabled for this widget.
|
|
*
|
|
* @return True is event handling is enabled.
|
|
*/
|
|
|
|
inline bool raisesEvents(void) const
|
|
{
|
|
return m_widgetEventHandlers->isEnabled();
|
|
}
|
|
|
|
/**
|
|
* Disabled drawing of this widget. Widgets hidden using this method will still
|
|
* be processed.
|
|
*/
|
|
|
|
inline void disableDrawing(void)
|
|
{
|
|
m_flags.drawingEnabled = false;
|
|
}
|
|
|
|
/**
|
|
* Enables drawing of this widget.
|
|
*/
|
|
|
|
inline void enableDrawing(void)
|
|
{
|
|
m_flags.drawingEnabled = true;
|
|
}
|
|
|
|
/**
|
|
* Sets the normal background color.
|
|
*
|
|
* @param color The new background color.
|
|
*/
|
|
|
|
inline void setBackgroundColor(nxgl_mxpixel_t color)
|
|
{
|
|
m_style.colors.background = color;
|
|
}
|
|
|
|
/**
|
|
* Sets the background color for a selected widget.
|
|
*
|
|
* @param color The new selected background color.
|
|
*/
|
|
|
|
inline void setSelectedBackgroundColor(nxgl_mxpixel_t color)
|
|
{
|
|
m_style.colors.selectedBackground = color;
|
|
}
|
|
|
|
/**
|
|
* Sets the shiny edge color.
|
|
*
|
|
* @param color The new shine edge color.
|
|
*/
|
|
|
|
inline void setShineEdgeColor(nxgl_mxpixel_t color)
|
|
{
|
|
m_style.colors.shineEdge = color;
|
|
}
|
|
|
|
/**
|
|
* Sets the shadow edge color.
|
|
*
|
|
* @param color The new shadow edge color.
|
|
*/
|
|
|
|
inline void setShadowEdgeColor(nxgl_mxpixel_t color)
|
|
{
|
|
m_style.colors.shadowEdge = color;
|
|
}
|
|
|
|
/**
|
|
* Sets the highlight color.
|
|
*
|
|
* @param color The new highlight color.
|
|
*/
|
|
|
|
inline void setHighlightColor(nxgl_mxpixel_t color)
|
|
{
|
|
m_style.colors.highlight = color;
|
|
}
|
|
|
|
/**
|
|
* Sets the text color to use when the widget is disabled.
|
|
*
|
|
* @param color The new text color.
|
|
*/
|
|
|
|
inline void setDisabledTextColor(nxgl_mxpixel_t color)
|
|
{
|
|
m_style.colors.disabledText = color;
|
|
}
|
|
|
|
/**
|
|
* Sets the text color to use when the widget is enabled.
|
|
*
|
|
* @param color The new text color.
|
|
*/
|
|
|
|
inline void setEnabledTextColor(nxgl_mxpixel_t color)
|
|
{
|
|
m_style.colors.enabledText = color;
|
|
}
|
|
|
|
/**
|
|
* Sets the text color to use when the widget is highlighted or clicked.
|
|
*
|
|
* @param color The new selected text color.
|
|
*/
|
|
|
|
inline void setSelectedTextColor(nxgl_mxpixel_t color)
|
|
{
|
|
m_style.colors.selectedText = color;
|
|
}
|
|
|
|
/**
|
|
* Sets the font.
|
|
*
|
|
* @param font A pointer to the font to use.
|
|
*
|
|
* NOTE: This font is not deleted when the widget is destroyed!
|
|
*/
|
|
|
|
virtual void setFont(CNxFont *font);
|
|
|
|
/**
|
|
* Draws the visible regions of the widget and the widget's child widgets.
|
|
*/
|
|
|
|
void redraw(void);
|
|
|
|
/**
|
|
* Enables the widget.
|
|
*
|
|
* @return True if the widget was enabled.
|
|
*/
|
|
|
|
bool enable(void);
|
|
|
|
/**
|
|
* Disabled the widget.
|
|
*
|
|
* @return True if the widget was disabled.
|
|
*/
|
|
|
|
bool disable(void);
|
|
|
|
/**
|
|
* Erases the widget, marks it as deleted, and moves it to the CNxWidget
|
|
* deletion queue. Widgets are automatically deleted by the framework and
|
|
* should not be deleted externally.
|
|
*/
|
|
|
|
void close(void);
|
|
|
|
/**
|
|
* Draws the widget and makes it visible.
|
|
* Does not steal focus from other widgets.
|
|
*
|
|
* @return True if the widget was shown.
|
|
* @see hide()
|
|
*/
|
|
|
|
bool show(void);
|
|
|
|
/**
|
|
* Erases the widget and makes it invisible.
|
|
* Does not re-assign focus to another widget.
|
|
*
|
|
* @return True if the widget was hidden.
|
|
* @see show()
|
|
*/
|
|
|
|
bool hide(void);
|
|
|
|
/**
|
|
* Click this widget at the supplied coordinates. This should only be
|
|
* overridden in subclasses if the default click behaviour needs to be changed.
|
|
* If the subclassed widget should just respond to a standard click,
|
|
* the onClick() method should be overridden instead.
|
|
*
|
|
* @param x X coordinate of the click.
|
|
* @param y Y coordinate of the click.
|
|
* @return True if the click was successful.
|
|
*/
|
|
|
|
virtual bool click(nxgl_coord_t x, nxgl_coord_t y);
|
|
|
|
/**
|
|
* Check if the click is a double-click.
|
|
*
|
|
* @param x X coordinate of the click.
|
|
* @param y Y coordinate of the click.
|
|
* @return True if the click is a double-click.
|
|
*/
|
|
|
|
virtual bool isDoubleClick(nxgl_coord_t x, nxgl_coord_t y);
|
|
|
|
/**
|
|
* Double-click this widget at the supplied coordinates. This
|
|
* should only be overridden in subclasses if the default
|
|
* double-click behaviour needs to be changed. If the subclassed
|
|
* widget should just respond to a standard double-click, the
|
|
* onDoubleClick() method should be overridden instead.
|
|
*
|
|
* @param x X coordinate of the click.
|
|
* @param y Y coordinate of the click.
|
|
* @return True if the click was successful.
|
|
*/
|
|
|
|
bool doubleClick(nxgl_coord_t x, nxgl_coord_t y);
|
|
|
|
/**
|
|
* Release this widget at the supplied coordinates. This
|
|
* should only be overridden in subclasses if the default
|
|
* release behaviour needs to be changed. If the subclassed
|
|
* widget should just respond to a standard release, the
|
|
* onRelease() method should be overridden instead.
|
|
*
|
|
* @param x X coordinate of the release.
|
|
* @param y Y coordinate of the release.
|
|
* @return True if the release was successful.
|
|
*/
|
|
|
|
bool release(nxgl_coord_t x, nxgl_coord_t y);
|
|
|
|
/**
|
|
* Drag the widget to the supplied coordinates.
|
|
*
|
|
* @param x The x coordinate of the mouse.
|
|
* @param y The y coordinate of the mouse.
|
|
* @param vX The horizontal distance that the mouse was dragged.
|
|
* @param vY The vertical distance that the mouse was dragged.
|
|
* @return True if the drag was successful.
|
|
*/
|
|
|
|
bool drag(nxgl_coord_t x, nxgl_coord_t y,
|
|
nxgl_coord_t vX, nxgl_coord_t vY);
|
|
|
|
/**
|
|
* Send a keypress to the widget.
|
|
*
|
|
* @param key The keycode to send to the widget.
|
|
* @return True if the keypress was processed.
|
|
*/
|
|
|
|
bool keyPress(nxwidget_char_t key);
|
|
|
|
/**
|
|
* Send a cursor control event to the widget.
|
|
*
|
|
* @param control The cursor control code to send to the widget.
|
|
* @return True if the cursor control was processed.
|
|
*/
|
|
|
|
bool cursorControl(ECursorControl control);
|
|
|
|
/**
|
|
* Give the widget focus.
|
|
*
|
|
* @return True if the widget received focus correctly.
|
|
*/
|
|
|
|
bool focus(void);
|
|
|
|
/**
|
|
* Remove focus from the widget.
|
|
*
|
|
* @return True if the widget lost focus correctly.
|
|
*/
|
|
|
|
bool blur(void);
|
|
|
|
/**
|
|
* Move the widget to the new coordinates.
|
|
* Coordinates are relative to the parent widget.
|
|
*
|
|
* @param x The new x coordinate.
|
|
* @param y The new y coordinate.
|
|
* @return True if the move was successful.
|
|
*/
|
|
|
|
bool moveTo(nxgl_coord_t x, nxgl_coord_t y);
|
|
|
|
/**
|
|
* Resize the widget to the new dimensions.
|
|
*
|
|
* @param width The new width.
|
|
* @param height The new height.
|
|
* @return True if the resize was successful.
|
|
*/
|
|
|
|
bool resize(nxgl_coord_t width, nxgl_coord_t height);
|
|
|
|
/**
|
|
* Resize and move the widget in one operation.
|
|
* Only performs one redraw so it is faster than calling the
|
|
* two separate functions.
|
|
*
|
|
* @param x The new x coordinate.
|
|
* @param y The new y coordinate.
|
|
* @param width The new width.
|
|
* @param height The new height.
|
|
* @return True if the widget was adjusted successfully.
|
|
*/
|
|
|
|
bool changeDimensions(nxgl_coord_t x, nxgl_coord_t y,
|
|
nxgl_coord_t width, nxgl_coord_t height);
|
|
|
|
/**
|
|
* Moves the supplied child widget to the deletion queue.
|
|
* For framework use only.
|
|
*
|
|
* @param widget A pointer to the child widget.
|
|
*/
|
|
|
|
void moveChildToDeleteQueue(CNxWidget *widget);
|
|
|
|
/**
|
|
* Sets the supplied widget as the focused child. The widget must
|
|
* be a child of this widget.
|
|
*
|
|
* @param widget A pointer to the child widget.
|
|
* @see getFocusedWidget()
|
|
*/
|
|
|
|
void setFocusedWidget(CNxWidget *widget);
|
|
|
|
/**
|
|
* Checks if the supplied coordinates collide with this widget.
|
|
*
|
|
* @param x The x coordinate to check.
|
|
* @param y The y coordinate to check.
|
|
* @return True if a collision occurred.
|
|
*/
|
|
|
|
virtual bool checkCollision(nxgl_coord_t x, nxgl_coord_t y) const;
|
|
|
|
/**
|
|
* Checks if the supplied rectangle definition collides with this widget.
|
|
*
|
|
* @param x The x coordinate of the rectangle to check.
|
|
* @param y The y coordinate of the rectangle to check.
|
|
* @param width The width of the rectangle to check.
|
|
* @param height The height of the rectangle to check.
|
|
* @return True if a collision occurred.
|
|
*/
|
|
|
|
virtual bool checkCollision(nxgl_coord_t x, nxgl_coord_t y,
|
|
nxgl_coord_t width, nxgl_coord_t height) const;
|
|
|
|
/**
|
|
* Checks if the supplied widget collides with this widget.
|
|
*
|
|
* @param widget A pointer to another widget to check for collisions with.
|
|
* @return True if a collision occurred.
|
|
*/
|
|
|
|
bool checkCollision(CNxWidget *widget) const;
|
|
|
|
/**
|
|
* Adds a widget to this widget's child stack. The widget is added to the
|
|
* top of the stack. Note that the widget can only be added if it is not
|
|
* already a child of another widget.
|
|
*
|
|
* @param widget A pointer to the widget to add to the child list.
|
|
* @see insertWidget()
|
|
*/
|
|
|
|
void addWidget(CNxWidget *widget);
|
|
|
|
/**
|
|
* Inserts a widget into this widget's child stack at the bottom of the
|
|
* stack. Note that the widget can only be added if it is not already
|
|
* a child of another widget.
|
|
*
|
|
* @param widget A pointer to the widget to add to the child list.
|
|
* @see addWidget()
|
|
*/
|
|
|
|
void insertWidget(CNxWidget *widget);
|
|
|
|
/**
|
|
* Set the widget's parent to the widget passed in as a parameter.
|
|
* Called automatically when a widget is added as a child.
|
|
*
|
|
* @param parent A pointer to the parent widget.
|
|
*/
|
|
|
|
inline void setParent(CNxWidget *parent)
|
|
{
|
|
m_parent = parent;
|
|
}
|
|
|
|
/**
|
|
* Delete this widget. This should never be called in user code; widget
|
|
* deletion is handled internally.
|
|
*/
|
|
|
|
inline void destroy(void)
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
/**
|
|
* Remove this widget from the widget hierarchy. Returns
|
|
* responsibility for deleting the widget back to the developer.
|
|
* Does not unregister the widget from the VBL system.
|
|
* Does not erase the widget from the display.
|
|
*
|
|
* @return True if the widget was successfully removed.
|
|
*/
|
|
|
|
bool remove(void);
|
|
|
|
/**
|
|
* Remove a child widget from the widget hierarchy. Returns
|
|
* responsibility for deleting the widget back to the developer.
|
|
* Does not unregister the widget from the VBL system.
|
|
* Does not erase the widget from the display.
|
|
*
|
|
* @param widget Pointer to the widget to remove from the hierarchy.
|
|
* @return True if the widget was successfully removed.
|
|
*/
|
|
|
|
bool removeChild(CNxWidget *widget);
|
|
|
|
/**
|
|
* Get the child widget at the specified index.
|
|
*
|
|
* @param index Index of the child to retrieve.
|
|
* @return Pointer to the child at the specified index.
|
|
*/
|
|
|
|
const CNxWidget *getChild(int index) const;
|
|
|
|
/**
|
|
* Get the number of child widgets.
|
|
*
|
|
* @return The number of child widgets belonging to this widget.
|
|
*/
|
|
|
|
int getChildCount(void) const
|
|
{
|
|
return m_children.size();
|
|
}
|
|
|
|
/**
|
|
* Sets the border size. The border cannot be drawn over in the
|
|
* drawContents() method.
|
|
*
|
|
* @param borderSize The new border size.
|
|
*/
|
|
|
|
void setBorderSize(const WidgetBorderSize &borderSize);
|
|
};
|
|
}
|
|
|
|
#endif // __cplusplus
|
|
|
|
#endif // __APPS_INCLUDE_GRAPHICS_NXWIDGETS_CNXWIDGET_HXX
|