Wrote up a Bin for the Windows backend. Minor changes in uiBox too.
This commit is contained in:
parent
36789edde5
commit
28a632c5b6
|
@ -38,7 +38,7 @@ static void boxDestroy(uiControl *c)
|
||||||
}
|
}
|
||||||
uiFree(b->controls);
|
uiFree(b->controls);
|
||||||
// NOW we can chain up to base
|
// NOW we can chain up to base
|
||||||
(*(b->baseDestroy))(c);
|
(*(b->baseDestroy))(uiControl(b));
|
||||||
uiFree(b);
|
uiFree(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,5 +10,9 @@ extern void uiFree(void *);
|
||||||
|
|
||||||
extern void complain(const char *, ...);
|
extern void complain(const char *, ...);
|
||||||
|
|
||||||
|
extern uiContainer *newBin(void);
|
||||||
|
extern void binSetMainControl(uiContainer *, uiControl *);
|
||||||
|
extern void binSetMargins(uiContainer *, intmax_t, intmax_t, intmax_t, intmax_t);
|
||||||
|
|
||||||
// lifetimes.c
|
// lifetimes.c
|
||||||
extern void properlyDestroyControl(uiControl *);
|
extern void properlyDestroyControl(uiControl *);
|
||||||
|
|
|
@ -50,25 +50,6 @@ static void paintControlBackground(HWND hwnd, HDC dc)
|
||||||
logLastError("error resetting window origin in paintControlBackground()");
|
logLastError("error resetting window origin in paintControlBackground()");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void resize(uiControl *control, HWND parent, RECT r, RECT margin)
|
|
||||||
{
|
|
||||||
r.left += uiDlgUnitsToX(margin.left, sys.baseX);
|
|
||||||
r.top += uiDlgUnitsToY(margin.top, sys.baseY);
|
|
||||||
r.right -= uiDlgUnitsToX(margin.right, sys.baseX);
|
|
||||||
r.bottom -= uiDlgUnitsToY(margin.bottom, sys.baseY);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO make this a uiOSContainer directly
|
|
||||||
struct parent {
|
|
||||||
HWND hwnd;
|
|
||||||
uiControl *mainControl;
|
|
||||||
intmax_t marginLeft;
|
|
||||||
intmax_t marginTop;
|
|
||||||
intmax_t marginRight;
|
|
||||||
intmax_t marginBottom;
|
|
||||||
BOOL canDestroy;
|
|
||||||
};
|
|
||||||
|
|
||||||
static LRESULT CALLBACK parentWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
static LRESULT CALLBACK parentWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
uiOSContainer *p;
|
uiOSContainer *p;
|
||||||
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
// 27 april 2015
|
||||||
|
#include "uipriv_windows.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 = uiDlgUnitsToX(b->marginLeft, d->sys->baseX) + uiDlgUnitsToX(b->marginRight, d->sys->baseX);
|
||||||
|
marginY = uiDlgUnitsToY(b->marginTop, d->sys->baseY) + uiDlgUnitsToY(b->marginBottom, d->sys->baseY);
|
||||||
|
*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;
|
||||||
|
intmax_t marginLeft, marginTop;
|
||||||
|
|
||||||
|
if (b->mainControl == NULL)
|
||||||
|
return;
|
||||||
|
marginLeft = uiDlgUnitsToX(b->marginLeft, d->sys->baseX);
|
||||||
|
marginTop = uiDlgUnitsToY(b->marginTop, d->sys->baseY);
|
||||||
|
x += marginLeft;
|
||||||
|
y += marginTop;
|
||||||
|
width -= marginLeft + uiDlgUnitsToX(b->marginRight, d->sys->baseX);
|
||||||
|
height -= marginTop + uiDlgUnitsToY(b->marginBottom, d->sys->baseY);
|
||||||
|
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)->ControlResize = binControlResize;
|
||||||
|
|
||||||
|
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));
|
||||||
|
}
|
Loading…
Reference in New Issue