basic implementation of parent/child (no flag handling done yet)

ugfx_release_2.6
Joel Bodenmann 2014-01-04 04:41:32 +01:00
parent 07869da909
commit abe6a47c1f
6 changed files with 69 additions and 3 deletions

View File

@ -128,8 +128,8 @@
#define GWIN_CONSOLE_USE_BASESTREAM FALSE
#define GWIN_CONSOLE_USE_FLOAT FALSE
#define GWIN_NEED_GRAPH FALSE
#define GWIN_NEED_WIDGET FALSE
#define GWIN_NEED_HIERARCHY FALSE
#define GWIN_NEED_LABEL FALSE
#define GWIN_NEED_BUTTON FALSE
#define GWIN_BUTTON_LAZY_RELEASE FALSE

View File

@ -58,11 +58,20 @@
#endif
#endif
#endif
#if GWIN_NEED_HIERARCHY
#if !GQUEUE_NEED_ASYNC
#if GFX_DISPLAY_RULE_WARNINGS
#warning "GWIN: GQUEUE_NEED_ASYNC is required when a GWIN_NEED_HIERARCHY is enabled. It has been turned on for you."
#endif
#undef GQUEUE_NEED_ASYNC
#define GQUEUE_NEED_ASYNC TRUE
#endif
#endif
#if GWIN_NEED_BUTTON || GWIN_NEED_SLIDER || GWIN_NEED_CHECKBOX || GWIN_NEED_LABEL || GWIN_NEED_RADIO || GWIN_NEED_LIST || \
GWIN_NEED_IMAGE || GWIN_NEED_CHECKBOX || GWIN_NEED_PROGRESSBAR
#if !GWIN_NEED_WIDGET
#if GFX_DISPLAY_RULE_WARNINGS
#warning "GWIN: GWIN_NEED_WIDGET is required when a Widget is used. It has been turned on for you."
#warning "GWIN: GWIN_NEED_WIDGET is required when a widget is used. It has been turned on for you."
#endif
#undef GWIN_NEED_WIDGET
#define GWIN_NEED_WIDGET TRUE

View File

@ -27,7 +27,7 @@
* @{
*/
// Forward definition
/* Forward definition */
struct GWidgetObject;
/**

View File

@ -27,6 +27,9 @@
#if GFX_USE_GWIN || defined(__DOXYGEN__)
/* Forward declaration */
typedef struct GWindowObject *GHandle;
/**
* @brief A window object structure
* @note Do not access the members directly. Treat it as a black-box and use the method functions.
@ -46,6 +49,11 @@ typedef struct GWindowObject {
#if GDISP_NEED_TEXT
font_t font; // @< The current font
#endif
#if GWIN_NEED_HIERARCHY
GHandle *parent; // @< The pointer to the parent (or NULL)
GHandle *sibling; // @< The pointer to a widgets brother
GHandle *child; // @< The pointer to a widgets child
#endif
} GWindowObject, * GHandle;
/* @} */
@ -377,6 +385,19 @@ extern "C" {
*/
void gwinRedraw(GHandle gh);
#if GWIN_NEED_HIERARCHY
/**
* @brief Add a child widget to a parent one
*
* @param[in] parent The parent widget (does not need to be parent yet)
* @param[in] child The child widget
* @param[in] last Should the child widget be added to the front or the back of the list?
*
* @api
*/
void gwinAddChild(GHandle parent, GHandle child, bool_t last);
#endif
#if GWIN_NEED_WINDOWMANAGER || defined (__DOXYGEN__)
/**
* @brief Redraw a window

View File

@ -29,6 +29,13 @@
#ifndef GWIN_NEED_WINDOWMANAGER
#define GWIN_NEED_WIDGET FALSE
#endif
/**
* @brief Should the widget hierarchy be included. This provides parent-child features.
* @details Defaults to FALSE
*/
#ifndef GWIN_NEED_HIERARCHY
#define GWIN_NEED_HIERARCHY FALSE
#endif
/**
* @brief Should widget functions be included. Needed for any widget (eg Buttons, Sliders etc)
* @details Defaults to FALSE

View File

@ -167,7 +167,15 @@ color_t gwinGetDefaultBgColor(void) {
GHandle gwinGWindowCreate(GDisplay *g, GWindowObject *pgw, const GWindowInit *pInit) {
if (!(pgw = _gwindowCreate(g, pgw, pInit, &basegwinVMT, 0)))
return 0;
#if GWIN_NEED_HIERARCHY
pgw->parent = NULL;
pgw->sibling = NULL;
pgw->child = NULL;
#endif
gwinSetVisible(pgw, pInit->show);
return pgw;
}
@ -250,6 +258,27 @@ void gwinRedraw(GHandle gh) {
}
#endif
#if GWIN_NEED_HIERARCHY
void gwinAddChild(GHandle parent, GHandle child, bool_t last)
{
child->parent = parent;
child->sibling = NULL;
child->child = NULL;
if(!parent)
return;
if(last && parent->child) {
GHandle s = parent->child;
while(s->sibling) s = s->sibling;
s->sibling = child;
} else {
child->sibling = parent->child;
parent->child = child;
}
}
#endif
void gwinClear(GHandle gh) {
/*
* Don't render anything when the window is not visible but