}
// }}}
+static void $drawLabel$(NSString *label, CGRect rect, NSString *style, NSString *custom) {
+ bool ellipsis(false);
+ float max = rect.size.width - 11, width;
+ width:
+ width = [(ellipsis ? [label stringByAppendingString:@"..."] : label) sizeWithStyle:style forWidth:320].width;
+
+ if (width > max) {
+ size_t length([label length]);
+ float spacing((width - max) / (length - 1));
+
+ if (spacing > 1.25) {
+ ellipsis = true;
+ label = [label substringToIndex:(length - 1)];
+ goto width;
+ }
+
+ style = [style stringByAppendingString:[NSString stringWithFormat:@"letter-spacing: -%f; ", spacing]];
+ }
+
+ if (ellipsis)
+ label = [label stringByAppendingString:@"..."];
+
+ if (custom != nil)
+ style = [style stringByAppendingString:custom];
+
+ CGSize size = [label sizeWithStyle:style forWidth:rect.size.width];
+ [label drawAtPoint:CGPointMake((rect.size.width - size.width) / 2 + rect.origin.x, rect.origin.y) withStyle:style];
+}
+
static struct WBStringDrawingState {
WBStringDrawingState *next_;
unsigned count_;
NSString *info_;
} *stringDrawingState_;
-MSInstanceMessageHook6(CGSize, NSString, drawAtPoint,forWidth,withFont,lineBreakMode,letterSpacing,includeEmoji, CGPoint, point, float, width, UIFont *, font, int, mode, float, spacing, BOOL, emoji) {
+MSInstanceMessageHook6(CGSize, NSString, drawAtPoint,forWidth,withFont,lineBreakMode,letterSpacing,includeEmoji, CGPoint, point, float, width, UIFont *, font, UILineBreakMode, mode, float, spacing, BOOL, emoji) {
+ //NSLog(@"XXX: @\"%@\" %g", self, spacing);
+
WBStringDrawingState *state(stringDrawingState_);
if (state == NULL)
return MSOldCall(point, width, font, mode, spacing, emoji);
return CGSizeZero;
}
-MSInstanceMessageHook6(CGSize, NSString, drawInRect,withFont,lineBreakMode,alignment,lineSpacing,includeEmoji, CGRect, rect, UIFont *, font, int, mode, int, alignment, float, spacing, BOOL, emoji) {
+extern "C" NSString *NSStringFromCGRect(CGRect rect);
+
+MSInstanceMessageHook7(CGSize, NSString, _drawInRect,withFont,lineBreakMode,alignment,lineSpacing,includeEmoji,truncationRect, CGRect, rect, UIFont *, font, UILineBreakMode, mode, UITextAlignment, alignment, float, spacing, BOOL, emoji, CGRect, truncation) {
+ //NSLog(@"XXX: &\"%@\" %@ \"%@\" %u %u %g %u %@", self, NSStringFromCGRect(rect), font, mode, alignment, spacing, emoji, NSStringFromCGRect(truncation));
+
WBStringDrawingState *state(stringDrawingState_);
if (state == NULL)
- return MSOldCall(rect, font, mode, alignment, spacing, emoji);
+ return MSOldCall(rect, font, mode, alignment, spacing, emoji, truncation);
if (--state->count_ == 0)
stringDrawingState_ = state->next_;
if (state->info_ == nil)
- return MSOldCall(rect, font, mode, alignment, spacing, emoji);
+ return MSOldCall(rect, font, mode, alignment, spacing, emoji, truncation);
NSString *info([Info_ objectForKey:state->info_]);
if (info == nil)
- return MSOldCall(rect, font, mode, alignment, spacing, emoji);
+ return MSOldCall(rect, font, mode, alignment, spacing, emoji, truncation);
+
+ NSString *textAlign;
+ switch (alignment) {
+ default:
+ case UITextAlignmentLeft:
+ textAlign = @"left";
+ break;
+ case UITextAlignmentCenter:
+ textAlign = @"center";
+ break;
+ case UITextAlignmentRight:
+ textAlign = @"right";
+ break;
+ }
NSString *base(state->base_ ?: @"");
- NSString *align(@"text-align: center");
- [self drawInRect:rect withStyle:[NSString stringWithFormat:@"%@;%@;%@;%@", [font markupDescription], align, base, info]];
+ NSString *extra([NSString stringWithFormat:@"text-align: %@", textAlign]);
+
+ if (true)
+ $drawLabel$(self, rect, [NSString stringWithFormat:@"%@;%@", [font markupDescription], base], info);
+ else
+ [self drawInRect:rect withStyle:[NSString stringWithFormat:@"%@;%@;%@;%@", [font markupDescription], extra, base, info]];
+
return CGSizeZero;
}
-MSInstanceMessageHook4(CGSize, NSString, sizeWithFont,forWidth,lineBreakMode,letterSpacing, UIFont *, font, float, width, int, mode, float, spacing) {
+MSInstanceMessageHook4(CGSize, NSString, sizeWithFont,forWidth,lineBreakMode,letterSpacing, UIFont *, font, float, width, UILineBreakMode, mode, float, spacing) {
+ //NSLog(@"XXX: #\"%@\" \"%@\" %g %u %g", self, font, width, mode, spacing);
+
WBStringDrawingState *state(stringDrawingState_);
if (state == NULL)
return MSOldCall(font, width, mode, spacing);
}
MSInstanceMessageHook1(CGSize, NSString, sizeWithFont, UIFont *, font) {
+ //NSLog(@"XXX: ?\"%@\"", self);
+
WBStringDrawingState *state(stringDrawingState_);
if (state == NULL)
return MSOldCall(font);
WBDelegate(time_)
-- (CGSize) drawAtPoint:(CGPoint)point forWidth:(float)width withFont:(UIFont *)font lineBreakMode:(int)mode {
+- (CGSize) drawAtPoint:(CGPoint)point forWidth:(float)width withFont:(UIFont *)font lineBreakMode:(UILineBreakMode)mode {
if (NSString *custom = [Info_ objectForKey:@"TimeStyle"]) {
BOOL &_mode(MSHookIvar<BOOL>(view_, "_mode"));;
WBDelegate(badge_)
-- (CGSize) drawAtPoint:(CGPoint)point forWidth:(float)width withFont:(UIFont *)font lineBreakMode:(int)mode {
+- (CGSize) drawAtPoint:(CGPoint)point forWidth:(float)width withFont:(UIFont *)font lineBreakMode:(UILineBreakMode)mode {
if (NSString *custom = [Info_ objectForKey:@"BadgeStyle"]) {
[badge_ drawAtPoint:point withStyle:[NSString stringWithFormat:@""
"font-family: Helvetica; "
// }}}
MSInstanceMessage1(void, SBIconLabel, drawRect, CGRect, rect) {
- CGRect bounds = [self bounds];
-
static Ivar drawMoreLegibly = object_getInstanceVariable(self, "_drawMoreLegibly", NULL);
int docked;
else if (docked)
style = [style stringByAppendingString:@"text-shadow: rgba(0, 0, 0, 0.5) 0px -1px 0px; "];
- bool ellipsis(false);
- float max = [self frame].size.width - 11, width;
- width:
- width = [(ellipsis ? [label stringByAppendingString:@"..."] : label) sizeWithStyle:style forWidth:320].width;
-
- if (width > max) {
- size_t length([label length]);
- float spacing((width - max) / (length - 1));
-
- if (spacing > 1.25) {
- ellipsis = true;
- label = [label substringToIndex:(length - 1)];
- goto width;
- }
-
- style = [style stringByAppendingString:[NSString stringWithFormat:@"letter-spacing: -%f; ", spacing]];
- }
-
- if (ellipsis)
- label = [label stringByAppendingString:@"..."];
-
- if (NSString *custom = [Info_ objectForKey:(docked ? @"DockedIconLabelStyle" : @"UndockedIconLabelStyle")])
- style = [style stringByAppendingString:custom];
+ NSString *custom([Info_ objectForKey:(docked ? @"DockedIconLabelStyle" : @"UndockedIconLabelStyle")]);
- CGSize size = [label sizeWithStyle:style forWidth:bounds.size.width];
- [label drawAtPoint:CGPointMake((bounds.size.width - size.width) / 2, 0) withStyle:style];
+ $drawLabel$(label, [self bounds], style, custom);
}
MSInstanceMessage0(CGImageRef, SBIconLabel, buildLabelImage) {
stringDrawingState_ = &labelState;
+ //NSLog(@"XXX: +");
CGImageRef image(MSOldCall());
+ //NSLog(@"XXX: -");
stringDrawingState_ = NULL;
return image;
WKSetCurrentGraphicsContext(UIGraphicsGetCurrentContext());
if (style == nil || [style length] == 0)
style = @"font-family: Helvetica; font-size: 12px";
+ //NSLog(@"XXX:draw(%@)", [style stringByReplacingOccurrencesOfString:@"\n" withString:@" "]);
return [[WBMarkup sharedMarkup] drawString:self atPoint:point withStyle:style];
}
static CGSize NSString$sizeWithStyle$forWidth$(NSString *self, SEL _cmd, NSString *style, float width) {
if (style == nil || [style length] == 0)
style = @"font-family: Helvetica; font-size: 12px";
+ //NSLog(@"XXX:size(%@)", [style stringByReplacingOccurrencesOfString:@"\n" withString:@" "]);
return [[WBMarkup sharedMarkup] sizeOfString:self withStyle:style forWidth:width];
}