libui/haiku/singlechild.cpp

78 lines
1.9 KiB
C++

// 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);
}