78 lines
1.9 KiB
C++
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);
|
|
}
|