Scrollable working - now to make it a container.

This commit is contained in:
Scott Duensing 2022-07-16 18:33:34 -05:00
parent b27ef131c7
commit f1878955e5
8 changed files with 42 additions and 28 deletions

View file

@ -63,7 +63,6 @@ static void guiDeleteListProcess(void) {
_deleteList[0]->reg->destroy(_deleteList[0]); _deleteList[0]->reg->destroy(_deleteList[0]);
arrdel(_deleteList, 0); arrdel(_deleteList, 0);
} }
arrfree(_deleteList);
} }
@ -126,7 +125,9 @@ void guiShutdown(void) {
uint8_t i; uint8_t i;
wmShutdown(); wmShutdown();
guiDeleteListProcess(); guiDeleteListProcess();
arrfree(_deleteList);
DEL(__guiBaseColors); DEL(__guiBaseColors);

View file

@ -87,7 +87,8 @@ CheckboxT *checkboxCreate(char *label, uint8_t value, ...) {
static void checkboxDestroy(struct WidgetS *widget, ...) { static void checkboxDestroy(struct WidgetS *widget, ...) {
CheckboxT *c = (CheckboxT *)widget; CheckboxT *c = (CheckboxT *)widget;
widgetDestroy(W(c->label)); // Do not destroy label here - the parent owns it at this point.
DEL(c); DEL(c);
} }
@ -104,8 +105,11 @@ static void checkboxPaint(struct WidgetS *widget, ...) {
// Paint checkbox. // 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); 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); 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. // Finish initializing.
widgetPaintManually(W(c->label), c->base.r.x + w, c->base.r.y); if (!c->attached) {
c->attached = 1;
windowWidgetAdd(c->base.parent, c->base.r.x + w, c->base.r.y, W(c->label));
}
} }
} }

View file

@ -34,6 +34,7 @@
typedef struct CheckboxS { typedef struct CheckboxS {
WidgetT base; // Required by all widgets. WidgetT base; // Required by all widgets.
LabelT *label; // Label to display text. LabelT *label; // Label to display text.
uint8_t attached; // Have we attached the label?
ClickHandlerT handler; // Actual event handler. ClickHandlerT handler; // Actual event handler.
uint8_t value; // Is theis checkbox selected? uint8_t value; // Is theis checkbox selected?
} CheckboxT; } CheckboxT;

View file

@ -89,7 +89,8 @@ RadioT *radioCreate(char *label, uint8_t group, uint8_t value, ...) {
static void radioDestroy(struct WidgetS *widget, ...) { static void radioDestroy(struct WidgetS *widget, ...) {
RadioT *r = (RadioT *)widget; RadioT *r = (RadioT *)widget;
widgetDestroy(W(r->label)); // Do not destroy label here - the parent owns it at this point.
DEL(r); DEL(r);
} }
@ -141,8 +142,11 @@ static void radioPaint(struct WidgetS *widget, ...) {
i += d; i += d;
} }
// Paint label. // Finish initializing.
widgetPaintManually(W(r->label), r->base.r.x + w, r->base.r.y); if (!r->attached) {
r->attached = 1;
windowWidgetAdd(r->base.parent, r->base.r.x + w, r->base.r.y, W(r->label));
}
} }
} }

View file

@ -34,6 +34,7 @@
typedef struct RadioS { typedef struct RadioS {
WidgetT base; // Required by all widgets. WidgetT base; // Required by all widgets.
LabelT *label; // Label to display text. LabelT *label; // Label to display text.
uint8_t attached; // Have we attached the label?
ClickHandlerT handler; // Actual event handler. ClickHandlerT handler; // Actual event handler.
uint8_t value; // Is this radio button selected? uint8_t value; // Is this radio button selected?
uint8_t group; // Which group does this radio button belong to? uint8_t group; // Which group does this radio button belong to?

View file

@ -23,8 +23,7 @@
*/ */
#include "../image.h" #include "../wmwindow.h"
#include "scroll.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) { 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) { if (s->flags & SCROLLABLE_SCROLL_V) {
s->scrollv = vscrollCreate(height, scrollableClickHandler, NULL); s->scrollv = vscrollCreate(height, scrollableClickHandler, NULL);
vscrollRangeSet(s->scrollv, 0, totalHeight- 1); 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) { if (s->flags & SCROLLABLE_SCROLL_H) {
s->scrollh = hscrollCreate(width - w, scrollableClickHandler, NULL); 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, ...) { static void scrollableDestroy(struct WidgetS *widget, ...) {
ScrollableT *s = (ScrollableT *)widget; ScrollableT *s = (ScrollableT *)widget;
if (s->scrollh) widgetDestroy(W(s->scrollh)); // Do not destroy scroll bars here - the parent owns them at this point.
if (s->scrollv) widgetDestroy(W(s->scrollv)); if (s->area) surfaceDestroy(&s->area);
if (s->area) surfaceDestroy(&s->area);
DEL(s); DEL(s);
} }
@ -90,26 +89,28 @@ static void scrollableDestroy(struct WidgetS *widget, ...) {
static void scrollablePaint(struct WidgetS *widget, ...) { static void scrollablePaint(struct WidgetS *widget, ...) {
ScrollableT *s = (ScrollableT *)widget; ScrollableT *s = (ScrollableT *)widget;
int16_t width;
int16_t height;
if (widgetDirtyGet(widget)) { if (widgetDirtyGet(widget)) {
widgetDirtySet(widget, 0); widgetDirtySet(widget, 0);
// Find height and width of blittable area, based on presence of scrollbars. // Finish initializing?
if (s->scrollh) { if (s->sizes.x == 0 && s->sizes.y == 0) {
height = s->base.r.h - s->scrollh->base.r.h; if (s->scrollh) {
widgetPaintManually(W(s->scrollh), s->base.r.x, s->base.r.y + height); s->sizes.y = s->base.r.h - s->scrollh->base.r.h;
} else { s->base.r.h -= s->scrollh->base.r.h;
height = s->base.r.h; windowWidgetAdd(s->base.parent, s->base.r.x, s->base.r.y + s->sizes.y, W(s->scrollh));
} } else {
if (s->scrollv) { s->sizes.y = s->base.r.h;
width = s->base.r.w - s->scrollv->base.r.w; }
widgetPaintManually(W(s->scrollv), s->base.r.x + width, s->base.r.y); if (s->scrollv) {
} else { s->sizes.x = s->base.r.w - s->scrollv->base.r.w;
width = s->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. // 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);
} }
} }

View file

@ -45,6 +45,7 @@ typedef struct ScrollableS {
SurfaceT *area; // Scrollable area buffer. SurfaceT *area; // Scrollable area buffer.
HscrollT *scrollh; // Horizontal scroll bar. HscrollT *scrollh; // Horizontal scroll bar.
VscrollT *scrollv; // Vertical scroll bar. VscrollT *scrollv; // Vertical scroll bar.
PointT sizes; // Scroll bar width and height info.
uint8_t flags; // Flag bits. uint8_t flags; // Flag bits.
} ScrollableT; } ScrollableT;

View file

@ -872,6 +872,7 @@ void windowWidgetRemove(WindowT *window, WidgetT *widget) {
void wmShutdown(void) { void wmShutdown(void) {
uint16_t i; uint16_t i;
// Delete all windows.
for (i=0; i<arrlen(_windowList); i++) widgetDestroy(W(_windowList[i])); for (i=0; i<arrlen(_windowList); i++) widgetDestroy(W(_windowList[i]));
arrfree(_windowList); arrfree(_windowList);
} }