diff --git a/roo-e/src/gui/gui.c b/roo-e/src/gui/gui.c index 5128491..b180879 100644 --- a/roo-e/src/gui/gui.c +++ b/roo-e/src/gui/gui.c @@ -63,7 +63,6 @@ static void guiDeleteListProcess(void) { _deleteList[0]->reg->destroy(_deleteList[0]); arrdel(_deleteList, 0); } - arrfree(_deleteList); } @@ -126,7 +125,9 @@ void guiShutdown(void) { uint8_t i; wmShutdown(); + guiDeleteListProcess(); + arrfree(_deleteList); DEL(__guiBaseColors); diff --git a/roo-e/src/gui/widgets/checkbox.c b/roo-e/src/gui/widgets/checkbox.c index 7892109..3091c9f 100644 --- a/roo-e/src/gui/widgets/checkbox.c +++ b/roo-e/src/gui/widgets/checkbox.c @@ -87,7 +87,8 @@ CheckboxT *checkboxCreate(char *label, uint8_t value, ...) { static void checkboxDestroy(struct WidgetS *widget, ...) { CheckboxT *c = (CheckboxT *)widget; - widgetDestroy(W(c->label)); + // Do not destroy label here - the parent owns it at this point. + DEL(c); } @@ -104,8 +105,11 @@ static void checkboxPaint(struct WidgetS *widget, ...) { // Paint checkbox. surfaceBoxHighlight(c->base.r.x, c->base.r.y + 1, c->base.r.x + h, c->base.r.y + h, c->value ? GUI_BLACK : GUI_WHITE, c->value ? GUI_WHITE : GUI_BLACK); surfaceBoxFilled(c->base.r.x + 1, c->base.r.y + 2, c->base.r.x + h - 1, c->base.r.y + h - 1, c->value ? GUI_DARKGRAY : GUI_WHITE); - // Paint label. - widgetPaintManually(W(c->label), c->base.r.x + w, c->base.r.y); + // Finish initializing. + if (!c->attached) { + c->attached = 1; + windowWidgetAdd(c->base.parent, c->base.r.x + w, c->base.r.y, W(c->label)); + } } } diff --git a/roo-e/src/gui/widgets/checkbox.h b/roo-e/src/gui/widgets/checkbox.h index ba3e277..abbd5d0 100644 --- a/roo-e/src/gui/widgets/checkbox.h +++ b/roo-e/src/gui/widgets/checkbox.h @@ -34,6 +34,7 @@ typedef struct CheckboxS { WidgetT base; // Required by all widgets. LabelT *label; // Label to display text. + uint8_t attached; // Have we attached the label? ClickHandlerT handler; // Actual event handler. uint8_t value; // Is theis checkbox selected? } CheckboxT; diff --git a/roo-e/src/gui/widgets/radio.c b/roo-e/src/gui/widgets/radio.c index 2855bb3..b534eba 100644 --- a/roo-e/src/gui/widgets/radio.c +++ b/roo-e/src/gui/widgets/radio.c @@ -89,7 +89,8 @@ RadioT *radioCreate(char *label, uint8_t group, uint8_t value, ...) { static void radioDestroy(struct WidgetS *widget, ...) { RadioT *r = (RadioT *)widget; - widgetDestroy(W(r->label)); + // Do not destroy label here - the parent owns it at this point. + DEL(r); } @@ -141,8 +142,11 @@ static void radioPaint(struct WidgetS *widget, ...) { i += d; } - // Paint label. - widgetPaintManually(W(r->label), r->base.r.x + w, r->base.r.y); + // Finish initializing. + if (!r->attached) { + r->attached = 1; + windowWidgetAdd(r->base.parent, r->base.r.x + w, r->base.r.y, W(r->label)); + } } } diff --git a/roo-e/src/gui/widgets/radio.h b/roo-e/src/gui/widgets/radio.h index 57ea0f4..297366b 100644 --- a/roo-e/src/gui/widgets/radio.h +++ b/roo-e/src/gui/widgets/radio.h @@ -34,6 +34,7 @@ typedef struct RadioS { WidgetT base; // Required by all widgets. LabelT *label; // Label to display text. + uint8_t attached; // Have we attached the label? ClickHandlerT handler; // Actual event handler. uint8_t value; // Is this radio button selected? uint8_t group; // Which group does this radio button belong to? diff --git a/roo-e/src/gui/widgets/scroll.c b/roo-e/src/gui/widgets/scroll.c index 9a7287c..cecc7a7 100644 --- a/roo-e/src/gui/widgets/scroll.c +++ b/roo-e/src/gui/widgets/scroll.c @@ -23,8 +23,7 @@ */ -#include "../image.h" - +#include "../wmwindow.h" #include "scroll.h" @@ -37,6 +36,7 @@ static void scrollablePaint(struct WidgetS *widget, ...); static void scrollableClickHandler(WidgetT *widget, uint16_t x, uint16_t y, uint8_t event, void *data) { + logWrite("Event from scrollable\n"); } @@ -54,7 +54,7 @@ ScrollableT *scrollableCreate(int16_t width, int16_t height, int16_t totalWidth, if (s->flags & SCROLLABLE_SCROLL_V) { s->scrollv = vscrollCreate(height, scrollableClickHandler, NULL); vscrollRangeSet(s->scrollv, 0, totalHeight- 1); - w = s->scrollv->base.r.w; + w = s->scrollv->base.r.w; // Used when creating horizontal scroll bar below. } if (s->flags & SCROLLABLE_SCROLL_H) { s->scrollh = hscrollCreate(width - w, scrollableClickHandler, NULL); @@ -80,9 +80,8 @@ ScrollableT *scrollableCreate(int16_t width, int16_t height, int16_t totalWidth, static void scrollableDestroy(struct WidgetS *widget, ...) { ScrollableT *s = (ScrollableT *)widget; - if (s->scrollh) widgetDestroy(W(s->scrollh)); - if (s->scrollv) widgetDestroy(W(s->scrollv)); - if (s->area) surfaceDestroy(&s->area); + // Do not destroy scroll bars here - the parent owns them at this point. + if (s->area) surfaceDestroy(&s->area); DEL(s); } @@ -90,26 +89,28 @@ static void scrollableDestroy(struct WidgetS *widget, ...) { static void scrollablePaint(struct WidgetS *widget, ...) { ScrollableT *s = (ScrollableT *)widget; - int16_t width; - int16_t height; if (widgetDirtyGet(widget)) { widgetDirtySet(widget, 0); - // Find height and width of blittable area, based on presence of scrollbars. - if (s->scrollh) { - height = s->base.r.h - s->scrollh->base.r.h; - widgetPaintManually(W(s->scrollh), s->base.r.x, s->base.r.y + height); - } else { - height = s->base.r.h; - } - if (s->scrollv) { - width = s->base.r.w - s->scrollv->base.r.w; - widgetPaintManually(W(s->scrollv), s->base.r.x + width, s->base.r.y); - } else { - width = s->base.r.w; + // Finish initializing? + if (s->sizes.x == 0 && s->sizes.y == 0) { + if (s->scrollh) { + s->sizes.y = s->base.r.h - s->scrollh->base.r.h; + s->base.r.h -= s->scrollh->base.r.h; + windowWidgetAdd(s->base.parent, s->base.r.x, s->base.r.y + s->sizes.y, W(s->scrollh)); + } else { + s->sizes.y = s->base.r.h; + } + if (s->scrollv) { + s->sizes.x = s->base.r.w - s->scrollv->base.r.w; + s->base.r.w -= s->scrollv->base.r.w; + windowWidgetAdd(s->base.parent, s->base.r.x + s->sizes.x, s->base.r.y, W(s->scrollv)); + } else { + s->sizes.x = s->base.r.w; + } } // Blit. - surfaceBlit(s->base.r.x, s->base.r.y, s->offset.x, s->offset.y, width, height, s->area); + surfaceBlit(s->base.r.x, s->base.r.y, s->offset.x, s->offset.y, s->sizes.x, s->sizes.y, s->area); } } diff --git a/roo-e/src/gui/widgets/scroll.h b/roo-e/src/gui/widgets/scroll.h index fadd216..256fdfe 100644 --- a/roo-e/src/gui/widgets/scroll.h +++ b/roo-e/src/gui/widgets/scroll.h @@ -45,6 +45,7 @@ typedef struct ScrollableS { SurfaceT *area; // Scrollable area buffer. HscrollT *scrollh; // Horizontal scroll bar. VscrollT *scrollv; // Vertical scroll bar. + PointT sizes; // Scroll bar width and height info. uint8_t flags; // Flag bits. } ScrollableT; diff --git a/roo-e/src/gui/wmwindow.c b/roo-e/src/gui/wmwindow.c index 80834eb..3f5b148 100644 --- a/roo-e/src/gui/wmwindow.c +++ b/roo-e/src/gui/wmwindow.c @@ -872,6 +872,7 @@ void windowWidgetRemove(WindowT *window, WidgetT *widget) { void wmShutdown(void) { uint16_t i; + // Delete all windows. for (i=0; i