From ebae310ff1a0b2f66ea403704eb1b8f038f708ab Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Sun, 2 Aug 2015 18:16:44 -0400 Subject: [PATCH] Fixed crashing. Made relayouts optional in tSetParent. Rewrote the tBox auto layout code a fair bit, thinking crashing was caused by stack overflow (it was not). --- redo/osxaltest/box.m | 82 ++++++++++++++++---------------------- redo/osxaltest/button.m | 5 ++- redo/osxaltest/osxaltest.h | 2 +- redo/osxaltest/spinbox.m | 4 +- redo/osxaltest/window.m | 2 +- 5 files changed, 42 insertions(+), 53 deletions(-) diff --git a/redo/osxaltest/box.m b/redo/osxaltest/box.m index 0575652a..2fe12753 100644 --- a/redo/osxaltest/box.m +++ b/redo/osxaltest/box.m @@ -25,14 +25,14 @@ - (void)tAddControl:(id)c stretchy:(BOOL)s { if (self->sv != nil) - [c tSetParent:self->parent addToView:self->sv]; + [c tSetParent:self addToView:self->sv relayout:NO]; [self->children addObject:c]; [self->stretchy addObject:[NSNumber numberWithBool:s]]; // TODO mark as needing relayout [self tRelayout]; } -- (void)tSetParent:(id)p addToView:(NSView *)v +- (void)tSetParent:(id)p addToView:(NSView *)v relayout:(BOOL)relayout { self->parent = p; self->sv = v; @@ -40,9 +40,10 @@ id c; c = (id) obj; - [c tSetParent:self->parent addToView:self->sv]; + [c tSetParent:self addToView:self->sv relayout:NO]; }]; - [self tRelayout]; + if (relayout) + [self tRelayout]; } // TODO MASSIVE CLEANUP and comments everywhere too @@ -53,14 +54,9 @@ NSMutableArray *subverttop, *subvertbottom; uintmax_t *first; NSUInteger i; - NSMutableString *out; tAutoLayoutParams pp; - NSMutableArray *primaryin, *primaryout; - BOOL primaryinstart, primaryinend; - NSMutableArray *primaryoutstart, *primaryoutend; - NSMutableArray *secondaryin, *secondaryout; - NSMutableArray *secondaryinstart, *secondaryinend; - NSMutableArray *secondaryoutstart, *secondaryoutend; + void (^buildPrimary)(NSMutableArray *in, BOOL first, BOOL last, + NSMutableArray *out, NSMutableArray *outstart, NSMutableArray *outend); first = (uintmax_t *) malloc([self->children count] * sizeof (uintmax_t)); if (first == NULL) @@ -109,44 +105,34 @@ } p->n = pp.n; - out = [NSMutableString new]; - primaryin = subhorz; - primaryinstart = p->horzFirst; - primaryinend = p->horzLast; - primaryout = p->horz; - primaryoutstart = p->horzAttachLeft; - primaryoutend = p->horzAttachRight; - secondaryin = subvert; - secondaryinstart = subverttop; - secondaryinend = subvertbottom; - secondaryout = p->vert; - secondaryoutstart = p->vertAttachTop; - secondaryoutend = p->vertAttachBottom; - if (self->vertical) { - primaryin = subvert; - primaryinstart = p->vertFirst; - primaryinend = p->vertLast; - primaryout = p->vert; - primaryoutstart = p->vertAttachTop; - primaryoutend = p->vertAttachBottom; - secondaryin = subhorz; - secondaryinstart = subhorzleft; - secondaryinend = subhorzright; - secondaryout = p->horz; - secondaryoutstart = p->horzAttachLeft; - secondaryoutend = p->horzAttachRight; - } - [primaryin enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop) { + buildPrimary = ^(NSMutableArray *in, BOOL first, BOOL last, + NSMutableArray *out, NSMutableArray *outstart, NSMutableArray *outend) { + NSMutableString *outstr; + + outstr = [NSMutableString new]; + [in enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop) { //TODO if (index != 0) -//TODO [out appendString:@"-"]; - [out appendString:((NSString *) obj)]; - }]; - [primaryout addObject:out]; - [primaryoutstart addObject:[NSNumber numberWithBool:primaryinstart]]; - [primaryoutend addObject:[NSNumber numberWithBool:primaryinend]]; - [secondaryout addObjectsFromArray:secondaryin]; - [secondaryoutstart addObjectsFromArray:secondaryinstart]; - [secondaryoutend addObjectsFromArray:secondaryinend]; +//TODO [outstr appendString:@"-"]; + [outstr appendString:((NSString *) obj)]; + }]; + [out addObject:outstr]; + [outstart addObject:[NSNumber numberWithBool:first]]; + [outend addObject:[NSNumber numberWithBool:last]]; + }; + + if (self->vertical) { + buildPrimary(subvert, p->vertFirst, p->vertLast, + p->vert, p->vertAttachTop, p->vertAttachBottom); + [p->horz addObjectsFromArray:subhorz]; + [p->horzAttachLeft addObjectsFromArray:subhorzleft]; + [p->horzAttachRight addObjectsFromArray:subhorzright]; + } else { + buildPrimary(subhorz, p->horzFirst, p->horzLast, + p->horz, p->horzAttachLeft, p->horzAttachRight); + [p->vert addObjectsFromArray:subvert]; + [p->vertAttachTop addObjectsFromArray:subverttop]; + [p->vertAttachBottom addObjectsFromArray:subvertbottom]; + } [subhorz release]; [subhorzleft release]; diff --git a/redo/osxaltest/button.m b/redo/osxaltest/button.m index bb8a1acf..47b462c4 100644 --- a/redo/osxaltest/button.m +++ b/redo/osxaltest/button.m @@ -23,11 +23,12 @@ return self; } -- (void)tSetParent:(id)p addToView:(NSView *)v +- (void)tSetParent:(id)p addToView:(NSView *)v relayout:(BOOL)relayout { self->parent = p; [v addSubview:self->b]; - [self tRelayout]; + if (relayout) + [self tRelayout]; } - (void)tFillAutoLayout:(tAutoLayoutParams *)p diff --git a/redo/osxaltest/osxaltest.h b/redo/osxaltest/osxaltest.h index e20abeb5..acb71f01 100644 --- a/redo/osxaltest/osxaltest.h +++ b/redo/osxaltest/osxaltest.h @@ -25,7 +25,7 @@ struct tAutoLayoutParams { @protocol tControl @required -- (void)tSetParent:(id)p addToView:(NSView *)v; +- (void)tSetParent:(id)p addToView:(NSView *)v relayout:(BOOL)relayout; - (void)tFillAutoLayout:(tAutoLayoutParams *)p; - (void)tRelayout; @end diff --git a/redo/osxaltest/spinbox.m b/redo/osxaltest/spinbox.m index c1bf010d..409b1a19 100644 --- a/redo/osxaltest/spinbox.m +++ b/redo/osxaltest/spinbox.m @@ -67,10 +67,12 @@ return self; } -- (void)tSetParent:(id)p addToView:(NSView *)v +- (void)tSetParent:(id)p addToView:(NSView *)v relayout:(BOOL)relayout { self->parent = p; [v addSubview:self->c]; + if (relayout) + [self tRelayout]; } - (void)tFillAutoLayout:(tAutoLayoutParams *)p diff --git a/redo/osxaltest/window.m b/redo/osxaltest/window.m index 66dcad5a..126c5754 100644 --- a/redo/osxaltest/window.m +++ b/redo/osxaltest/window.m @@ -23,7 +23,7 @@ - (void)tSetControl:(id)cc { self->c = cc; - [self->c tSetParent:self addToView:[self->w contentView]]; + [self->c tSetParent:self addToView:[self->w contentView] relayout:NO]; [self tRelayout]; }