Skip to content

Commit

Permalink
* Fix some bugs in absolute positioning and padding inside of inline …
Browse files Browse the repository at this point in the history
…elements
  • Loading branch information
joehewitt committed Apr 26, 2009
1 parent 77bbe00 commit 37fa4e0
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 39 deletions.
83 changes: 46 additions & 37 deletions src/TTStyledLayout.m
Expand Up @@ -82,6 +82,30 @@ - (void)offsetFrame:(TTStyledFrame*)frame by:(CGFloat)y {
}
}

- (void)expandLineWidth:(CGFloat)width {
_lineWidth += width;
TTStyledInlineFrame* inlineFrame = _inlineFrame;
while (inlineFrame) {
inlineFrame.width += width;
inlineFrame = inlineFrame.inlineParentFrame;
}
}

- (void)inflateLineHeight:(CGFloat)height {
if (height > _lineHeight) {
_lineHeight = height;
}
if (_inlineFrame) {
TTStyledInlineFrame* inlineFrame = _inlineFrame;
while (inlineFrame) {
if (height > inlineFrame.height) {
inlineFrame.height = height;
}
inlineFrame = inlineFrame.inlineParentFrame;
}
}
}

- (void)addFrame:(TTStyledFrame*)frame {
if (!_rootFrame) {
_rootFrame = [frame retain];
Expand Down Expand Up @@ -114,12 +138,6 @@ - (TTStyledFrame*)addContentFrame:(TTStyledFrame*)frame width:(CGFloat)width {
_lineFirstFrame = frame;
}
_x += width;

TTStyledInlineFrame* inlineFrame = _inlineFrame;
while (inlineFrame) {
inlineFrame.width += width;
inlineFrame = inlineFrame.inlineParentFrame;
}
return frame;
}

Expand All @@ -128,6 +146,11 @@ - (void)addContentFrame:(TTStyledFrame*)frame width:(CGFloat)width height:(CGFlo
[self addContentFrame:frame width:width];
}

- (void)addAbsoluteFrame:(TTStyledFrame*)frame width:(CGFloat)width height:(CGFloat)height {
frame.bounds = CGRectMake(_x, _height, width, height);
[self addFrame:frame];
}

- (TTStyledInlineFrame*)addInlineFrame:(TTStyle*)style element:(TTStyledElement*)element
width:(CGFloat)width height:(CGFloat)height {
TTStyledInlineFrame* frame = [[[TTStyledInlineFrame alloc] initWithElement:element] autorelease];
Expand Down Expand Up @@ -349,13 +372,7 @@ - (void)layoutElement:(TTStyledElement*)elt {
}
_width -= padding.padding.left+padding.padding.right;
_x += padding.padding.left;
_lineWidth += padding.padding.left;

TTStyledInlineFrame* inlineFrame = _inlineFrame;
while (inlineFrame) {
inlineFrame.width += padding.padding.left;
inlineFrame = inlineFrame.inlineParentFrame;
}
[self expandLineWidth:padding.padding.left];

if (isBlock) {
_height += padding.padding.top;
Expand Down Expand Up @@ -386,7 +403,6 @@ - (void)layoutElement:(TTStyledElement*)elt {
_height += padding.margin.bottom;
}
} else if (!isBlock && style) {
//_inlineFrame.height += _lineHeight;
if (padding) {
_x += padding.padding.right + padding.margin.right;
_lineWidth += padding.padding.right + padding.margin.right;
Expand All @@ -413,21 +429,6 @@ - (void)layoutElement:(TTStyledElement*)elt {
}
}

- (void)inflateLineHeight:(CGFloat)height {
if (height > _lineHeight) {
_lineHeight = height;
}
if (_inlineFrame) {
TTStyledInlineFrame* inlineFrame = _inlineFrame;
while (inlineFrame) {
if (height > inlineFrame.height) {
inlineFrame.height = height;
}
inlineFrame = inlineFrame.inlineParentFrame;
}
}
}

- (void)layoutImage:(TTStyledImageNode*)imageNode container:(TTStyledElement*)element {
UIImage* image = imageNode.image;
if (!image && imageNode.url) {
Expand All @@ -446,13 +447,13 @@ - (void)layoutImage:(TTStyledImageNode*)imageNode container:(TTStyledElement*)el
CGFloat contentWidth = imageWidth;
CGFloat contentHeight = imageHeight;

if (padding) {
if (padding && padding.position != TTPositionAbsolute) {
_x += padding.margin.left;
contentWidth += padding.margin.left + padding.margin.right;
contentHeight += padding.margin.top + padding.margin.bottom;
}

if (!padding.position && (_lineWidth + contentWidth > _width)) {
if ((!padding || !padding.position) && (_lineWidth + contentWidth > _width)) {
if (_lineWidth) {
// The image will be placed on the next line, so create a new frame for
// the current line and mark it with a line break
Expand All @@ -465,12 +466,18 @@ - (void)layoutImage:(TTStyledImageNode*)imageNode container:(TTStyledElement*)el
TTStyledImageFrame* frame = [[[TTStyledImageFrame alloc] initWithElement:element
node:imageNode] autorelease];
frame.style = style;
[self addContentFrame:frame width:imageWidth height:imageHeight];

if (!padding.position) {
_lineWidth += contentWidth;
if (!padding || !padding.position) {
[self addContentFrame:frame width:imageWidth height:imageHeight];
[self expandLineWidth:contentWidth];
[self inflateLineHeight:contentHeight];
} else if (padding.position == TTPositionFloatRight) {
} else if (padding.position == TTPositionAbsolute) {
[self addAbsoluteFrame:frame width:imageWidth height:imageHeight];
frame.x += padding.margin.left;
frame.y += padding.margin.top;
} else if (padding.position == TTPositionFloatLeft) {
[self addContentFrame:frame width:imageWidth height:imageHeight];

frame.x += _floatLeftWidth;
_floatLeftWidth += contentWidth;
if (_height+contentHeight > _floatHeight) {
Expand All @@ -479,6 +486,8 @@ - (void)layoutImage:(TTStyledImageNode*)imageNode container:(TTStyledElement*)el
_minX += contentWidth;
_width -= contentWidth;
} else if (padding.position == TTPositionFloatRight) {
[self addContentFrame:frame width:imageWidth height:imageHeight];

frame.x += _width - (_floatRightWidth + contentWidth);
_floatRightWidth += contentWidth;
if (_height+contentHeight > _floatHeight) {
Expand All @@ -488,7 +497,7 @@ - (void)layoutImage:(TTStyledImageNode*)imageNode container:(TTStyledElement*)el
_width -= contentWidth;
}

if (padding) {
if (padding && padding.position != TTPositionAbsolute) {
frame.y += padding.margin.top;
_x += padding.margin.right;
}
Expand Down Expand Up @@ -565,7 +574,7 @@ - (void)layoutText:(TTStyledTextNode*)textNode container:(TTStyledElement*)eleme
}

frameWidth += wordSize.width;
_lineWidth += wordSize.width;
[self expandLineWidth:wordSize.width];
[self inflateLineHeight:wordSize.height];

index = wordRange.location + wordRange.length;
Expand Down
9 changes: 8 additions & 1 deletion src/TTStyledText.m
Expand Up @@ -103,8 +103,15 @@ - (void)loadImages {
// NSObject

- (id)initWithNode:(TTStyledNode*)rootNode {
if (self = [super init]) {
if (self = [self init]) {
_rootNode = [rootNode retain];
}
return self;
}

- (id)init {
if (self = [super init]) {
_rootNode = nil;
_rootFrame = nil;
_font = nil;
_width = 0;
Expand Down
1 change: 0 additions & 1 deletion src/TTTableFieldCell.m
Expand Up @@ -198,7 +198,6 @@ + (CGFloat)tableView:(UITableView*)tableView rowHeightForItem:(id)item {
- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString*)identifier {
if (self = [super initWithFrame:frame reuseIdentifier:identifier]) {
_label = [[TTStyledTextLabel alloc] initWithFrame:CGRectZero];
//_label.contentInset = UIEdgeInsetsMake(kVPadding, kHPadding, kVPadding, kHPadding);
[self.contentView addSubview:_label];
}
return self;
Expand Down

0 comments on commit 37fa4e0

Please sign in to comment.