// 31 july 2015 #import "osxaltest.h" @implementation tBox { NSMutableArray *children; NSMutableArray *stretchy; NSView *sv; BOOL vertical; id parent; } - (id)tInitVertical:(BOOL)vert { self = [super init]; if (self) { self->children = [NSMutableArray new]; self->stretchy = [NSMutableArray new]; self->sv = nil; self->vertical = vert; self->parent = nil; } return self; } - (void)tAddControl:(id)c stretchy:(BOOL)s { if (self->sv != nil) [c tSetParent:self->parent addToView:self->sv]; [self->children addObject:c]; [self->stretchy addObject:[NSNumber numberWithBool:s]]; // TODO mark as needing relayout [self tRelayout]; } - (void)tSetParent:(id)p addToView:(NSView *)v { self->parent = p; self->sv = v; [self->children enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop) { id c; c = (id) obj; [c tSetParent:self->parent addToView:self->sv]; }]; [self tRelayout]; } - (void)tFillAutoLayout:(tAutoLayoutParams *)p { NSMutableArray *subhorz, *subvert; NSMutableArray *subhorzleft, *subhorzright; NSMutableArray *subverttop, *subvertbottom; uintmax_t *first; NSUInteger i; NSMutableString *out; tAutoLayoutParams pp; NSMutableArray *primaryin, *primaryout; NSMutableArray *secondaryin, *secondaryout; first = (uintmax_t *) malloc([self->children count] * sizeof (uintmax_t)); if (first == NULL) abort(); subhorz = [NSMutableArray new]; subhorzleft = [NSMutableArray new]; subhorzright = [NSMutableArray new]; subvert = [NSMutableArray new]; subverttop = [NSMutableArray new]; subvertbottom = [NSMutableArray new]; pp.horz = subhorz; pp.horzAttachLeft = subhorzleft; pp.horzAttachRight = subhorzright; pp.vert = subvert; pp.vertAttachTop = subverttop; pp.vertAttachBottom = subvertbottom; pp.views = p->views; pp.n = p->n; pp.stretchyVert = self->vertical; pp.firstStretchy = TRUE; for (i = 0; i < [self->children count]; i++) { id cur; NSNumber *isStretchy; first[i] = pp.n; cur = (id) [self->children objectAtIndex:i]; isStretchy = (NSNumber *) [self->stretchy objectAtIndex:i]; pp.stretchy = [isStretchy boolValue]; [cur tFillAutoLayout:&pp]; if (pp.stretchy && pp.firstStretchy) { pp.firstStretchy = FALSE; pp.stretchyTo = first[i]; } } p->n = pp.n; out = [NSMutableString new]; primaryin = subhorz; primaryout = p->horz; secondaryin = subvert; secondaryout = p->vert; if (self->vertical) { primaryin = subvert; primaryout = p->vert; secondaryin = subhorz; secondaryout = p->horz; } [primaryin enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop) { //TODO if (index != 0) //TODO [out appendString:@"-"]; [out appendString:((NSString *) obj)]; }]; [primaryout addObject:out]; [secondaryout addObjectsFromArray:secondaryin]; [subhorz release]; [subhorzleft release]; [subhorzright release]; [subvert release]; [subverttop release]; [subvertbottom release]; free(first); } // TODOs: // - lateral dimension: for each view of n+1, make other dimension next to first n // this way, subelement views get positioned right - (void)tRelayout { if (self->parent != nil) [self->parent tRelayout]; } @end