mirror of
https://github.com/danog/Telegram.git
synced 2024-12-03 09:57:46 +01:00
181 lines
5.5 KiB
Objective-C
181 lines
5.5 KiB
Objective-C
#import "TGReplyHeaderModel.h"
|
|
|
|
#import <CoreText/CoreText.h>
|
|
|
|
#import "TGModernColorViewModel.h"
|
|
#import "TGModernTextViewModel.h"
|
|
|
|
#import "TGUser.h"
|
|
#import "TGConversation.h"
|
|
|
|
#import "TGImageUtils.h"
|
|
#import "TGFont.h"
|
|
|
|
#import "TGReusableLabel.h"
|
|
|
|
@interface TGReplyHeaderModel ()
|
|
{
|
|
CGFloat _cachedLayoutWidth;
|
|
CGFloat _cachedLeftInset;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation TGReplyHeaderModel
|
|
|
|
static CTFontRef nameFont()
|
|
{
|
|
static CTFontRef font = nil;
|
|
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^
|
|
{
|
|
if (iosMajorVersion() >= 7) {
|
|
font = CTFontCreateWithFontDescriptor((__bridge CTFontDescriptorRef)[TGMediumSystemFontOfSize(14.0f) fontDescriptor], 0.0f, NULL);
|
|
} else {
|
|
UIFont *systemFont = TGMediumSystemFontOfSize(14.0f);
|
|
font = CTFontCreateWithName((__bridge CFStringRef)systemFont.fontName, systemFont.pointSize, nil);
|
|
}
|
|
});
|
|
|
|
return font;
|
|
}
|
|
|
|
static CTFontRef textFont()
|
|
{
|
|
static CTFontRef font = nil;
|
|
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^
|
|
{
|
|
if (iosMajorVersion() >= 7) {
|
|
font = CTFontCreateWithFontDescriptor((__bridge CTFontDescriptorRef)[TGSystemFontOfSize(14.0f) fontDescriptor], 0.0f, NULL);
|
|
} else {
|
|
UIFont *systemFont = TGSystemFontOfSize(14.0f);
|
|
font = CTFontCreateWithName((__bridge CFStringRef)systemFont.fontName, systemFont.pointSize, nil);
|
|
}
|
|
});
|
|
|
|
return font;
|
|
}
|
|
|
|
static UIColor *colorForTitle(bool incoming)
|
|
{
|
|
static UIColor *incomingColor = nil;
|
|
static UIColor *outgoingColor = nil;
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^
|
|
{
|
|
incomingColor = UIColorRGB(0x0b8bed);
|
|
outgoingColor = UIColorRGB(0x00a700);
|
|
});
|
|
return incoming ? incomingColor : outgoingColor;
|
|
}
|
|
|
|
static UIColor *colorForLine(bool incoming)
|
|
{
|
|
static UIColor *incomingColor = nil;
|
|
static UIColor *outgoingColor = nil;
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^
|
|
{
|
|
incomingColor = UIColorRGB(0x3ca7fe);
|
|
outgoingColor = UIColorRGB(0x29cc10);
|
|
});
|
|
return incoming ? incomingColor : outgoingColor;
|
|
}
|
|
|
|
- (instancetype)initWithPeer:(id)peer incoming:(bool)incoming text:(NSString *)text truncateTextInTheMiddle:(bool)truncateTextInTheMiddle textColor:(UIColor *)textColor leftInset:(CGFloat)leftInset system:(bool)system
|
|
{
|
|
self = [super init];
|
|
if (self != nil)
|
|
{
|
|
_leftInset = leftInset;
|
|
_system = system;
|
|
|
|
_lineModel = [[TGModernColorViewModel alloc] initWithColor:system ? [UIColor whiteColor] : colorForLine(incoming)];
|
|
[self addSubmodel:_lineModel];
|
|
|
|
NSString *title = @"";
|
|
if ([peer isKindOfClass:[TGUser class]]) {
|
|
title = ((TGUser *)peer).displayName;
|
|
} else if ([peer isKindOfClass:[TGConversation class]]) {
|
|
title = ((TGConversation *)peer).chatTitle;
|
|
}
|
|
|
|
_nameModel = [[TGModernTextViewModel alloc] initWithText:title font:nameFont()];
|
|
_nameModel.textColor = system ? [UIColor whiteColor] : colorForTitle(incoming);
|
|
[self addSubmodel:_nameModel];
|
|
|
|
_textModel = [[TGModernTextViewModel alloc] initWithText:text font:textFont()];
|
|
if (truncateTextInTheMiddle)
|
|
_textModel.layoutFlags = TGReusableLabelTruncateInTheMiddle;
|
|
_textModel.textColor = system ? [UIColor whiteColor] : textColor;
|
|
[self addSubmodel:_textModel];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
+ (UIColor *)colorForMediaText:(bool)incoming
|
|
{
|
|
static UIColor *incomingColor = nil;
|
|
static UIColor *outgoingColor = nil;
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^
|
|
{
|
|
incomingColor = UIColorRGB(0x979797);
|
|
outgoingColor = UIColorRGB(0x00a700);
|
|
});
|
|
return incoming ? incomingColor : outgoingColor;
|
|
}
|
|
|
|
+ (CGFloat)thumbnailCornerRadius
|
|
{
|
|
return 4.0f;
|
|
}
|
|
|
|
- (void)bindSpecialViewsToContainer:(UIView *)__unused container viewStorage:(TGModernViewStorage *)__unused viewStorage atItemPosition:(CGPoint)__unused itemPosition
|
|
{
|
|
}
|
|
|
|
- (void)layoutForContainerSize:(CGSize)containerSize
|
|
{
|
|
[self layoutForContainerSize:containerSize updateContent:NULL];
|
|
}
|
|
|
|
- (void)layoutForContainerSize:(CGSize)containerSize updateContent:(bool *)updateContent
|
|
{
|
|
if (ABS(_cachedLayoutWidth - containerSize.width) > FLT_EPSILON || ABS(_cachedLeftInset - _leftInset) > FLT_EPSILON)
|
|
{
|
|
_cachedLayoutWidth = containerSize.width;
|
|
_cachedLeftInset = _leftInset;
|
|
if (updateContent)
|
|
*updateContent = true;
|
|
}
|
|
|
|
CGFloat leftInset = 11.0f + _leftInset;
|
|
|
|
CGSize maxTextSize = containerSize;
|
|
maxTextSize.width -= leftInset + 6.0f;
|
|
[_nameModel layoutForContainerSize:maxTextSize];
|
|
[_textModel layoutForContainerSize:maxTextSize];
|
|
|
|
CGRect nameFrame = _nameModel.frame;
|
|
nameFrame.origin.x = leftInset;
|
|
nameFrame.origin.y = 3.0f;
|
|
_nameModel.frame = nameFrame;
|
|
|
|
CGRect textFrame = _textModel.frame;
|
|
textFrame.origin.y = CGRectGetMaxY(nameFrame) + 2.0f;
|
|
textFrame.origin.x = leftInset;
|
|
_textModel.frame = textFrame;
|
|
|
|
CGFloat additionalHeight = _system ? 2.0f : 0.0f;
|
|
|
|
self.frame = CGRectMake(0.0f, 0.0f, leftInset + MAX(_nameModel.frame.size.width, _textModel.frame.size.width), _nameModel.frame.size.height + _textModel.frame.size.height + 8.0f + additionalHeight);
|
|
|
|
_lineModel.frame = CGRectMake(1.0f, 7.0f, 2.0f, self.frame.size.height - 10.0f + additionalHeight);
|
|
}
|
|
|
|
@end
|