From 7080e121c428348a38619d88f14f8f54135b46dd Mon Sep 17 00:00:00 2001 From: swissChili Date: Thu, 9 Sep 2021 10:20:46 -0700 Subject: [PATCH] Add uiScrollView GTK implementation --- common/controlsigs.h | 2 ++ examples/meson.build | 3 ++ examples/scrolling/main.c | 39 ++++++++++++++++++++++++ examples/scrolling/unix.png | Bin 0 -> 20478 bytes ui.h | 7 +++++ unix/meson.build | 1 + unix/scrollview.c | 57 ++++++++++++++++++++++++++++++++++++ 7 files changed, 109 insertions(+) create mode 100644 examples/scrolling/main.c create mode 100644 examples/scrolling/unix.png create mode 100644 unix/scrollview.c 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 0000000000000000000000000000000000000000..11de3705ed2a98b433913f4cb126ef0c929deec2 GIT binary patch literal 20478 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 S#$%v>AIQS&DvDy_9{XRz+quO6 literal 0 HcmV?d00001 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; +}