From 1040873d62cb87a06296436192b985f378342d3f Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Tue, 28 Apr 2015 16:38:33 -0400 Subject: [PATCH] Added OS X bin.m. --- new/darwin/GNUmakeinc.mk | 1 + new/darwin/bin.m | 109 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 new/darwin/bin.m diff --git a/new/darwin/GNUmakeinc.mk b/new/darwin/GNUmakeinc.mk index 8c363285..2c0e8c63 100644 --- a/new/darwin/GNUmakeinc.mk +++ b/new/darwin/GNUmakeinc.mk @@ -2,6 +2,7 @@ osMFILES = \ darwin/alloc.m \ + darwin/bin.m \ darwin/container.m \ darwin/init.m \ darwin/main.m \ diff --git a/new/darwin/bin.m b/new/darwin/bin.m new file mode 100644 index 00000000..caf1d8e0 --- /dev/null +++ b/new/darwin/bin.m @@ -0,0 +1,109 @@ +// 28 april 2015 +#import "uipriv_darwin.h" + +struct bin { + uiContainer c; + void (*baseDestroy)(uiControl *); + uiControl *mainControl; + intmax_t marginLeft; + intmax_t marginTop; + intmax_t marginRight; + intmax_t marginBottom; +}; + +void binDestroy(uiControl *c) +{ + struct bin *b = (struct bin *) c; + + // TODO find a way to move the parented check here + // don't chain up to base here; we need to destroy children ourselves first + if (b->mainControl != NULL) { + uiControlSetParent(b->mainControl, NULL); + uiControlDestroy(b->mainControl); + } + // NOW we can chain up to base + (*(b->baseDestroy))(uiControl(b)); + uiFree(b); +} + +void binPreferredSize(uiControl *c, uiSizing *d, intmax_t *width, intmax_t *height) +{ + struct bin *b = (struct bin *) c; + intmax_t marginX, marginY; + + // TODO have the margins count even if no control? + if (b->mainControl == NULL) { + *width = 0; + *height = 0; + return; + } + uiControlPreferredSize(b->mainControl, d, width, height); + marginX = b->marginLeft + b->marginRight; + marginY = b->marginTop + b->marginBottom; + *width += marginX; + *height += marginY; +} + +void binResizeChildren(uiContainer *c, intmax_t x, intmax_t y, intmax_t width, intmax_t height, uiSizing *d) +{ + struct bin *b = (struct bin *) c; + + if (b->mainControl == NULL) + return; + x += b->marginLeft; + y += b->marginTop; + width -= b->marginLeft + b->marginRight; + height -= b->marginTop + b->marginBottom; + uiControlResize(b->mainControl, x, y, width, height, d); +} + +uiContainer *newBin(void) +{ + struct bin *b; + + b = uiNew(struct bin); + + uiMakeContainer(uiContainer(b)); + + b->baseDestroy = uiControl(b)->Destroy; + uiControl(b)->Destroy = binDestroy; + uiControl(b)->PreferredSize = binPreferredSize; + + uiContainer(b)->ResizeChildren = binResizeChildren; + + return uiContainer(b); +} + +void binSetMainControl(uiContainer *c, uiControl *mainControl) +{ + struct bin *b = (struct bin *) c; + + if (b->mainControl != NULL) + uiControlSetParent(b->mainControl, NULL); + b->mainControl = mainControl; + if (b->mainControl != NULL) + uiControlSetParent(b->mainControl, uiContainer(b)); + uiContainerUpdate(uiContainer(b)); +} + +void binSetMargins(uiContainer *c, intmax_t left, intmax_t top, intmax_t right, intmax_t bottom) +{ + struct bin *b = (struct bin *) c; + + b->marginLeft = left; + b->marginRight = right; + b->marginTop = top; + b->marginBottom = bottom; + uiContainerUpdate(uiContainer(b)); +} + +void binSetParent(uiContainer *c, uintptr_t osParent) +{ + struct bin *b = (struct bin *) c; + NSView *view; + NSView *newContainer; + + view = (NSView *) uiControlHandle(uiControl(b)); + newContainer = (NSView *) osParent; + [newContainer addSubview:view]; +}