// 19 november 2015 #include "uipriv_haiku.hpp" // singlechild.cpp is like child.c/child.m in the other ports, except it only handles single children with an optional margin. struct singleChild { uiControl *c; BView *view; BGroupLayout *box; BLayoutItem *item; BAlignment oldalign; }; struct singleChild *newSingleChild(uiControl *c, uiControl *parent, void (*attach)(void *, BLayoutItem *), void *attachTo) { struct singleChild *s; if (c == NULL) return NULL; s = uiNew(struct singleChild); s->c = c; s->view = (BView *) uiControlHandle(s->c); s->oldalign = s->view->ExplicitAlignment(); uiControlSetParent(s->c, parent); s->box = new BGroupLayout(B_HORIZONTAL, 0); // A BLayout cannot add BViews unless it itself is in a BView for app_server-related reasons (thanks Skipp_OSX in irc.freenode.net/#haiku) // TODO make this hook cleaner (*attach)(attachTo, s->box); s->view->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH, B_ALIGN_USE_FULL_HEIGHT)); s->item = s->box->AddView(s->view, 1.0); // and set it on the box as well // this way it fills the entire space s->box->SetExplicitAlignment(BAlignment(B_ALIGN_USE_FULL_WIDTH, B_ALIGN_USE_FULL_HEIGHT)); return s; } void singleChildRemove(struct singleChild *s) { s->box->RemoveItem(s->item); delete s->item; delete s->box; uiControlSetParent(s->c, NULL); s->view->SetExplicitAlignment(s->oldalign); uiFree(s); } void singleChildDestroy(struct singleChild *s) { uiControl *child; child = s->c; singleChildRemove(s); uiControlDestroy(child); } // this is of the box itself, not of the child // it is used to add the child to the parent layout BLayoutItem *singleChildLayoutItem(struct singleChild *s) { return s->box; } void singleChildUpdateState(struct singleChild *s) { controlUpdateState(s->c); } void singleChildSetMargined(struct singleChild *s, float inset) { s->box->SetInsets(inset, inset, inset, inset); }