1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-04 02:17:51 +01:00
Telegram/Watch/Extension/TGNeoBubbleMessageViewModel.m
2016-02-25 01:03:51 +01:00

186 lines
6.6 KiB
Objective-C

#import "TGNeoBubbleMessageViewModel.h"
#import "TGNeoBackgroundViewModel.h"
#import "TGExtensionDelegate.h"
#import "TGColor.h"
#import "TGBridgeContext.h"
#import "TGBridgeMessage.h"
#import "TGBridgeUser.h"
#import "TGPeerIdAdapter.h"
const UIEdgeInsets TGNeoBubbleMessageViewModelInsets = { 4.5, 11, 9, 11 };
const CGFloat TGNeoBubbleMessageMetaSpacing = 5.0f;
const CGFloat TGNeoBubbleHeaderSpacing = 2.0f;
@interface TGNeoBubbleMessageViewModel ()
{
TGNeoBackgroundViewModel *_backgroundModel;
}
@end
@implementation TGNeoBubbleMessageViewModel
- (instancetype)initWithMessage:(TGBridgeMessage *)message type:(TGNeoMessageType)type users:(NSDictionary *)users context:(TGBridgeContext *)context
{
self = [super initWithMessage:message type:type users:users context:context];
if (self != nil)
{
self.showBubble = true;
if (!message.outgoing && type == TGNeoMessageTypeGroup)
{
_authorNameModel = [[TGNeoLabelViewModel alloc] initWithText:[users[@(message.fromUid)] displayName] font:[UIFont systemFontOfSize:14] color:[TGColor colorForUserId:(int32_t)message.fromUid myUserId:context.userId] attributes:nil];
[self addSubmodel:_authorNameModel];
}
TGBridgeForwardedMessageMediaAttachment *forwardAttachment = nil;
TGBridgeReplyMessageMediaAttachment *replyAttachment = nil;
for (TGBridgeMediaAttachment *attachment in message.media)
{
if ([attachment isKindOfClass:[TGBridgeForwardedMessageMediaAttachment class]])
forwardAttachment = (TGBridgeForwardedMessageMediaAttachment *)attachment;
else if ([attachment isKindOfClass:[TGBridgeReplyMessageMediaAttachment class]])
replyAttachment = (TGBridgeReplyMessageMediaAttachment *)attachment;
}
if (forwardAttachment != nil)
{
if (TGPeerIdIsChannel(forwardAttachment.peerId))
{
_forwardHeaderModel = [[TGNeoForwardHeaderViewModel alloc] initWithForwardAttachment:forwardAttachment chat:users[@(forwardAttachment.peerId)] outgoing:message.outgoing];
}
else
{
_forwardHeaderModel = [[TGNeoForwardHeaderViewModel alloc] initWithForwardAttachment:forwardAttachment user:users[@(forwardAttachment.peerId)] outgoing:message.outgoing];
}
[self addSubmodel:_forwardHeaderModel];
}
if (replyAttachment != nil)
{
_replyHeaderModel = [[TGNeoReplyHeaderViewModel alloc] initWithReplyAttachment:replyAttachment users:users outgoing:message.outgoing];
[self addSubmodel:_replyHeaderModel];
}
}
return self;
}
- (CGSize)contentContainerSizeWithContainerSize:(CGSize)containerSize
{
return CGSizeMake(containerSize.width - TGNeoBubbleMessageViewModelInsets.left - TGNeoBubbleMessageViewModelInsets.right, FLT_MAX);
}
- (CGSize)layoutHeaderModelsWithContainerSize:(CGSize)containerSize
{
CGFloat textTopOffset = self.showBubble ? TGNeoBubbleMessageViewModelInsets.top : 0;
CGFloat maxContentWidth = 0;
if (self.authorNameModel != nil)
{
CGSize textSize = [self.authorNameModel contentSizeWithContainerSize:containerSize];
self.authorNameModel.frame = CGRectMake(TGNeoBubbleMessageViewModelInsets.left, textTopOffset, textSize.width, 16.5f);
textTopOffset += self.authorNameModel.frame.size.height;
if (textSize.width > maxContentWidth)
maxContentWidth = textSize.width;
}
if (self.replyHeaderModel != nil)
{
textTopOffset += TGNeoBubbleHeaderSpacing;
CGSize headerSize = [self.replyHeaderModel contentSizeWithContainerSize:containerSize];
self.replyHeaderModel.frame = CGRectMake(TGNeoBubbleMessageViewModelInsets.left, textTopOffset, headerSize.width, headerSize.height);
if (headerSize.width > maxContentWidth)
maxContentWidth = headerSize.width;
textTopOffset += self.replyHeaderModel.frame.size.height + TGNeoBubbleHeaderSpacing;
if (_replyHeaderModel.mediaAttachment != nil)
{
UIEdgeInsets inset = UIEdgeInsetsMake(self.replyHeaderModel.frame.origin.y + 1.5f, self.replyHeaderModel.frame.origin.x + TGNeoReplyHeaderLineWidth + TGNeoReplyHeaderSpacing, 0, 0);
NSDictionary *imageDictionary = @{ TGNeoMessageReplyMediaAttachment: _replyHeaderModel.mediaAttachment };
[self addAdditionalLayout:@{ TGNeoContentInset: [NSValue valueWithUIEdgeInsets:inset], TGNeoMessageReplyImageGroup: imageDictionary } withKey:TGNeoMessageHeaderGroup];
}
}
if (self.forwardHeaderModel != nil)
{
textTopOffset += TGNeoBubbleHeaderSpacing;
CGSize headerSize = [self.forwardHeaderModel contentSizeWithContainerSize:containerSize];
self.forwardHeaderModel.frame = CGRectMake(TGNeoBubbleMessageViewModelInsets.left, textTopOffset, headerSize.width, headerSize.height);
if (headerSize.width > maxContentWidth)
maxContentWidth = headerSize.width;
textTopOffset += self.forwardHeaderModel.frame.size.height + TGNeoBubbleHeaderSpacing;
}
return CGSizeMake(maxContentWidth, textTopOffset);
}
- (UIColor *)normalColorForMessage:(TGBridgeMessage *)message
{
if (message.outgoing)
return [UIColor whiteColor];
else
return [UIColor blackColor];
}
- (UIColor *)subtitleColorForMessage:(TGBridgeMessage *)message
{
if (message.outgoing)
return [UIColor hexColor:0xbeddf6];
else
return [UIColor hexColor:0x7e7e81];
}
- (UIColor *)accentColorForMessage:(TGBridgeMessage *)message
{
if (message.outgoing)
return [UIColor whiteColor];
else
return [UIColor hexColor:0x1f97f8];
}
- (CGSize)layoutWithContainerSize:(CGSize)containerSize
{
self.contentSize = containerSize;
return CGSizeZero;
}
+ (CGFloat)bodyTextFontSize
{
TGContentSizeCategory category = [TGExtensionDelegate instance].contentSizeCategory;
switch (category)
{
case TGContentSizeCategoryXS:
return 14.0f;
case TGContentSizeCategoryS:
return 15.0f;
case TGContentSizeCategoryL:
return 16.0f;
case TGContentSizeCategoryXL:
return 17.0f;
case TGContentSizeCategoryXXL:
return 18.0f;
case TGContentSizeCategoryXXXL:
return 19.0f;
default:
break;
}
return 16.0f;
}
@end