now using absolute coordinates inside the window

This commit is contained in:
Joel Bodenmann 2014-01-05 05:05:59 +01:00
parent a6b81192eb
commit bd3109851b
3 changed files with 20 additions and 55 deletions

View File

@ -42,7 +42,7 @@ typedef struct GWindowObject {
#endif
const struct gwinVMT *vmt; // @< The VMT for this GWIN
GDisplay * display; // @< The display this window is on.
coord_t x, y; // @< Screen relative position
coord_t x, y; // @< Position relative to parent
coord_t width, height; // @< Dimensions of this window
color_t color, bgcolor; // @< The current drawing colors
uint16_t flags; // @< Window flags (the meaning is private to the GWIN class)
@ -336,17 +336,6 @@ extern "C" {
*/
bool_t gwinGetEnabled(GHandle gh);
/**
* @brief Get absolute coordinates of a window
*
* @param[in] gh The window
* @param[out] x The absolut x coordinate
* @param[out] y The absolut y coordinate
*
* @api
*/
void gwinGetAbsoluteCoordinates(GHandle gh, coord_t *x, coord_t *y);
/**
* @brief Move a window
*

View File

@ -153,52 +153,44 @@ static const GColorSet *getDrawColors(GWidgetObject *gw) {
void gwinCheckboxDraw_CheckOnLeft(GWidgetObject *gw, void *param) {
#define gcw ((GCheckboxObject *)gw)
coord_t ld, df, abs_x, abs_y;
coord_t ld, df;
const GColorSet * pcol;
(void) param;
if (gw->g.vmt != (gwinVMT *)&checkboxVMT)
return;
gwinGetAbsoluteCoordinates((GHandle)gw, &abs_x, &abs_y);
if (gw->g.vmt != (gwinVMT *)&checkboxVMT) return;
pcol = getDrawColors(gw);
ld = gw->g.width < gw->g.height ? gw->g.width : gw->g.height;
gdispGFillArea(gw->g.display, abs_x+1, abs_y+1, ld, ld-2, gw->pstyle->background);
gdispGDrawBox(gw->g.display, abs_x, abs_y, ld, ld, pcol->edge);
gdispGFillArea(gw->g.display, gw->g.x+1, gw->g.y+1, ld, ld-2, gw->pstyle->background);
gdispGDrawBox(gw->g.display, gw->g.x, gw->g.y, ld, ld, pcol->edge);
df = ld < 4 ? 1 : 2;
if (gw->g.flags & GCHECKBOX_FLG_CHECKED)
gdispGFillArea(gw->g.display, abs_x+df, abs_y+df, ld-2*df, ld-2*df, pcol->fill);
gdispGFillArea(gw->g.display, gw->g.x+df, gw->g.y+df, ld-2*df, ld-2*df, pcol->fill);
gdispGFillStringBox(gw->g.display, abs_x+ld+1, abs_y, gw->g.width-ld-1, gw->g.height, gw->text, gw->g.font, pcol->text, gw->pstyle->background, justifyLeft);
gdispGFillStringBox(gw->g.display, gw->g.x+ld+1, gw->g.y, gw->g.width-ld-1, gw->g.height, gw->text, gw->g.font, pcol->text, gw->pstyle->background, justifyLeft);
#undef gcw
}
void gwinCheckboxDraw_CheckOnRight(GWidgetObject *gw, void *param) {
#define gcw ((GCheckboxObject *)gw)
coord_t ep, ld, df, abs_x, abs_y;
coord_t ep, ld, df;
const GColorSet * pcol;
(void) param;
if (gw->g.vmt != (gwinVMT *)&checkboxVMT)
return;
gwinGetAbsoluteCoordinates((GHandle)gw, &abs_x, &abs_y);
if (gw->g.vmt != (gwinVMT *)&checkboxVMT) return;
pcol = getDrawColors(gw);
ld = gw->g.width < gw->g.height ? gw->g.width : gw->g.height;
ep = gw->g.width-ld-1;
gdispGFillArea(gw->g.display, abs_x+ep-1, abs_y+1, ld, ld-2, gw->pstyle->background);
gdispGDrawBox(gw->g.display, abs_x+ep, abs_y, ld, ld, pcol->edge);
gdispGFillArea(gw->g.display, gw->g.x+ep-1, gw->g.y+1, ld, ld-2, gw->pstyle->background);
gdispGDrawBox(gw->g.display, gw->g.x+ep, gw->g.y, ld, ld, pcol->edge);
df = ld < 4 ? 1 : 2;
if (gw->g.flags & GCHECKBOX_FLG_CHECKED)
gdispGFillArea(gw->g.display, abs_x+ep+df, abs_y+df, ld-2*df, ld-2*df, pcol->fill);
gdispGFillArea(gw->g.display, gw->g.x+ep+df, gw->g.y+df, ld-2*df, ld-2*df, pcol->fill);
gdispGFillStringBox(gw->g.display, abs_x, abs_y, ep-1, gw->g.height, gw->text, gw->g.font, pcol->text, gw->pstyle->background, justifyRight);
gdispGFillStringBox(gw->g.display, gw->g.x, gw->g.y, ep-1, gw->g.height, gw->text, gw->g.font, pcol->text, gw->pstyle->background, justifyRight);
#undef gcw
}

View File

@ -274,22 +274,6 @@ bool_t gwinGetEnabled(GHandle gh) {
#endif
}
void gwinGetAbsoluteCoordinates(GHandle gh, coord_t *x, coord_t *y) {
#if GWIN_NEED_HIERARCHY
GHandle tmp;
// sum up all relative coordinates up to the root parent
for (*x = 0, *y = 0, tmp = gh; tmp; tmp = tmp->parent) {
*x += tmp->x;
*y += tmp->y;
}
#else
*x = gh->x;
*y = gh->y;
#endif
}
void gwinMove(GHandle gh, coord_t x, coord_t y) {
_gwm_redim(gh, x, y, gh->width, gh->height);
}
@ -335,14 +319,14 @@ void gwinRedraw(GHandle gh) {
parent->child = child;
}
#if GDISP_NEED_CLIP
gdispGSetClip(child->display, child->x, child->y, child->width, child->height);
#endif
gdispGFillArea(child->display, child->x, child->y, child->width, child->height, child->bgcolor);
#if GDISP_NEED_CLIP
gdispGUnsetClip(child->display);
#endif
// clear the area of the current child position as it will be moved
gwinClear(child);
// window coordinates until now are relative, make them absolute now.
child->x += parent->x;
child->y += parent->y;
// redraw the window
gwinClear(parent);
gwinRedraw(parent);
}