diff --git a/redo/reredo/control.c b/redo/reredo/control.c index 22828a52..c713dc17 100644 --- a/redo/reredo/control.c +++ b/redo/reredo/control.c @@ -35,6 +35,13 @@ uintptr_t uiControlHandle(uiControl *c) return (*(c->Handle))(c); } +uiControl *uiControlParent(uiControl *c) +{ + struct controlBase *cb = controlBase(c); + + return cb->parent; +} + static void controlUpdateState(uiControl *); void uiControlSetParent(uiControl *c, uiControl *parent) diff --git a/redo/reredo/darwin/box.m b/redo/reredo/darwin/box.m index 24dc7a6b..435738ea 100644 --- a/redo/reredo/darwin/box.m +++ b/redo/reredo/darwin/box.m @@ -190,6 +190,13 @@ static void relayout(uiBox *b) [metrics release]; [views release]; + + uiDarwinControlRelayoutParent(uiControl(b)); +} + +static void boxRelayout(uiDarwinControl *c) +{ + relayout(uiBox(c)); } void uiBoxAppend(uiBox *b, uiControl *c, int stretchy) @@ -274,6 +281,7 @@ static uiBox *finishNewBox(BOOL vertical) setHuggingPri(b->noStretchyView, NSLayoutPriorityDefaultLow, NSLayoutConstraintOrientationVertical); uiDarwinFinishNewControl(b, uiBox); + uiDarwinControl(b)->Relayout = boxRelayout; return b; } diff --git a/redo/reredo/darwin/control.m b/redo/reredo/darwin/control.m index 62bad8bc..b8cf3e74 100644 --- a/redo/reredo/darwin/control.m +++ b/redo/reredo/darwin/control.m @@ -10,6 +10,16 @@ uintmax_t uiDarwinControlType(void) return type_uiDarwinControl; } +void uiDarwinControlRelayoutParent(uiDarwinControl *c) +{ + uiControl *p; + + p = uiControlParent(uiControl(c)); + if (p == NULL) + return; + (*(uiDarwinControl(p)->Relayout))(p); +} + void osCommitShow(uiControl *c) { NSView *view; diff --git a/redo/reredo/ui.h b/redo/reredo/ui.h index c629b8a4..f7b96635 100644 --- a/redo/reredo/ui.h +++ b/redo/reredo/ui.h @@ -61,6 +61,7 @@ _UI_EXTERN uintmax_t uiControlType(void); #define uiControl(this) ((uiControl *) uiIsA((this), uiControlType(), 1)) _UI_EXTERN void uiControlDestroy(uiControl *); _UI_EXTERN uintptr_t uiControlHandle(uiControl *); +_UI_EXTERN uiControl *uiControlParent(uiControl *); _UI_EXTERN void uiControlSetParent(uiControl *, uiControl *); _UI_EXTERN void uiControlShow(uiControl *); _UI_EXTERN void uiControlHide(uiControl *); diff --git a/redo/reredo/ui_darwin.h b/redo/reredo/ui_darwin.h index 92ac04ac..75bd2ed5 100644 --- a/redo/reredo/ui_darwin.h +++ b/redo/reredo/ui_darwin.h @@ -10,8 +10,12 @@ This file assumes that you have imported and "ui.h" beforehand. typedef struct uiDarwinControl uiDarwinControl; struct uiDarwinControl { uiControl c; + void (*Relayout)(uiControl *); }; _UI_EXTERN uintmax_t uiDarwinControlType(void); +#define uiDarwinControl(this) ((uiDarwinControl *) uiIsA((this), uiDarwinControlType(), 1)) +// TODO document +_UI_EXTERN void uiDarwinControlRelayoutParent(uiDarwinControl *); // TODO document #define uiDarwinDefineControlWithOnDestroy(type, typefn, handlefield, onDestroy) \ @@ -35,6 +39,10 @@ _UI_EXTERN uintmax_t uiDarwinControlType(void); static void _ ## type ## ContainerUpdateState(uiControl *c) \ { \ /* do nothing */ \ + } \ + static void _ ## type ## Relayout(uiControl *c) \ + { \ + uiDarwinControlRelayoutParent(uiDarwinControl(c)); \ } #define uiDarwinDefineControl(type, typefn, handlefield) \ @@ -44,6 +52,7 @@ _UI_EXTERN uintmax_t uiDarwinControlType(void); uiControl(variable)->CommitDestroy = _ ## type ## CommitDestroy; \ uiControl(variable)->Handle = _ ## type ## Handle; \ uiControl(variable)->ContainerUpdateState = _ ## type ## ContainerUpdateState; \ + uiDarwinControl(variable)->Relayout = _ ## type ## Relayout; \ uiDarwinFinishControl(uiControl(variable)); // This is a function used to set up a control.