diff --git a/common/controlsigs.h b/common/controlsigs.h index 944afa9b..2b505e4b 100644 --- a/common/controlsigs.h +++ b/common/controlsigs.h @@ -19,6 +19,8 @@ #define uiMultilineEntrySignature 0x4D6C6E45 #define uiProgressBarSignature 0x50426172 #define uiRadioButtonsSignature 0x5264696F +// I don't know how these should be generated, so here's the md5sum of "uiScrollView" +#define uiScrollViewSignature 0x5dcd9b83 #define uiSeparatorSignature 0x53657061 #define uiSliderSignature 0x536C6964 #define uiSpinboxSignature 0x5370696E diff --git a/examples/meson.build b/examples/meson.build index 3b9ab82a..fbd0843f 100644 --- a/examples/meson.build +++ b/examples/meson.build @@ -48,6 +48,9 @@ libui_examples = { 'datetime': { 'sources': ['datetime/main.c'], }, + 'scrolling': { + 'sources': ['scrolling/main.c'], + }, } foreach name, args : libui_examples # TODO once we upgrade to 0.49.0, add pie: true diff --git a/examples/scrolling/main.c b/examples/scrolling/main.c new file mode 100644 index 00000000..7d200ecb --- /dev/null +++ b/examples/scrolling/main.c @@ -0,0 +1,39 @@ +#include "../../ui.h" +#include +#include + +int onClosing(uiWindow *w, void *data) +{ + uiQuit(); + return 1; +} + +int main(void) +{ + uiInitOptions o; + uiWindow *w; + uiScrollView *s; + uiBox *box; + + memset(&o, 0, sizeof (uiInitOptions)); + if (uiInit(&o) != NULL) + abort(); + + w = uiNewWindow("Scrolling", 320, 240, 0); + s = uiNewScrollView(); + box = uiNewVerticalBox(); + uiScrollViewSetChild(s, uiControl(box)); + uiScrollViewSetMargined(s, 1); + uiBoxSetPadded(box, 1); + + for (int i = 0; i < 32; i++) { + uiButton *btn = uiNewButton("Button"); + uiBoxAppend(box, uiControl(btn), 0); + } + + uiWindowOnClosing(w, onClosing, NULL); + uiWindowSetChild(w, uiControl(s)); + uiControlShow(uiControl(w)); + uiMain(); + return 0; +} diff --git a/examples/scrolling/unix.png b/examples/scrolling/unix.png new file mode 100644 index 00000000..11de3705 Binary files /dev/null and b/examples/scrolling/unix.png differ diff --git a/ui.h b/ui.h index 40aea949..b25a49bc 100644 --- a/ui.h +++ b/ui.h @@ -297,6 +297,13 @@ _UI_EXTERN char *uiSaveFile(uiWindow *parent); _UI_EXTERN void uiMsgBox(uiWindow *parent, const char *title, const char *description); _UI_EXTERN void uiMsgBoxError(uiWindow *parent, const char *title, const char *description); +typedef struct uiScrollView uiScrollView; +#define uiScrollView(this) ((uiScrollView *) (this)) +_UI_EXTERN uiScrollView *uiNewScrollView(); +_UI_EXTERN void uiScrollViewSetChild(uiScrollView *v, uiControl *child); +_UI_EXTERN int uiScrollViewMargined(uiScrollView *v); +_UI_EXTERN void uiScrollViewSetMargined(uiScrollView *v, int margined); + typedef struct uiArea uiArea; typedef struct uiAreaHandler uiAreaHandler; typedef struct uiAreaDrawParams uiAreaDrawParams; diff --git a/unix/meson.build b/unix/meson.build index f8004fbd..a3f3eb01 100644 --- a/unix/meson.build +++ b/unix/meson.build @@ -35,6 +35,7 @@ libui_sources += [ 'unix/opentype.c', 'unix/progressbar.c', 'unix/radiobuttons.c', + 'unix/scrollview.c', 'unix/separator.c', 'unix/slider.c', 'unix/spinbox.c', diff --git a/unix/scrollview.c b/unix/scrollview.c new file mode 100644 index 00000000..f78bbaa9 --- /dev/null +++ b/unix/scrollview.c @@ -0,0 +1,57 @@ +// 9 september 2021 + +#include "uipriv_unix.h" + +struct uiScrollView { + uiUnixControl c; + GtkWidget *widget; + GtkScrolledWindow *scroll; + GtkContainer *container; + + uiprivChild *child; + + int margined; +}; + +uiUnixControlAllDefaultsExceptDestroy(uiScrollView) + +void uiScrollViewDestroy(uiControl *c) +{ + uiScrollView *v = uiScrollView(c); + + if (v->child != NULL) + uiprivChildDestroy(v->child); + g_object_unref(v->widget); + uiFreeControl(c); +} + +void uiScrollViewSetChild(uiScrollView *v, uiControl *child) +{ + if (v->child != NULL) + uiprivChildRemove(v->child); + v->child = uiprivNewChildWithBox(child, uiControl(v), v->container, v->margined); +} + +int uiScrollViewMargined(uiScrollView *v) +{ + return v->margined; +} + +void uiScrollViewSetMargined(uiScrollView *v, int margined) +{ + v->margined = margined; + if (v->child != NULL) + uiprivChildSetMargined(v->child, v->margined); +} + +uiScrollView *uiNewScrollView(void) +{ + uiScrollView *v; + + uiUnixNewControl(uiScrollView, v); + v->widget = gtk_scrolled_window_new(NULL, NULL); + v->scroll = GTK_SCROLLED_WINDOW(v->widget); + v->container = GTK_CONTAINER(v->widget); + + return v; +}