mirror of
https://github.com/danog/Telegram.git
synced 2024-12-04 10:27:46 +01:00
384 lines
14 KiB
Objective-C
384 lines
14 KiB
Objective-C
#import "TGDialogListSearchCell.h"
|
|
|
|
#import "TGLetteredAvatarView.h"
|
|
|
|
#import "TGImageUtils.h"
|
|
#import "TGFont.h"
|
|
|
|
#import "TGLabel.h"
|
|
|
|
#import "TGStringUtils.h"
|
|
|
|
@interface TGDialogListSearchCell ()
|
|
{
|
|
CALayer *_separatorLayer;
|
|
int _boldMode;
|
|
}
|
|
|
|
@property (nonatomic, strong) TGLetteredAvatarView *avatarView;
|
|
|
|
@property (nonatomic, strong) UILabel *titleLabelFirst;
|
|
@property (nonatomic, strong) UILabel *titleLabelSecond;
|
|
@property (nonatomic, strong) UILabel *subtitleLabel;
|
|
|
|
@property (nonatomic, strong) UIImageView *unreadCountBackgrond;
|
|
@property (nonatomic, strong) TGLabel *unreadCountLabel;
|
|
|
|
@property (nonatomic, strong) UIImageView *verifiedIcon;
|
|
|
|
@end
|
|
|
|
@implementation TGDialogListSearchCell
|
|
|
|
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier assetsSource:(id<TGDialogListCellAssetsSource>)assetsSource
|
|
{
|
|
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
|
|
if (self)
|
|
{
|
|
self.contentView.superview.clipsToBounds = false;
|
|
|
|
_separatorLayer = [[CALayer alloc] init];
|
|
_separatorLayer.backgroundColor = TGSeparatorColor().CGColor;
|
|
[self.contentView.layer addSublayer:_separatorLayer];
|
|
|
|
self.backgroundView = nil;
|
|
self.selectedBackgroundView = [[UIView alloc] init];
|
|
self.selectedBackgroundView.backgroundColor = TGSelectionColor();
|
|
|
|
_assetsSource = assetsSource;
|
|
|
|
_titleLabelFirst = [[UILabel alloc] init];
|
|
_titleLabelFirst.textAlignment = NSTextAlignmentLeft;
|
|
_titleLabelFirst.textColor = UIColorRGB(0x000000);
|
|
_titleLabelFirst.backgroundColor = [UIColor clearColor];
|
|
[self.contentView addSubview:_titleLabelFirst];
|
|
|
|
_titleLabelSecond = [[UILabel alloc] init];
|
|
_titleLabelSecond.textAlignment = NSTextAlignmentLeft;
|
|
_titleLabelSecond.textColor = UIColorRGB(0x000000);
|
|
_titleLabelSecond.backgroundColor = [UIColor clearColor];
|
|
[self.contentView addSubview:_titleLabelSecond];
|
|
|
|
_subtitleLabel = [[UILabel alloc] init];
|
|
_subtitleLabel.textAlignment = NSTextAlignmentLeft;
|
|
_subtitleLabel.font = TGSystemFontOfSize(14.0f);
|
|
_subtitleLabel.textColor = UIColorRGB(0x949494);
|
|
_subtitleLabel.backgroundColor = [UIColor clearColor];
|
|
[self.contentView addSubview:_subtitleLabel];
|
|
|
|
_avatarView = [[TGLetteredAvatarView alloc] initWithFrame:CGRectMake(5, 5, 40, 40)];
|
|
[_avatarView setSingleFontSize:17.0f doubleFontSize:17.0f useBoldFont:true];
|
|
_avatarView.fadeTransition = true;
|
|
[self.contentView addSubview:_avatarView];
|
|
|
|
_verifiedIcon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ChannelVerifiedIconSmall.png"]];
|
|
_verifiedIcon.hidden = true;
|
|
[self.contentView addSubview:_verifiedIcon];
|
|
|
|
static UIImage *unreadBackground = nil;
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^
|
|
{
|
|
UIGraphicsBeginImageContextWithOptions(CGSizeMake(20.0f, 20.0f), false, 0.0f);
|
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
|
|
CGContextSetFillColorWithColor(context, UIColorRGB(0x0f94f3).CGColor);
|
|
CGContextFillEllipseInRect(context, CGRectMake(0.0f, 0.0f, 20.0f, 20.0f));
|
|
|
|
unreadBackground = [UIGraphicsGetImageFromCurrentImageContext() stretchableImageWithLeftCapWidth:10.0f topCapHeight:0.0f];
|
|
UIGraphicsEndImageContext();
|
|
});
|
|
|
|
_unreadCountBackgrond = [[UIImageView alloc] initWithImage:unreadBackground];
|
|
|
|
[self.contentView addSubview:_unreadCountBackgrond];
|
|
|
|
_unreadCountLabel = [[TGLabel alloc] initWithFrame:CGRectMake(0, 0, 50, 20)];
|
|
_unreadCountLabel.textColor = [UIColor whiteColor];
|
|
_unreadCountLabel.font = TGSystemFontOfSize(14);
|
|
|
|
[self.contentView addSubview:_unreadCountLabel];
|
|
|
|
_unreadCountLabel.backgroundColor = [UIColor clearColor];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)setBoldMode:(int)index
|
|
{
|
|
_boldMode = index;
|
|
}
|
|
|
|
- (void)resetView:(bool)animated
|
|
{
|
|
CGFloat titleFontSize = _attributedSubtitleText.length == 0 ? 19.0f : 17.0f;
|
|
if (_boldMode == 0)
|
|
{
|
|
_titleLabelFirst.font = [UIFont systemFontOfSize:titleFontSize];
|
|
_titleLabelSecond.font = [UIFont boldSystemFontOfSize:titleFontSize];
|
|
}
|
|
else if (_boldMode == 1)
|
|
{
|
|
_titleLabelFirst.font = [UIFont boldSystemFontOfSize:titleFontSize];
|
|
_titleLabelSecond.font = [UIFont systemFontOfSize:titleFontSize];
|
|
}
|
|
else
|
|
{
|
|
_titleLabelFirst.font = [UIFont systemFontOfSize:titleFontSize];
|
|
_titleLabelSecond.font = [UIFont systemFontOfSize:titleFontSize];
|
|
}
|
|
|
|
if (_titleTextSecond == nil || _titleTextSecond.length == 0)
|
|
{
|
|
_titleLabelFirst.text = nil;
|
|
_titleLabelFirst.hidden = true;
|
|
|
|
_titleLabelSecond.text = _titleTextFirst;
|
|
}
|
|
else
|
|
{
|
|
_titleLabelFirst.text = _titleTextFirst;
|
|
_titleLabelFirst.hidden = false;
|
|
|
|
_titleLabelSecond.text = _titleTextSecond;
|
|
}
|
|
|
|
_subtitleLabel.attributedText = _attributedSubtitleText;
|
|
|
|
static UIColor *titleColor = nil;
|
|
static UIColor *encryptedTitleColor = nil;
|
|
static dispatch_once_t onceToken1;
|
|
dispatch_once(&onceToken1, ^
|
|
{
|
|
titleColor = [UIColor blackColor];
|
|
encryptedTitleColor = UIColorRGB(0x00a629);
|
|
});
|
|
|
|
_titleLabelFirst.textColor = _isEncrypted ? encryptedTitleColor : titleColor;
|
|
_titleLabelSecond.textColor = _isEncrypted ? encryptedTitleColor : titleColor;
|
|
|
|
_avatarView.hidden = false;
|
|
|
|
_verifiedIcon.hidden = _attributedSubtitleText.length == 0 || !_isVerified;
|
|
|
|
static UIImage *placeholder = nil;
|
|
static dispatch_once_t onceToken2;
|
|
dispatch_once(&onceToken2, ^
|
|
{
|
|
UIGraphicsBeginImageContextWithOptions(CGSizeMake(40.0f, 40.0f), false, 0.0f);
|
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
|
|
//!placeholder
|
|
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
|
|
CGContextFillEllipseInRect(context, CGRectMake(0.0f, 0.0f, 40.0f, 40.0f));
|
|
CGContextSetStrokeColorWithColor(context, UIColorRGB(0xd9d9d9).CGColor);
|
|
CGContextSetLineWidth(context, 1.0f);
|
|
CGContextStrokeEllipseInRect(context, CGRectMake(0.5f, 0.5f, 39.0f, 39.0f));
|
|
|
|
placeholder = UIGraphicsGetImageFromCurrentImageContext();
|
|
UIGraphicsEndImageContext();
|
|
});
|
|
|
|
if (_avatarUrl != nil)
|
|
{
|
|
_avatarView.fadeTransitionDuration = animated ? 0.14 : 0.3;
|
|
if (![_avatarUrl isEqualToString:_avatarView.currentUrl])
|
|
{
|
|
if (animated)
|
|
{
|
|
UIImage *currentImage = [_avatarView currentImage];
|
|
[_avatarView loadImage:_avatarUrl filter:@"circle:40x40" placeholder:(currentImage != nil ? currentImage : (_isChat ? placeholder : placeholder)) forceFade:true];
|
|
}
|
|
else
|
|
[_avatarView loadImage:_avatarUrl filter:@"circle:40x40" placeholder:(_isChat ? placeholder : placeholder)];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (!_isChat || _isEncrypted)
|
|
{
|
|
[_avatarView loadUserPlaceholderWithSize:CGSizeMake(40.0f, 40.0f) uid:_isEncrypted ? _encryptedUserId : (int32_t)_conversationId firstName:_titleTextFirst lastName:_titleTextSecond placeholder:placeholder];
|
|
}
|
|
else
|
|
{
|
|
[_avatarView loadGroupPlaceholderWithSize:CGSizeMake(40.0f, 40.0f) conversationId:_conversationId title:_titleTextFirst placeholder:placeholder];
|
|
}
|
|
}
|
|
|
|
if (_unreadCount != 0)
|
|
{
|
|
_unreadCountBackgrond.hidden = false;
|
|
_unreadCountLabel.hidden = false;
|
|
|
|
int totalCount = _unreadCount;
|
|
|
|
if (TGIsLocaleArabic())
|
|
{
|
|
_unreadCountLabel.text = [TGStringUtils stringWithLocalizedNumberCharacters:[[NSString alloc] initWithFormat:@"%d", totalCount]];
|
|
}
|
|
else
|
|
{
|
|
if (totalCount < 1000)
|
|
_unreadCountLabel.text = [[NSString alloc] initWithFormat:@"%d", totalCount];
|
|
else
|
|
_unreadCountLabel.text = [[NSString alloc] initWithFormat:@"%dK", totalCount / 1000];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_unreadCountBackgrond.hidden = true;
|
|
_unreadCountLabel.hidden = true;
|
|
}
|
|
|
|
[self setNeedsLayout];
|
|
}
|
|
|
|
- (void)layoutSubviews
|
|
{
|
|
[super layoutSubviews];
|
|
|
|
CGFloat separatorHeight = TGIsRetina() ? 0.5f : 1.0f;
|
|
_separatorLayer.frame = CGRectMake(65.0f, self.frame.size.height - separatorHeight, self.frame.size.width - 65.0f, separatorHeight);
|
|
|
|
CGRect frame = self.selectedBackgroundView.frame;
|
|
frame.origin.y = true ? -1 : 0;
|
|
frame.size.height = self.frame.size.height + (true ? 1 : 0);
|
|
self.selectedBackgroundView.frame = frame;
|
|
|
|
CGSize viewSize = self.contentView.frame.size;
|
|
|
|
CGFloat leftPadding = 0.0f;
|
|
CGFloat rightPadding = 10.0f;
|
|
|
|
CGFloat countTextWidth = [_unreadCountLabel.text sizeWithFont:_unreadCountLabel.font].width;
|
|
|
|
CGFloat backgroundWidth = MAX(20.0f, countTextWidth + 11.0f);
|
|
CGRect unreadCountBackgroundFrame = CGRectMake(frame.size.width - 11.0f - backgroundWidth, 15.0f, backgroundWidth, 20.0f);
|
|
_unreadCountBackgrond.frame = unreadCountBackgroundFrame;
|
|
CGRect unreadCountLabelFrame = _unreadCountLabel.frame;
|
|
unreadCountLabelFrame.origin = CGPointMake(unreadCountBackgroundFrame.origin.x + TGRetinaFloor(((unreadCountBackgroundFrame.size.width - countTextWidth) / 2.0f)) - (TGIsRetina() ? 0.0f : 0.0f), unreadCountBackgroundFrame.origin.y + 1.0f -TGRetinaPixel);
|
|
_unreadCountLabel.frame = unreadCountLabelFrame;
|
|
|
|
if (!_unreadCountBackgrond.hidden)
|
|
rightPadding += unreadCountBackgroundFrame.size.width + 16;
|
|
|
|
int avatarWidth = 5 + 40;
|
|
|
|
CGSize titleSizeGeneric = CGSizeMake(viewSize.width - avatarWidth - 9 - 5 - leftPadding - rightPadding, _titleLabelFirst.font.lineHeight);
|
|
|
|
if (!_verifiedIcon.hidden) {
|
|
titleSizeGeneric.width -= _verifiedIcon.bounds.size.width + 5.0f;
|
|
}
|
|
|
|
CGRect avatarFrame = CGRectMake(leftPadding + 14, 5, 40, 40);
|
|
if (!CGRectEqualToRect(_avatarView.frame, avatarFrame))
|
|
_avatarView.frame = avatarFrame;
|
|
|
|
CGFloat titleWidth = 0.0f;
|
|
CGFloat titleLabelsY = 0.0f;
|
|
|
|
if (_attributedSubtitleText.length == 0)
|
|
{
|
|
titleLabelsY = (int)((int)((viewSize.height - titleSizeGeneric.height) / 2) - 1);
|
|
|
|
if (!_titleLabelFirst.hidden)
|
|
{
|
|
_titleLabelFirst.frame = CGRectMake(avatarWidth + 21 + leftPadding, titleLabelsY, titleSizeGeneric.width, titleSizeGeneric.height);
|
|
_titleLabelSecond.frame = CGRectMake(avatarWidth + 21 + leftPadding + 5 + (int)([_titleLabelFirst.text sizeWithFont:_titleLabelFirst.font].width), titleLabelsY, titleSizeGeneric.width, titleSizeGeneric.height);
|
|
|
|
titleWidth = CGCeil([_titleLabelFirst.text sizeWithFont:_titleLabelFirst.font].width) + CGCeil([_titleLabelSecond.text sizeWithFont:_titleLabelSecond.font].width);
|
|
}
|
|
else
|
|
{
|
|
_titleLabelSecond.frame = CGRectMake(avatarWidth + 21 + leftPadding, titleLabelsY, titleSizeGeneric.width, titleSizeGeneric.height);
|
|
|
|
titleWidth = CGCeil([_titleLabelSecond.text sizeWithFont:_titleLabelSecond.font].width);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
titleLabelsY = 4.0f + TGRetinaPixel;
|
|
|
|
if (!_titleLabelFirst.hidden)
|
|
{
|
|
_titleLabelFirst.frame = CGRectMake(avatarWidth + 21 + leftPadding, titleLabelsY, titleSizeGeneric.width, titleSizeGeneric.height);
|
|
_titleLabelSecond.frame = CGRectMake(avatarWidth + 21 + leftPadding + 5 + (int)([_titleLabelFirst.text sizeWithFont:_titleLabelFirst.font].width), titleLabelsY, titleSizeGeneric.width, titleSizeGeneric.height);
|
|
|
|
titleWidth = CGCeil([_titleLabelFirst.text sizeWithFont:_titleLabelFirst.font].width) + CGCeil([_titleLabelSecond.text sizeWithFont:_titleLabelSecond.font].width);
|
|
}
|
|
else
|
|
{
|
|
_titleLabelSecond.frame = CGRectMake(avatarWidth + 21 + leftPadding, titleLabelsY, titleSizeGeneric.width, titleSizeGeneric.height);
|
|
|
|
titleWidth = CGCeil([_titleLabelSecond.text sizeWithFont:_titleLabelSecond.font].width);
|
|
}
|
|
|
|
CGSize subtitleSize = [_subtitleLabel sizeThatFits:CGSizeMake(titleSizeGeneric.width, CGFLOAT_MAX)];
|
|
subtitleSize = (CGSize){CGCeil(subtitleSize.width), CGCeil(subtitleSize.height)};
|
|
_subtitleLabel.frame = CGRectMake(avatarWidth + 21 + leftPadding, 26.0f, subtitleSize.width, subtitleSize.height);
|
|
}
|
|
|
|
if (!_verifiedIcon.hidden) {
|
|
_verifiedIcon.frame = CGRectOffset(_verifiedIcon.bounds, avatarWidth + 21 + leftPadding + titleWidth + 3.0f, titleLabelsY + 5.0f - TGRetinaPixel);
|
|
}
|
|
}
|
|
|
|
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
|
|
{
|
|
[super setSelected:selected animated:animated];
|
|
|
|
if (selected)
|
|
{
|
|
CGRect frame = self.selectedBackgroundView.frame;
|
|
frame.origin.y = true ? -1 : 0;
|
|
frame.size.height = self.frame.size.height + (true ? 1 : 0);
|
|
self.selectedBackgroundView.frame = frame;
|
|
|
|
[self adjustOrdering];
|
|
}
|
|
}
|
|
|
|
- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
|
|
{
|
|
[super setHighlighted:highlighted animated:animated];
|
|
|
|
if (highlighted)
|
|
{
|
|
CGRect frame = self.selectedBackgroundView.frame;
|
|
frame.origin.y = true ? -1 : 0;
|
|
frame.size.height = self.frame.size.height + (true ? 1 : 0);
|
|
self.selectedBackgroundView.frame = frame;
|
|
|
|
[self adjustOrdering];
|
|
}
|
|
}
|
|
|
|
- (void)adjustOrdering
|
|
{
|
|
if ([self.superview isKindOfClass:[UITableView class]])
|
|
{
|
|
Class UITableViewCellClass = [UITableViewCell class];
|
|
int maxCellIndex = 0;
|
|
int index = -1;
|
|
int selfIndex = 0;
|
|
for (UIView *view in self.superview.subviews)
|
|
{
|
|
index++;
|
|
if ([view isKindOfClass:UITableViewCellClass])
|
|
{
|
|
maxCellIndex = index;
|
|
|
|
if (view == self)
|
|
selfIndex = index;
|
|
}
|
|
}
|
|
|
|
if (selfIndex < maxCellIndex)
|
|
{
|
|
[self.superview insertSubview:self atIndex:maxCellIndex];
|
|
}
|
|
}
|
|
}
|
|
|
|
@end
|