summaryrefslogtreecommitdiff
path: root/NxWidgets/libnxwidgets
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-05-07 22:49:27 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-05-07 22:49:27 +0000
commitf1954ba315f940c46402865763164bceb7537710 (patch)
treebdca666857e53cd34c4869880ffd4e8bd39c5d31 /NxWidgets/libnxwidgets
parent9bc51533db436502b50aaa0014aa272576968df2 (diff)
downloadpx4-nuttx-f1954ba315f940c46402865763164bceb7537710.tar.gz
px4-nuttx-f1954ba315f940c46402865763164bceb7537710.tar.bz2
px4-nuttx-f1954ba315f940c46402865763164bceb7537710.zip
Big NxWidgets simplification. Remove all hierarch logic. Widgets now exist only in a two-dimensional plane
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4712 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'NxWidgets/libnxwidgets')
-rw-r--r--NxWidgets/libnxwidgets/Makefile6
-rw-r--r--NxWidgets/libnxwidgets/include/cnxwidget.hxx190
-rw-r--r--NxWidgets/libnxwidgets/include/crectcache.hxx222
-rw-r--r--NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx8
-rw-r--r--NxWidgets/libnxwidgets/include/cwidgeteventhandler.hxx16
-rw-r--r--NxWidgets/libnxwidgets/include/cwidgeteventhandlerlist.hxx12
-rw-r--r--NxWidgets/libnxwidgets/src/cnxwidget.cxx619
-rw-r--r--NxWidgets/libnxwidgets/src/crectcache.cxx521
-rw-r--r--NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx39
-rw-r--r--NxWidgets/libnxwidgets/src/cwidgeteventhandlerlist.cxx34
10 files changed, 16 insertions, 1651 deletions
diff --git a/NxWidgets/libnxwidgets/Makefile b/NxWidgets/libnxwidgets/Makefile
index 9a52087ed..b35039e01 100644
--- a/NxWidgets/libnxwidgets/Makefile
+++ b/NxWidgets/libnxwidgets/Makefile
@@ -44,9 +44,9 @@ CSRCS =
CXXSRCS = cbitmap.cxx cbgwindow.cxx ccallback.cxx cgraphicsport.cxx
CXXSRCS += clistdata.cxx clistdataitem.cxx cnxfont.cxx
CXXSRCS += cnxserver.cxx cnxstring.cxx cnxtimer.cxx cnxwidget.cxx cnxwindow.cxx
-CXXSRCS += cnxtkwindow.cxx cnxtoolbar.cxx crect.cxx crectcache.cxx
-CXXSRCS += crlepalettebitmap.cxx cstringiterator.cxx ctext.cxx cwidgetcontrol.cxx
-CXXSRCS += cwidgeteventhandlerlist.cxx singletons.cxx
+CXXSRCS += cnxtkwindow.cxx cnxtoolbar.cxx crect.cxx crlepalettebitmap.cxx
+CXXSRCS += cstringiterator.cxx ctext.cxx cwidgetcontrol.cxx cwidgeteventhandlerlist.cxx
+CXXSRCS += singletons.cxx
# Widget APIs
CXXSRCS += cbutton.cxx cbuttonarray.cxx ccheckbox.cxx ccyclebutton.cxx
CXXSRCS += cglyphbutton.cxx cimage.cxx ckeypad.cxx clabel.cxx clatchbutton.cxx
diff --git a/NxWidgets/libnxwidgets/include/cnxwidget.hxx b/NxWidgets/libnxwidgets/include/cnxwidget.hxx
index ab44b9d42..d29830c0a 100644
--- a/NxWidgets/libnxwidgets/include/cnxwidget.hxx
+++ b/NxWidgets/libnxwidgets/include/cnxwidget.hxx
@@ -111,7 +111,6 @@ namespace NXWidgets
class CWidgetControl;
class CGraphicsPort;
class CNxFont;
- class CRectCache;
class CWidgetEventHandlerList;
/**
@@ -206,9 +205,8 @@ namespace NXWidgets
CNxWidget *m_focusedChild; /**< Pointer to the child widget that has focus. */
TNxArray<CNxWidget*> m_children; /**< List of child widgets. */
- // Visible regions
+ // Borders
- CRectCache *m_rectCache; /**< List of the widget's visible regions. */
WidgetBorderSize m_borderSize; /**< Size of the widget borders. */
/**
@@ -238,18 +236,6 @@ namespace NXWidgets
virtual void drawBorder(CGraphicsPort* port) { }
/**
- * Checks if the supplied coordinates collide with a portion of this widget
- * that is not obscured by its siblings, but that may be obscured by
- * its children.
- *
- * @param x X coordinate of the click.
- * @param y Y coordinate of the click.
- * @return True if a collision occurred; false if not.
- */
-
- bool checkCollisionWithForegroundRects(nxgl_coord_t x, nxgl_coord_t y) const;
-
- /**
* Draw all visible regions of this widget's children.
*/
@@ -266,34 +252,6 @@ namespace NXWidgets
void closeChild(CNxWidget *widget);
/**
- * Redraws all regions of child widgets that fall within the invalidRects
- * regions.
- *
- * @param invalidRects List of invalid regions that need to be redrawn.
- * @param sender Pointer to the widget that initiated the redraw.
- */
-
- void redrawDirtyChildren(TNxArray<CRect>* invalidRects, CNxWidget *sender);
-
- /**
- * Get the index of the next visible widget higher up the z-order.
- *
- * @param startIndex The starting index.
- * @return The index of the next highest visible widget.
- */
-
- const int getHigherVisibleWidget(const int startIndex) const;
-
- /**
- * Get the index of the next visible widget lower down the z-order.
- *
- * @param startIndex The starting index.
- * @return The index of the next lowest visible widget.
- */
-
- const int getLowerVisibleWidget(const int startIndex) const;
-
- /**
* 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.
@@ -749,24 +707,6 @@ namespace NXWidgets
void getRect(CRect &rect) const;
/**
- * Clips the supplied rect to the boundaries defined by this widget and
- * this widget's parents.
- *
- * @param rect Reference to a rect to populate with data.
- */
-
- void getRectClippedToHierarchy(CRect &rect) const;
-
- /**
- * Gets a pointer to the vector of all of the visible regions of this widget,
- * including any covered by children.
- *
- * @return A pointer to a vector of all visible regions.
- */
-
- TNxArray<CRect> *getForegroundRegions(void);
-
- /**
* Gets a pointer to the widget's font.
*
* @return A pointer to the widget's font.
@@ -1062,13 +1002,6 @@ namespace NXWidgets
void redraw(void);
/**
- * Erases the visible regions of the widget by redrawing the widgets
- * behind it.
- */
-
- void erase(void);
-
- /**
* Enables the widget.
*
* @return True if the widget was enabled.
@@ -1247,42 +1180,6 @@ namespace NXWidgets
nxgl_coord_t width, nxgl_coord_t height);
/**
- * Raises the widget to the top of its parent's widget stack.
- *
- * @return True if the raise was successful.
- */
-
- bool raiseToTop(void);
-
- /**
- * Lowers the widget to the bottom of its parent's widget stack.
- *
- * @return True if the lower was successful.
- */
-
- bool lowerToBottom(void);
-
- /**
- * Raises the supplied widget to the top of this widget's child stack.
- * The supplied widget pointer must be a child of this widget.
- *
- * @param widget A pointer to the child widget to raise.
- * @return True if the raise was successful.
- */
-
- bool raiseWidgetToTop(CNxWidget *widget);
-
- /**
- * Lowers the supplied widget to the bottom of this widget's child stack.
- * The supplied widget pointer must be a child of this widget.
- *
- * @param widget A pointer to the child widget to lower.
- * @return True if the lower was successful.
- */
-
- bool lowerWidgetToBottom(CNxWidget *widget);
-
- /**
* Moves the supplied child widget to the deletion queue.
* For framework use only.
*
@@ -1334,16 +1231,6 @@ namespace NXWidgets
bool checkCollision(CNxWidget *widget) const;
/**
- * Invalidate the visible region cache for all widgets below the supplied
- * widget in this widget's child stack. This will cause those widgets to
- *
- * recalculate their visible regions next time they try to draw themselves.
- * @param widget A pointer to a child widget.
- */
-
- void invalidateLowerWidgetsVisibleRectCache(CNxWidget *widget);
-
- /**
* 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.
@@ -1378,61 +1265,6 @@ namespace NXWidgets
}
/**
- * Rebuild the list of this widget's visible regions
- */
-
- void cacheVisibleRects(void) const;
-
- /**
- * Mark this widget's visible region cache as invalid, and do the same
- * to its child widgets.
- */
-
- void invalidateVisibleRectCache(void);
-
- /**
- * Erase a child widget by drawing the widgets behind it.
- *
- * @param widget The child widget to erase.
- */
-
- void eraseWidget(CNxWidget *widget);
-
- /**
- * Redraw any visible regions of this widget that have become corrupted.
- *
- * @param invalidRects A list of corrupt regions.
- * @param sender A pointer to the widget that corrupted the regions.
- */
-
- void redrawDirty(TNxArray<CRect>* invalidRects, CNxWidget *sender);
-
- /**
- * Clips a rectangular region to the dimensions of this widget and its ancestors.
- *
- * @param rect The region that needs to be clipped.
- */
-
- void clipRectToHierarchy(CRect &rect) const;
-
- /**
- * Swaps the depth of the supplied child widget.
- *
- * @param widget A pointer to the child widget that needs to swap depths.
- * @return True if the swap was successful.
- */
-
- virtual bool swapWidgetDepth(CNxWidget *widget);
-
- /**
- * Swap the depth of this widget.
- *
- * @return True if the swap was successful.
- */
-
- bool swapDepth(void);
-
- /**
* Delete this widget. This should never be called in user code; widget
* deletion is handled internally.
*/
@@ -1481,15 +1313,6 @@ namespace NXWidgets
}
/**
- * Get the index of the specified child widget.
- *
- * @param widget The widget to get the index of.
- * @return The index of the widget. -1 if the widget is not found.
- */
-
- const int getWidgetIndex(const CNxWidget *widget) const;
-
- /**
* Get the child widget at the specified index.
*
* @param index Index of the child to retrieve.
@@ -1510,17 +1333,6 @@ namespace NXWidgets
}
/**
- * Get a pointer to the cache of visible rects.
- *
- * @return A pointer to the cache of visible rects.
- */
-
- inline CRectCache *getCRectCache(void) const
- {
- return m_rectCache;
- }
-
- /**
* Sets the border size. The border cannot be drawn over in the
* drawContents() method.
*
diff --git a/NxWidgets/libnxwidgets/include/crectcache.hxx b/NxWidgets/libnxwidgets/include/crectcache.hxx
deleted file mode 100644
index f38c2313b..000000000
--- a/NxWidgets/libnxwidgets/include/crectcache.hxx
+++ /dev/null
@@ -1,222 +0,0 @@
-/****************************************************************************
- * NxWidgets/libnxwidgets/include/crectcache.hxx
- *
- * 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 __INCLUDE_CRECTCACHE_HXX
-#define __INCLUDE_CRECTCACHE_HXX
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <stdint.h>
-#include <stdbool.h>
-
-#include <nuttx/nx/nxglib.h>
-
-#include "cnxwidget.hxx"
-#include "cwidgetstyle.hxx"
-#include "tnxarray.hxx"
-
-/****************************************************************************
- * Pre-Processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Implementation Classes
- ****************************************************************************/
-
-#if defined(__cplusplus)
-
-namespace NXWidgets
-{
- /**
- * Maintains a list of foreground (ie. above children) and background (with
- * child overlapped-rects removed) rectangles representing the visible portions
- * of a widget.
- */
-
- class CRectCache
- {
- private:
- TNxArray<CRect> m_foregroundRegions; /**< List of the widget's visible regions */
- TNxArray<CRect> m_backgroundRegions; /**< List of the widget's visible regions with child rects removed */
- const CNxWidget *m_widget; /**< Owning widget */
- bool m_foregroundInvalid; /**< True if the foreground cache needs refreshing */
- bool m_backgroundInvalid; /**< True if the background cache needs refreshing */
-
- /**
- * Cache the foreground regions.
- */
-
- void cacheForegroundRegions(void);
-
- /**
- * Cache the background regions.
- */
-
- void cacheBackgroundRegions(void);
-
- public:
-
- /**
- * Constructor.
- *
- * @param widget Widget that contains the rect cache.
- */
-
- CRectCache(const CNxWidget *widget);
-
- /**
- * Destructor.
- */
-
- inline ~CRectCache() { }
-
- /**
- * Rebuild the cache if it is invalid.
- */
-
- void cache(void);
-
- /**
- * Invalidates the cache.
- */
-
- inline void invalidate(void)
- {
- m_foregroundInvalid = true;
- m_backgroundInvalid = true;
- };
-
- /**
- * Return the list of background regions. These are regions that are not overlapped by
- * child widgets.
- *
- * @return The list of background regions.
- */
-
- inline TNxArray<CRect> *getBackgroundRegions(void)
- {
- return &m_backgroundRegions;
- }
-
- /**
- * Return the list of foreground regions. These are regions that represent the entire
- * visible surface of the widget - that is, any regions not overlapped by ancestors or
- * sublings of the widget - including any regions that are actually overlapped by
- * child widgets.
- *
- * @return The list of foreground regions.
- */
-
- inline TNxArray<CRect> *getForegroundRegions(void)
- {
- return &m_foregroundRegions;
- }
-
- /**
- * Works out which rectangles in the invalidRects list overlap this
- * widget, then cuts the rectangles into smaller pieces. The overlapping
- * pieces are pushed into validRects, and the non-overlapping pieces are
- * pushed back into the invalidRects vector.
- *
- * @param invalidRects A vector of regions that need to be tested
- * for collisions against this widget; they represent regions that need
- * to be redrawn.
- * @param validRects A vector of regions that represents areas of the
- * display that do not need to be redrawn.
- * @param sender Pointer to the widget that initiated the split.
- */
-
- void splitRectangles(TNxArray<CRect> *invalidRects,
- TNxArray<CRect> *validRects,
- FAR const CNxWidget *sender) const;
-
- /**
- * Move any rectangles from the visibleRects list that overlap this widget
- * into the invisibleRects list. Used during visible region calculations.
- *
- * @param visibleRects A vector of regions that are not overlapped.
- * @param invisibleRects A vector of regions that are overlapped.
- * @param widget The widget that requested the lists.
- * @see splitRectangles()
- */
-
- void removeOverlappedRects(TNxArray<CRect> *visibleRects,
- TNxArray<CRect> *invisibleRects,
- FAR const CNxWidget* widget) const;
- };
-}
-
-#endif // __cplusplus
-
-#endif // __INCLUDE_CRECTCACHE_HXX
-
diff --git a/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx b/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx
index db7cb06b6..aedec610e 100644
--- a/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx
+++ b/NxWidgets/libnxwidgets/include/cwidgetcontrol.hxx
@@ -392,14 +392,6 @@ namespace NXWidgets
bool swapWidgetDepth(CNxWidget *widget);
/**
- * Redraws any dirty regions within the supplied region.
- *
- * @param rect The region to redraw
- */
-
- void eraseRect(CRect rect);
-
- /**
* Add another widget to be managed by this control instance
*
* @param widget The widget to be controlled.
diff --git a/NxWidgets/libnxwidgets/include/cwidgeteventhandler.hxx b/NxWidgets/libnxwidgets/include/cwidgeteventhandler.hxx
index d9f39ddf9..d176d8822 100644
--- a/NxWidgets/libnxwidgets/include/cwidgeteventhandler.hxx
+++ b/NxWidgets/libnxwidgets/include/cwidgeteventhandler.hxx
@@ -276,22 +276,6 @@ namespace NXWidgets
*/
virtual void handleActionEvent(const CWidgetEventArgs &e) { }
-
- /**
- * Handle a widget move forward event.
- *
- * @param e The event data.
- */
-
- virtual void handleMoveForwardEvent(const CWidgetEventArgs &e) { }
-
- /**
- * Handle a widget move backward event.
- *
- * @param e The event data.
- */
-
- virtual void handleMoveBackwardEvent(const CWidgetEventArgs &e) { }
};
}
diff --git a/NxWidgets/libnxwidgets/include/cwidgeteventhandlerlist.hxx b/NxWidgets/libnxwidgets/include/cwidgeteventhandlerlist.hxx
index ae9e17847..8c9ef6738 100644
--- a/NxWidgets/libnxwidgets/include/cwidgeteventhandlerlist.hxx
+++ b/NxWidgets/libnxwidgets/include/cwidgeteventhandlerlist.hxx
@@ -248,18 +248,6 @@ namespace NXWidgets
void raiseDropEvent(nxgl_coord_t x, nxgl_coord_t y);
/**
- * Raise a move forward event to the event handler.
- */
-
- void raiseMoveForwardEvent(void);
-
- /**
- * Raise a move backward event to the event handler.
- */
-
- void raiseMoveBackwardEvent(void);
-
- /**
* Raise a key press event to the event handler.
*
* @param key The character code of the key that caused the event.
diff --git a/NxWidgets/libnxwidgets/src/cnxwidget.cxx b/NxWidgets/libnxwidgets/src/cnxwidget.cxx
index 483309832..f8eb1efa7 100644
--- a/NxWidgets/libnxwidgets/src/cnxwidget.cxx
+++ b/NxWidgets/libnxwidgets/src/cnxwidget.cxx
@@ -82,7 +82,6 @@
#include "cnxfont.hxx"
#include "cwidgetstyle.hxx"
#include "cwidgeteventargs.hxx"
-#include "crectcache.hxx"
#include "cwidgetcontrol.hxx"
#include "singletons.hxx"
@@ -195,8 +194,7 @@ CNxWidget::CNxWidget(CWidgetControl *pWidgetControl,
m_borderSize.right = 1;
m_borderSize.bottom = 1;
m_borderSize.left = 1;
-
- m_rectCache = new CRectCache(this);
+
m_widgetEventHandlers = new CWidgetEventHandlerList(this);
}
@@ -237,7 +235,6 @@ CNxWidget::~CNxWidget(void)
// Delete instances. NOTE that we do not delete the controlling
// widget. It persists until the window is closed.
- delete m_rectCache;
delete m_widgetEventHandlers;
}
@@ -467,41 +464,6 @@ void CNxWidget::getRect(CRect &rect) const
}
/**
- * Clips the supplied rect to the boundaries defined by this widget and
- * this widget's parents.
- *
- * @param rect Reference to a rect to populate with data.
- */
-
-void CNxWidget::getRectClippedToHierarchy(CRect &rect) const
-{
- // Copy the widget's properties into the rect. NOTE that if this is
- // a child widget, getX() and getY() will return the actual X and Y
- // positions (and not the parent-relative X and Y positions).
-
- rect.setX(getX());
- rect.setY(getY());
- rect.setWidth(getWidth());
- rect.setHeight(getHeight());
-
- // And clip it
-
- clipRectToHierarchy(rect);
-}
-
-/**
- * Gets a pointer to the vector of all of the visible regions of this widget,
- * including any covered by children.
- *
- * @return A pointer to a vector of all visible regions.
- */
-
-TNxArray<CRect> *CNxWidget::getForegroundRegions(void)
-{
- return m_rectCache->getForegroundRegions();
-}
-
-/**
* Sets this widget's border state.
*
* @param isBorderless The border state.
@@ -510,7 +472,6 @@ TNxArray<CRect> *CNxWidget::getForegroundRegions(void)
void CNxWidget::setBorderless(bool borderless)
{
m_flags.borderless = borderless;
- invalidateVisibleRectCache();
}
/**
@@ -532,50 +493,22 @@ void CNxWidget::redraw(void)
{
if (isDrawingEnabled())
{
- cacheVisibleRects();
+ // Get the graphics port needed to draw on this window
- if (m_rectCache->getBackgroundRegions()->size() > 0)
- {
- // Get the graphics port for drawing in this window
+ CGraphicsPort *port = m_widgetControl->getGraphicsPort();
- CGraphicsPort *port = m_widgetControl->getGraphicsPort();
+ // Draw the Widget
- // Draw all visible rectangles
-
- for (int i = 0; i < m_rectCache->getBackgroundRegions()->size(); i++)
- {
- drawBorder(port);
- drawContents(port);
- }
- }
+ drawBorder(port);
+ drawContents(port);
// Remember that the widget is no longer erased
m_flags.erased = false;
- drawChildren();
- }
-}
-
-/**
- * Erases the visible regions of the widget by redrawing the widgets
- * behind it.
- */
-
-void CNxWidget::erase(void)
-{
- if (!m_flags.erased)
- {
- cacheVisibleRects();
-
- if (m_parent != (CNxWidget *)NULL)
- {
- m_parent->eraseWidget(this);
- }
-
- // Remember that the widget has been erased
- m_flags.erased = true;
- invalidateVisibleRectCache();
+ // Draw the children of the widget
+
+ drawChildren();
}
}
@@ -646,7 +579,6 @@ void CNxWidget::close(void)
// Ensure the widget isn't running modally
stopModal();
- erase();
if (m_parent != (CNxWidget *)NULL)
{
@@ -669,10 +601,6 @@ bool CNxWidget::show(void)
{
m_flags.hidden = false;
- // Ensure that widgets behind this do not draw over the
- // top of the newly-visible widget
-
- m_parent->invalidateLowerWidgetsVisibleRectCache(this);
m_widgetEventHandlers->raiseShowEvent();
redraw();
return true;
@@ -699,7 +627,6 @@ bool CNxWidget::hide(void)
stopModal();
m_widgetEventHandlers->raiseHideEvent();
- erase();
return true;
}
@@ -741,14 +668,6 @@ bool CNxWidget::click(nxgl_coord_t x, nxgl_coord_t y)
}
}
- // Ensure that the click has occurred on a region of this widget
- // not obscured by its siblings
-
- if (!checkCollisionWithForegroundRects(x, y))
- {
- return false;
- }
-
// Handle clicks on this
m_flags.clicked = true;
@@ -834,14 +753,6 @@ bool CNxWidget::doubleClick(nxgl_coord_t x, nxgl_coord_t y)
}
}
- // Ensure that the click has occurred on a region of this widget
- // not obscured by its siblings
-
- if (!checkCollisionWithForegroundRects(x, y))
- {
- return false;
- }
-
m_flags.clicked = true;
// Record data for double-click
@@ -1143,8 +1054,6 @@ bool CNxWidget::moveTo(nxgl_coord_t x, nxgl_coord_t y)
if ((m_rect.getX() != x) || (m_rect.getY() != y))
{
- erase();
-
nxgl_coord_t oldX = m_rect.getX();
nxgl_coord_t oldY = m_rect.getY();
@@ -1205,19 +1114,11 @@ bool CNxWidget::resize(nxgl_coord_t width, nxgl_coord_t height)
bool wasDrawEnabled = m_flags.drawingEnabled;
m_flags.permeable = true;
- erase();
disableDrawing();
m_rect.setWidth(width);
m_rect.setHeight(height);
- // Handle visible region caching
-
- if (m_parent != (CNxWidget *)NULL)
- {
- m_parent->invalidateLowerWidgetsVisibleRectCache(this);
- }
-
onResize(width, height);
// Reset the permeable value
@@ -1258,117 +1159,6 @@ bool CNxWidget::changeDimensions(nxgl_coord_t x, nxgl_coord_t y,
}
/**
- * Raises the widget to the top of its parent's widget stack.
- *
- * @return True if the raise was successful.
- */
-
-bool CNxWidget::raiseToTop(void)
-{
- if (m_parent != (CNxWidget *)NULL)
- {
- if (m_parent->raiseWidgetToTop(this))
- {
- m_widgetEventHandlers->raiseMoveForwardEvent();
- return true;
- }
- }
-
- return false;
-}
-
-/**
- * Lowers the widget to the bottom of its parent's widget stack.
- *
- * @return True if the lower was successful.
- */
-
-bool CNxWidget::lowerToBottom(void)
-{
- if (m_parent != (CNxWidget *)NULL)
- {
- if (m_parent->lowerWidgetToBottom(this))
- {
- m_widgetEventHandlers->raiseMoveBackwardEvent();
- return true;
- }
- }
-
- return false;
-}
-
-/**
- * Raises the supplied widget to the top of this widget's child stack.
- * The supplied widget pointer must be a child of this widget.
- *
- * @param widget A pointer to the child widget to raise.
- * @return True if the raise was successful.
- */
-
-bool CNxWidget::raiseWidgetToTop(CNxWidget *widget)
-{
- // Locate widget in the stack
-
- int index = getWidgetIndex(widget);
-
- if ((index > -1) && (index < m_children.size() - 1))
- {
- m_children.erase(index);
- m_children.push_back(widget);
-
- widget->invalidateVisibleRectCache();
-
- // Invalidate all widgets that collide with the depth-swapped widget
-
- for (int i = 0; i < m_children.size(); i++)
- {
- if (m_children[i]->checkCollision(widget))
- {
- m_children[i]->invalidateVisibleRectCache();
- }
- }
-
- widget->redraw();
- return true;
- }
-
- return false;
-}
-
-/**
- * Lowers the supplied widget to the bottom of this widget's child stack.
- * The supplied widget pointer must be a child of this widget.
- *
- * @param widget A pointer to the child widget to lower.
- * @return True if the lower was successful.
- */
-
-bool CNxWidget::lowerWidgetToBottom(CNxWidget *widget)
-{
- // Locate widget in the stack
-
- int index = getWidgetIndex(widget);
-
- if (index > 0)
- {
- widget->erase();
-
- // Handle visible region caching
-
- widget->invalidateVisibleRectCache();
- invalidateLowerWidgetsVisibleRectCache(widget);
-
- m_children.erase(index);
- m_children.insert(0, widget);
-
- widget->redraw();
- return true;
- }
-
- return false;
-}
-
-/**
* Moves the supplied child widget to the deletion queue.
* For framework use only.
*
@@ -1446,7 +1236,7 @@ bool CNxWidget::checkCollision(nxgl_coord_t x, nxgl_coord_t y) const
// Get the clipped rect
CRect rect;
- getRectClippedToHierarchy(rect);
+ getRect(rect);
return rect.contains(x, y);
}
@@ -1471,7 +1261,7 @@ bool CNxWidget::checkCollision(nxgl_coord_t x, nxgl_coord_t y,
// Get the clipped rect
CRect rect;
- getRectClippedToHierarchy(rect);
+ getRect(rect);
return rect.intersects(CRect(x, y, width, height));
}
@@ -1487,36 +1277,11 @@ bool CNxWidget::checkCollision(CNxWidget *widget) const
// Get the clipped rect
CRect rect;
- widget->getRectClippedToHierarchy(rect);
+ widget->getRect(rect);
return rect.intersects(m_rect);
}
/**
- * Invalidate the visible region cache for all widgets below the supplied
- * widget in this widget's child stack. This will cause those widgets to
- *
- * recalculate their visible regions next time they try to draw themselves.
- * @param widget A pointer to a child widget.
- */
-
-void CNxWidget::invalidateLowerWidgetsVisibleRectCache(CNxWidget *widget)
-{
- // Find the widget
-
- int widgetIndex = getWidgetIndex(widget);
-
- // Invalidate lower widgets
-
- for (int i = widgetIndex - 1; i > -1; i--)
- {
- if (m_children[i]->checkCollision(widget))
- {
- m_children[i]->invalidateVisibleRectCache();
- }
- }
-}
-
-/**
* 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.
@@ -1540,7 +1305,6 @@ void CNxWidget::addWidget(CNxWidget *widget)
}
widget->enableDrawing();
- invalidateVisibleRectCache();
widget->redraw();
}
}
@@ -1562,252 +1326,11 @@ void CNxWidget::insertWidget(CNxWidget *widget)
m_children.insert(0, widget);
widget->enableDrawing();
- invalidateVisibleRectCache();
widget->redraw();
}
}
/**
- * Rebuild the list of this widget's visible regions
- */
-
-void CNxWidget::cacheVisibleRects(void) const
-{
- m_rectCache->cache();
-}
-
-/**
- * Mark this widget's visible region cache as invalid, and do the same
- * to its child widgets.
- */
-
-void CNxWidget::invalidateVisibleRectCache(void)
-{
- m_rectCache->invalidate();
-
- // Invalidate child cache
-
- for (int i = 0; i < m_children.size(); i++)
- {
- m_children[i]->invalidateVisibleRectCache();
- }
-}
-
-/**
- * Erase a child widget by drawing the widgets behind it.
- *
- * @param widget The child widget to erase.
- */
-
-void CNxWidget::eraseWidget(CNxWidget *widget)
-{
- // Locate the widget
-
- int widgetIndex = getWidgetIndex(widget);
-
- // Ensure rect cache is up to date
-
- widget->cacheVisibleRects();
-
- // Order all lower widgets to redraw themselves based on the erased widget's
- // visible rect cache
-
- for (int i = widgetIndex - 1; i > -1; i--)
- {
- m_children[i]->redrawDirty(widget->getForegroundRegions(), widget);
- }
-
- // Order this widget to redraw itself based on any remaining rectangles
- // in the erased widget's rect cache
-
- redrawDirty(widget->getForegroundRegions(), widget);
- invalidateVisibleRectCache();
-}
-
-/**
- * Redraw any visible regions of this widget that have become corrupted.
- *
- * @param invalidRects A list of corrupt regions.
- * @param sender A pointer to the widget that corrupted the regions.
- */
-
-void CNxWidget::redrawDirty(TNxArray<CRect> *invalidRects, CNxWidget *sender)
-{
- if (isDrawingEnabled())
- {
- // Draw any children first
-
- redrawDirtyChildren(invalidRects, sender);
-
- // Create an array that will contain all of the rects from the
- // original array that overlap this widget
-
- TNxArray<CRect> *overlappingRects = new TNxArray<CRect>();
-
- // Remove any non-overlapping rectangles from dirty vector and add to
- // overlapping vector
-
- m_rectCache->splitRectangles(invalidRects, overlappingRects, sender);
-
- // Create an array that will contain all of the rects that overlap this
- // widget clipped to its parent
-
- TNxArray<CRect> *rectsToDraw = new TNxArray<CRect>();
-
- // Split from overlappingRects into rectsToDraw, giving us an array
- // of rects that overlap only the visible portions of this widget
-
- m_rectCache->splitRectangles(overlappingRects, rectsToDraw, sender);
-
- // Get the graphics port for drawing in this window
-
- CGraphicsPort *port = m_widgetControl->getGraphicsPort();
-
- // Draw the dirty rects
-
- if (rectsToDraw->size() > 0)
- {
- for (int i = 0; i < rectsToDraw->size(); i++)
- {
- drawBorder(port);
- drawContents(port);
- }
- }
-
- // Copy all of the overlapping rects we didn't draw back to the main
- // array of rects that need to be drawn by another widget
-
- for (int i = 0; i < overlappingRects->size(); i++)
- {
- invalidRects->push_back(overlappingRects->at(i));
- }
-
- // Clean up
-
- delete overlappingRects;
- delete rectsToDraw;
- }
-}
-
-/**
- * Clips a rectangular region to the dimensions of this widget and its ancestors.
- *
- * @param rect The region that needs to be clipped.
- */
-
-void CNxWidget::clipRectToHierarchy(CRect &rect) const {
-
- const CNxWidget *parent = m_parent;
- const CNxWidget *widget = this;
- CRect thisRect;
-
- while (parent != NULL)
- {
- // Standard widgets can draw into client space
-
- parent->getClientRect(thisRect);
-
- // Adjust rect to screen space
-
- thisRect.offset(parent->getX(), parent->getY());
- rect.clipToIntersect(thisRect);
-
- // Send up to parent
-
- widget = parent;
- parent = parent->getParent();
- }
-}
-
- /**
- * Swaps the depth of the supplied child widget.
- *
- * @param widget A pointer to the child widget that needs to swap depths.
- * @return True if the swap was successful.
- */
-
-bool CNxWidget::swapWidgetDepth(CNxWidget *widget)
-{
- // Can we swap?
-
- if (m_children.size() > 1)
- {
- int widgetSource = 0;
- int widgetDest = 0;
-
- // Locate the widget in the vector
-
- widgetSource = getWidgetIndex(widget);
-
- // Attempt to raise up
-
- int i = getHigherVisibleWidget(widgetSource);
- if (i > -1)
- {
- // Raise
-
- widgetDest = i;
- }
- else
- {
- // Lower to bottom of stack
-
- widgetDest = 0;
- }
-
- // Erase the widget from the screen
-
- eraseWidget(widget);
-
- // Swap
-
- CNxWidget *tmp = m_children[widgetSource];
- m_children[widgetSource] = m_children[widgetDest];
- m_children[widgetDest] = tmp;
-
- // Invalidate the widgets below the top affected widget
-
- if (widgetSource < widgetDest)
- {
- // Source lower; invalidate from dest down
-
- m_children[widgetDest]->invalidateVisibleRectCache();
- invalidateLowerWidgetsVisibleRectCache(m_children[widgetDest]);
- }
- else
- {
- // Dest lower; invalidate from source down
-
- m_children[widgetSource]->invalidateVisibleRectCache();
- invalidateLowerWidgetsVisibleRectCache(m_children[widgetSource]);
- }
-
- // Redraw the widget
-
- widget->redraw();
- return true;
- }
-
- return false;
-}
-
-/**
- * Swap the depth of this widget.
- *
- * @return True if the swap was successful.
- */
-
-bool CNxWidget::swapDepth(void)
-{
- if (m_parent != (CNxWidget *)NULL)
- {
- return m_parent->swapWidgetDepth(this);
- }
-
- return false;
-}
-
-/**
* 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.
@@ -1909,26 +1432,6 @@ void CNxWidget::goModal(void)
}
/**
- * Get the index of the specified child widget.
- *
- * @param widget The widget to get the index of.
- * @return The index of the widget. -1 if the widget is not found.
- */
-
-const int CNxWidget::getWidgetIndex(const CNxWidget *widget) const
-{
- for (int i = 0; i < m_children.size(); i++)
- {
- if (m_children[i] == widget)
- {
- return i;
- }
- }
-
- return -1;
-}
-
-/**
* Get the child widget at the specified index.
*
* @param index Index of the child to retrieve.
@@ -1977,38 +1480,6 @@ void CNxWidget::useWidgetStyle(const CWidgetStyle *style)
}
/**
- * Checks if the supplied coordinates collide with a portion of this widget
- * that is not obscured by its siblings, but that may be obscured by
- * its children.
- *
- * @param x X coordinate of the click.
- * @param y Y coordinate of the click.
- * @return True if a collision occurred; false if not.
- */
-
-bool CNxWidget::checkCollisionWithForegroundRects(nxgl_coord_t x, nxgl_coord_t y) const
-{
- if (isHidden())
- {
- return false;
- }
-
- cacheVisibleRects();
-
- CRect *rect;
- for (int i = 0; i < m_rectCache->getForegroundRegions()->size(); ++i)
- {
- rect = &(m_rectCache->getForegroundRegions()->at(i));
- if (rect->contains(x, y))
- {
- return true;
- }
- }
-
- return false;
-}
-
-/**
* Draw all visible regions of this widget's children.
*/
@@ -2080,72 +1551,6 @@ void CNxWidget::closeChild(CNxWidget *widget)
}
/**
- * Redraws all regions of child widgets that fall within the invalidRects
- * regions.
- *
- * @param invalidRects List of invalid regions that need to be redrawn.
- * @param sender Pointer to the widget that initiated the redraw.
- */
-
-void CNxWidget::redrawDirtyChildren(TNxArray<CRect> *invalidRects, CNxWidget *sender)
-{
- for (int i = m_children.size() - 1; i > -1 ; i--)
- {
- if (invalidRects->size() > 0)
- {
- if (m_children.at(i) != sender)
- {
- m_children[i]->redrawDirty(invalidRects, sender);
- }
- }
- else
- {
- break;
- }
- }
-}
-
-/**
- * Get the index of the next visible widget higher up the z-order.
- *
- * @param startIndex The starting index.
- * @return The index of the next highest visible widget.
- */
-
-const int CNxWidget::getHigherVisibleWidget(const int startIndex) const
-{
- for (int i = startIndex; i < m_children.size(); i++)
- {
- if (!m_children[i]->isHidden())
- {
- return i;
- }
- }
-
- return -1;
-}
-
-/**
- * Get the index of the next visible widget lower down the z-order.
- *
- * @param startIndex The starting index.
- * @return The index of the next lowest visible widget.
- */
-
-const int CNxWidget::getLowerVisibleWidget(const int startIndex) const
-{
- for (int i = startIndex; i > -1; i--)
- {
- if (!m_children[i]->isHidden())
- {
- return i;
- }
- }
-
- return -1;
-}
-
-/**
* 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.
diff --git a/NxWidgets/libnxwidgets/src/crectcache.cxx b/NxWidgets/libnxwidgets/src/crectcache.cxx
deleted file mode 100644
index 3f74ee75d..000000000
--- a/NxWidgets/libnxwidgets/src/crectcache.cxx
+++ /dev/null
@@ -1,521 +0,0 @@
-/****************************************************************************
- * NxWidgets/libnxwidgets/src/crectcache.cxx
- *
- * 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.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <sys/types.h>
-#include <stdint.h>
-#include <stdbool.h>
-
-#include <nuttx/nx/nxglib.h>
-
-#include "crectcache.hxx"
-
-/****************************************************************************
- * Pre-Processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * CNxFont Method Implementations
- ****************************************************************************/
-
-using namespace NXWidgets;
-
-/**
- * Constructor.
- *
- * @param widget Widget that contains the rect cache.
- */
-
-CRectCache::CRectCache(const CNxWidget* widget)
-{
- m_widget = widget;
- m_foregroundInvalid = true;
- m_backgroundInvalid = true;
-}
-
-/**
- * Rebuild the cache if it is invalid.
- */
-
-void CRectCache::cache(void)
-{
- cacheBackgroundRegions();
-}
-
-/**
- * Works out which rectangles in the invalidRects list overlap this
- * widget, then cuts the rectangles into smaller pieces. The overlapping
- * pieces are pushed into validRects, and the non-overlapping pieces are
- * pushed back into the invalidRects vector.
- *
- * @param invalidRects A vector of regions that need to be tested
- * for collisions against this widget; they represent regions that need
- * to be redrawn.
- * @param validRects A vector of regions that represents areas of the
- * display that do not need to be redrawn.
- * @param sender Pointer to the widget that initiated the split.
- */
-
-void CRectCache::splitRectangles(TNxArray<CRect>* invalidRects,
- TNxArray<CRect>* validRects,
- FAR const CNxWidget *sender) const
-{
- // Check for collisions with any rectangles in the vector
-
- for (int i = 0; i < invalidRects->size(); i++)
- {
- // Get rectangle to check
-
- CRect checkRect = invalidRects->at(i);
- nxgl_coord_t splitX[4];
- nxgl_coord_t splitY[4];
- unsigned int rectXCount = 0;
- unsigned int rectYCount = 0;
- unsigned int overlapXRect = 0;
- unsigned int overlapYRect = 0;
-
- nxgl_coord_t width = checkRect.getWidth();
- nxgl_coord_t height = checkRect.getHeight();
-
- if (m_widget->checkCollision(checkRect.getX(), checkRect.getY(), width, height))
- {
- // Got a collision. We need to split this rectangle
- // Get clipped dimensions of widget
-
- CRect widgetRect;
- m_widget->getRectClippedToHierarchy(widgetRect);
-
- // Vertical split
- // Start at left edge of rectangle
-
- splitX[0] = checkRect.getX();
-
- // Check for second split
-
- if (checkRect.getX() < widgetRect.getX())
- {
- // Widget is to the right of the invalid rectangle (or in the centre)
-
- if (splitX[rectXCount] != widgetRect.getX())
- {
- rectXCount++;
- splitX[rectXCount] = widgetRect.getX();
-
- // The next rectangle is the overlap
-
- overlapXRect = rectXCount;
- }
- }
- else
- {
- // Widget rectangle is on the left of the invalid rectangle
-
- if (splitX[rectXCount] != widgetRect.getX2() + 1)
- {
- // We've found the start of the overlapping rectangle!
-
- overlapXRect = rectXCount;
- rectXCount++;
-
- // Split is either the end of the widget or the end of the
- // invalid rect, whichever comes first
-
- if (widgetRect.getX2() <= checkRect.getX2())
- {
- splitX[rectXCount] = widgetRect.getX2() + 1;
- }
- else
- {
- splitX[rectXCount] = checkRect.getX2() + 1;
- }
- }
- else
- {
- // Found the start of the overlapping rectangle
-
- overlapXRect = rectXCount;
- }
- }
-
- // Check for third split
-
- if (widgetRect.getX2() + 1 <= checkRect.getX2() + 1)
- {
- // Widget ends before the invalid rectangle
-
- if (splitX[rectXCount] != widgetRect.getX2() + 1)
- {
- // Record end of overlap
-
- rectXCount++;
- splitX[rectXCount] = widgetRect.getX2() + 1;
- }
- }
-
- // Store end of invalid rectangle
-
- if (splitX[rectXCount] <= checkRect.getX2())
- {
- rectXCount++;
- splitX[rectXCount] = checkRect.getX2() + 1;
- }
-
- // Horizontal split
- // Start at left edge of rectangle
-
- splitY[0] = checkRect.getY();
-
- // Check for second split
-
- if (checkRect.getY() < widgetRect.getY())
- {
- // Widget below the invalid rectangle (or in the centre)
-
- if (splitY[rectYCount] != widgetRect.getY())
- {
- rectYCount++;
- splitY[rectYCount] = widgetRect.getY();
-
- // The next rectangle is the overlap
-
- overlapYRect = rectYCount;
- }
- }
- else
- {
- // Widget rectangle above the invalid rectangle
-
- if (splitY[rectYCount] != widgetRect.getY2() + 1)
- {
- // We've found the start of the overlapping rectangle!
-
- overlapYRect = rectYCount;
- rectYCount++;
-
- // Split is either the end of the widget or the end of the
- // invalid rect, whichever comes first
-
- if (widgetRect.getY2() <= checkRect.getY2())
- {
- splitY[rectYCount] = widgetRect.getY2() + 1;
- }
- else
- {
- splitY[rectYCount] = checkRect.getY2() + 1;
- }
- }
- else
- {
- // Found the start of the overlapping rectangle
-
- overlapYRect = rectYCount;
- }
- }
-
- // Check for third split
-
- if (widgetRect.getY2() < checkRect.getY2())
- {
- // Widget ends before the invalid rectangle
-
- if (splitY[rectYCount] != widgetRect.getY2() + 1)
- {
- // Record end of overlap
-
- rectYCount++;
- splitY[rectYCount] = widgetRect.getY2() + 1;
- }
- }
-
- // Store end of invalid rectangle
-
- if (splitY[rectYCount] <= checkRect.getY2())
- {
- rectYCount++;
- splitY[rectYCount] = checkRect.getY() + 1;
- }
-
- // Remove the original rectangle
-
- invalidRects->erase(i);
-
- // Force the loop to re-examine the new rectangle at this index
-
- i--;
-
- // Add the new rectangles (not the overlap; that's the one we need to draw)
-
- for (unsigned int xRects = 0; xRects < rectXCount; xRects++)
- {
- for (unsigned int yRects = 0; yRects < rectYCount; yRects++)
- {
- // Is this the overlap?
-
- if ((overlapXRect == xRects) && (overlapYRect == yRects))
- {
- // Got the overlap, so set the output values
-
- CRect overlapRect;
- overlapRect.setX(splitX[xRects]);
- overlapRect.setY(splitY[yRects]);
- overlapRect.setX2(splitX[xRects + 1] - 1);
- overlapRect.setY2(splitY[yRects + 1] - 1);
-
- if (overlapRect.hasDimensions())
- {
- validRects->push_back(overlapRect);
- }
- }
- else
- {
- // Not an overlap; add to vector
-
- CRect newRect;
- newRect.setX(splitX[xRects]);
- newRect.setY(splitY[yRects]);
- newRect.setX2(splitX[xRects + 1] - 1);
- newRect.setY2(splitY[yRects + 1] - 1);
-
- // Insert the new rectangle at the start so we don't
-
- if (newRect.hasDimensions())
- {
- invalidRects->push_back(newRect);
- }
-
- // Increase iterator to compensate for insertion
-
- i++;
- }
- }
- }
- }
- }
-}
-
-/**
- * Move any rectangles from the visibleRects list that overlap this widget
- * into the invisibleRects list. Used during visible region calculations.
- *
- * @param visibleRects A vector of regions that are not overlapped.
- * @param invisibleRects A vector of regions that are overlapped.
- * @param widget The widget that requested the lists.
- * @see splitRectangles()
- */
-
-void CRectCache::removeOverlappedRects(TNxArray<CRect> *visibleRects,
- TNxArray<CRect> *invisibleRects,
- FAR const CNxWidget* widget) const
-{
- const CNxWidget* parent = m_widget;
- int widgetIndex = -1;
-
- while ((widget != NULL) && (parent != NULL))
- {
- // Locate widget in the list; we add one to the index to
- // ensure that we deal with the next widget up in the z-order
-
- widgetIndex = parent->getWidgetIndex(widget) + 1;
-
- // Widget should never be the bottom item on the screen
-
- if (widgetIndex > 0)
- {
- // Remove any overlapped rectangles
-
- for (int i = widgetIndex; i < parent->getChildCount(); i++)
- {
- if (visibleRects->size() > 0)
- {
- parent->getChild(i)->getCRectCache()->splitRectangles(visibleRects, invisibleRects, widget);
- }
- else
- {
- break;
- }
- }
- }
-
- if (visibleRects->size() > 0)
- {
- widget = parent;
-
- if (parent != NULL)
- {
- parent = parent->getParent();
- }
- }
- else
- {
- return;
- }
- }
-}
-
-/**
- * Cache the foreground regions.
- */
-
-void CRectCache::cacheForegroundRegions(void)
-{
- if (m_foregroundInvalid)
- {
- // Use internal region cache to store the non-overlapped rectangles
- // We will use this to clip the widget
-
- m_foregroundRegions.clear();
-
- // Create pointer to a vector to store the overlapped rectangles
- // We can discard this later as we don't need it
-
- TNxArray<CRect>* invisibleRects = new TNxArray<CRect>();
-
- // Copy the clipped widget dimensions into a rect
-
- CRect rect;
- m_widget->getRectClippedToHierarchy(rect);
-
- // Do we have a visible region left?
-
- if (rect.hasDimensions())
- {
- // Add rect to list
-
- m_foregroundRegions.push_back(rect);
-
- // Request refresh
-
- if (m_widget->getParent() != NULL)
- {
- m_widget->getParent()->getCRectCache()->removeOverlappedRects(&m_foregroundRegions, invisibleRects, m_widget);
- }
- }
-
- // Tidy up
-
- delete invisibleRects;
- m_foregroundInvalid = false;
- }
-}
-
-/**
- * Cache the background regions.
- */
-
-void CRectCache::cacheBackgroundRegions(void)
-{
- // Ensure that foreground is up to date
-
- cacheForegroundRegions();
-
- if (m_backgroundInvalid)
- {
- // Cache visible regions not overlapped by children
-
- m_backgroundRegions.clear();
-
- // Create pointer to a vector to store the overlapped rectangles
- // We can discard this later as we don't need it
-
- TNxArray<CRect>* invisibleRects = new TNxArray<CRect>();
-
- // Copy all foreground regions into the new vector
-
- for (int i = 0; i < m_foregroundRegions.size(); i++)
- {
- m_backgroundRegions.push_back(m_foregroundRegions[i]);
- }
-
- // Remove all child rects from the visible vector
-
- for (int i = 0; i < m_widget->getChildCount(); i++)
- {
- if (m_backgroundRegions.size() > 0)
- {
- m_widget->getChild(i)->getCRectCache()->splitRectangles(&m_backgroundRegions, invisibleRects, m_widget);
- }
- else
- {
- break;
- }
- }
-
- // Tidy up
-
- delete invisibleRects;
- m_backgroundInvalid = false;
- }
-}
-
-
diff --git a/NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx b/NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx
index afd17e6e2..9c0d67be3 100644
--- a/NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx
+++ b/NxWidgets/libnxwidgets/src/cwidgetcontrol.cxx
@@ -291,44 +291,6 @@ const int CWidgetControl::getWidgetIndex(const CNxWidget *widget) const
}
/**
- * Redraws any dirty regions within the supplied region.
- *
- * @param rect The region to redraw
- */
-
-void CWidgetControl::eraseRect(CRect rect)
-{
- // Create pointer to a vector to store the invalid rectangles
-
- TNxArray<CRect> *invalidRectangles = new TNxArray<CRect>();
-
- if (invalidRectangles != (TNxArray<CRect> *)NULL)
- {
- // Add rectangle into the vector
-
- invalidRectangles->push_back(rect);
-
- // Refresh children
-
- for (int i = m_widgets.size() - 1; i > -1 ; i--)
- {
- if (invalidRectangles->size() > 0)
- {
- m_widgets[i]->redrawDirty(invalidRectangles, (CNxWidget *)NULL);
- }
- else
- {
- break;
- }
- }
-
- // Tidy up
-
- delete invalidRectangles;
- }
-}
-
-/**
* Remove a controlled widget
*
* @param widget The widget to be removed
@@ -477,7 +439,6 @@ void CWidgetControl::redrawEvent(FAR const struct nxgl_rect_s *nxRect, bool more
{
CRect rect;
rect.setNxRect(nxRect);
- eraseRect(rect);
}
/**
diff --git a/NxWidgets/libnxwidgets/src/cwidgeteventhandlerlist.cxx b/NxWidgets/libnxwidgets/src/cwidgeteventhandlerlist.cxx
index de8a31b4b..21d21add9 100644
--- a/NxWidgets/libnxwidgets/src/cwidgeteventhandlerlist.cxx
+++ b/NxWidgets/libnxwidgets/src/cwidgeteventhandlerlist.cxx
@@ -280,40 +280,6 @@ void CWidgetEventHandlerList::raiseDropEvent(nxgl_coord_t x, nxgl_coord_t y)
}
/**
- * Raise a move forward event to the event handler.
- */
-
-void CWidgetEventHandlerList::raiseMoveForwardEvent(void)
-{
- if (isEnabled())
- {
- CWidgetEventArgs e(m_widget, 0, 0, 0, 0, KEY_CODE_NONE);
-
- for (int i = 0; i < m_widgetEventHandlers.size(); ++i)
- {
- m_widgetEventHandlers.at(i)->handleMoveForwardEvent(e);
- }
- }
-}
-
-/**
- * Raise a move backward event to the event handler.
- */
-
-void CWidgetEventHandlerList::raiseMoveBackwardEvent(void)
-{
- if (isEnabled())
- {
- CWidgetEventArgs e(m_widget, 0, 0, 0, 0, KEY_CODE_NONE);
-
- for (int i = 0; i < m_widgetEventHandlers.size(); ++i)
- {
- m_widgetEventHandlers.at(i)->handleMoveBackwardEvent(e);
- }
- }
-}
-
-/**
* Raise a key press event to the event handler.
*
* @param key The code of the key that caused the event.