ref: 1890aeca379976e46deabb0ce844aefc8be1a2c5
dir: /n_hbox.c/
#include <u.h> #include <libc.h> #include <draw.h> #include <event.h> #include "nate_construct.h" #include "n_hbox.h" #define N_TYPE NHBox_Type char* NHBox_Type = "NHBox"; typedef struct csizep csizep; struct csizep { Rectangle crect; Rectangle frect; Image *screen; }; static void hbox_childsize(Nelem* nelem, int, void *aux) { csizep *p = (csizep*)aux; Rectangle r = ncallcalcsize(nelem, p->screen, p->crect); combinerect(&p->frect, r); p->crect.min.x = r.max.x; } static Rectangle hbox_calcsize(Nelem* nelem, Image* screen, Rectangle r) { csizep params; NHBox* b = (NHBox*)nelem; GUARD(b); params.screen = screen; params.crect = r; params.frect.min = r.min; params.frect.max.x = r.min.x; params.frect.max.y = b->autoheight ? r.min.y : r.max.y; lforeach(&b->children, hbox_childsize, ¶ms); nelem->r = params.frect; return nelem->r; } static void hbox_childdraw(Nelem* elem, int, void *aux) { ncalldraw(elem, (Image*)aux); } static void hbox_draw(Nelem* nelem, Image* img) { NHBox* b = (NHBox*)nelem; GUARD(b); lforeach(&b->children, hbox_childdraw, img); } static Nelemfunctions Nhboxfunctions = { .calcsize = hbox_calcsize, .draw = hbox_draw, }; DEF_SLOTFUNC(NHBox, hbox_slot); DEF_ACCESSOR_OneParam(NHBox, hbox_autoheight, int, autoheight); NHBox* New_HBox(char *name) { NHBox *b = MakeNelem(NHBox, NHBox_Type, &Nhboxfunctions, name, -1); b->Slot = hbox_slot; b->AutoHeight = hbox_autoheight; linit(&b->children); b->autoheight = 0; nc_push(b); return b; }