Files
featherVoice/TUIKit/TUIMultimediaPlugin/Edit/UI/CommonEditor/Views/TUIMultimediaCommonEditorControlView.m
2025-08-08 10:49:36 +08:00

702 lines
26 KiB
Objective-C

// Copyright (c) 2024 Tencent. All rights reserved.
// Author: eddardliu
#import "TUIMultimediaCommonEditorControlView.h"
#import <Masonry/Masonry.h>
#import <TUICore/TUIThemeManager.h>
#import "TUIMultimediaPlugin/NSArray+Functional.h"
#import "TUIMultimediaPlugin/TUIMultimediaCircleProgressView.h"
#import "TUIMultimediaPlugin/TUIMultimediaCommon.h"
#import "TUIMultimediaPlugin/TUIMultimediaDrawView.h"
#import "TUIMultimediaPlugin/TUIMultimediaImageUtil.h"
#import "TUIMultimediaPlugin/TUIMultimediaPasterSelectView.h"
#import "TUIMultimediaPlugin/TUIMultimediaPasterView.h"
#import "TUIMultimediaPlugin/TUIMultimediaSplitter.h"
#import "TUIMultimediaPlugin/TUIMultimediaStickerView.h"
#import "TUIMultimediaPlugin/TUIMultimediaSubtitleView.h"
#import "TUIMultimediaPlugin/TUIMultimediaTabPanel.h"
#import "TUIMultimediaPlugin/TUIMultimediaConfig.h"
#import "TUIMultimediaPlugin/TUIMultimediaConstant.h"
#import "TUIMultimediaPlugin/TUIMultimediaGeometry.h"
#import "TUIMultimediaPlugin/TUIMultimediaCropControlView.h"
#import "TUIMultimediaPlugin/TUIMultimediaDrawCtrlView.h"
#define FUNCTION_BUTTON_SIZE CGSizeMake(28, 28)
#define BUTTON_SEND_SIZE CGSizeMake(60, 28)
@interface TUIMultimediaCommonEditorControlView () <TUIMultimediaStickerViewDelegate, UIGestureRecognizerDelegate, TUIMultimediaDrawCtrlViewDelegate, TUIMultimediaCropControlDelegate> {
TUIMultimediaCommonEditorConfig *_config;
UIStackView *_stkViewButtons;
UIButton *_btnDrawGraffiti;
UIButton *_btnDrawMosaic;
UIButton *_btnMusic;
UIButton *_btnSubtitle;
UIButton *_btnPaster;
UIButton *_btnCrop;
UIButton *_btnSend;
UIButton *_btnCancel;
NSMutableArray<TUIMultimediaStickerView *> *_stickerViewList;
TUIMultimediaStickerView *_lastSelectedStickerView;
UIView *_editContainerView;
TUIMultimediaDrawView *_drawView;
TUIMultimediaDrawCtrlView *_drawCtrlView;
UIView *_generateView;
TUIMultimediaCircleProgressView *_progressView;
UIButton *_btnGenerateCancel;
BOOL _isStartCrop;
NSInteger _previewRotationAngle;
TUIMultimediaCropControlView* _cropControlView;
}
@end
@implementation TUIMultimediaCommonEditorControlView
- (instancetype)initWithFrame:(CGRect)frame {
return [self initWithConfig:[[TUIMultimediaCommonEditorConfig alloc] init]];
}
- (instancetype)initWithConfig:(TUIMultimediaCommonEditorConfig *)config {
self = [super initWithFrame:CGRectZero];
if (self != nil) {
_config = config;
_sourceType = SOURCE_TYPE_RECORD;
_isStartCrop = NO;
_stickerViewList = [NSMutableArray array];
[self initUI];
}
return self;
}
- (void)addPaster:(UIImage *)paster {
TUIMultimediaPasterView *vpaster = [[TUIMultimediaPasterView alloc] init];
vpaster.delegate = self;
[_stickerViewList addObject:vpaster];
vpaster.paster = paster;
vpaster.center = CGPointMake(_editContainerView.bounds.size.width / 2, _editContainerView.bounds.size.height / 2);
[_editContainerView addSubview:vpaster];
}
- (void)addSubtitle:(TUIMultimediaSubtitleInfo *)subtitle {
TUIMultimediaSubtitleView *vsub = [[TUIMultimediaSubtitleView alloc] init];
vsub.delegate = self;
[_stickerViewList addObject:vsub];
vsub.subtitleInfo = subtitle;
vsub.center = CGPointMake(_editContainerView.bounds.size.width / 2, _editContainerView.bounds.size.height / 2);
[_editContainerView addSubview:vsub];
}
#pragma mark crop function
- (void)previewScale:(CGFloat) scale center:(CGPoint)center {
if (_isStartCrop) {
return;
}
CGFloat width = _previewView.frame.size.width * scale;
CGFloat height = _previewView.frame.size.height * scale;
CGFloat left = center.x - (center.x - _previewView.frame.origin.x) * scale;
CGFloat top = center.y - (center.y - _previewView.frame.origin.y) * scale;
_previewView.frame = CGRectMake(left, top, width, height);
for (UIView *subview in _editContainerView.subviews) {
if ([subview isKindOfClass:[TUIMultimediaStickerView class]]) {
TUIMultimediaStickerView* stickView = (TUIMultimediaStickerView*)subview;
[stickView scale:scale];
}
}
if (_cropControlView != nil) {
[_cropControlView changeResetButtonStatus];
}
}
- (void)previewMove:(CGPoint)offset {
if (_isStartCrop) {
return;
}
_previewView.frame = CGRectMake(_previewView.frame.origin.x + offset.x,
_previewView.frame.origin.y + offset.y,
_previewView.frame.size.width,
_previewView.frame.size.height);
if (_cropControlView != nil) {
[_cropControlView changeResetButtonStatus];
}
}
- (void)previewRotation90:(CGPoint)center {
_previewRotationAngle = (_previewRotationAngle + 90 + 360) % 360;
float radians = _previewRotationAngle * M_PI / 180;
int newTop = center.y - center.x + _previewView.frame.origin.x;
int newLeft = center.x + center.y - _previewView.frame.origin.y - _previewView.frame.size.height;
_editContainerView.transform = CGAffineTransformMakeRotation(radians);
_previewView.transform = CGAffineTransformMakeRotation(radians);
_previewView.frame = CGRectMake(newLeft, newTop, _previewView.frame.size.width, _previewView.frame.size.height);
if (_cropControlView != nil) {
[_cropControlView changeResetButtonStatus];
}
}
- (void)previewRotationToZero {
_previewRotationAngle = 0;
_editContainerView.transform = CGAffineTransformMakeRotation(0);
_previewView.transform = CGAffineTransformMakeRotation(0);
}
- (void)previewAdjustToLimitRect {
NSLog(@"preview adjust to limit rect");
double scaleLimitX = _previewLimitRect.size.width * 1.0f / _previewView.frame.size.width;
double scaleLimitY = _previewLimitRect.size.height * 1.0f / _previewView.frame.size.height;
double scaleLimit = MAX(scaleLimitX, scaleLimitY);
if (scaleLimit > 1.0f) {
[self previewScale:scaleLimit center:CGPointMake(CGRectGetMidX(_previewView.frame), CGRectGetMidY(_previewView.frame))];
}
int maxLeft = _previewLimitRect.origin.x;
int minLeft = _previewLimitRect.size.width + _previewLimitRect.origin.x - _previewView.frame.size.width;
int left = MAX(MIN(_previewView.frame.origin.x , maxLeft), minLeft);
int maxTop = _previewLimitRect.origin.y;
int minTop = _previewLimitRect.size.height + _previewLimitRect.origin.y - _previewView.frame.size.height;
int top = MAX(MIN(_previewView.frame.origin.y , maxTop), minTop);
_previewView.frame = CGRectMake(left, top, _previewView.frame.size.width, _previewView.frame.size.height);
}
#pragma mark UI init
- (void)initUI {
self.backgroundColor = UIColor.blackColor;
_previewView = [[UIView alloc] init];
[self addSubview:_previewView];
[self initFuncitonBtnStackView];
[self initGraffitiFunction];
[self initMosaicFunction];
[self initPasterFunciton];
[self initSubtitleFunciton];
[self initBGMFunction];
[self initCropFunciton];
[self initSendAndCancelBtn];
[self initGenerateView];
[self bringSubviewToFront:_stkViewButtons];
}
- (void) initFuncitonBtnStackView {
_stkViewButtons = [[UIStackView alloc] init];
_stkViewButtons.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:_stkViewButtons];
_stkViewButtons.axis = UILayoutConstraintAxisHorizontal;
_stkViewButtons.alignment = UIStackViewAlignmentCenter;
_stkViewButtons.distribution = UIStackViewDistributionEqualSpacing;
[_stkViewButtons mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self).inset(10);
make.bottom.equalTo(self.mas_safeAreaLayoutGuideBottom);
make.height.mas_equalTo(FUNCTION_BUTTON_SIZE.height);
}];
}
- (void) initGraffitiFunction {
if (!_config.drawGraffitiEnabled) {
return;
}
_btnDrawGraffiti = [self addFunctionIconButtonWithImage:TUIMultimediaPluginBundleThemeImage(@"editor_scrawl_img", @"modify_scrawl")
onTouchUpInside:@selector(onBtnDrawGraffitiClicked)];
[self initEditContainerView];
[self initDrawCtrlView];
}
- (void) initMosaicFunction {
if (!_config.drawMosaicEnabled) {
return;
}
_btnDrawMosaic = [self addFunctionIconButtonWithImage:TUIMultimediaPluginBundleThemeImage(@"edit_mosaic_img", @"edit_mosaic")
onTouchUpInside:@selector(onBtnDrawMosaicClicked)];
[self initEditContainerView];
[self initDrawCtrlView];
_drawCtrlView.drawView.mosaciOriginalImage = _mosaciOriginalImage;
}
- (void) initPasterFunciton {
if (!_config.pasterEnabled) {
return;
}
_btnPaster = [self addFunctionIconButtonWithImage:TUIMultimediaPluginBundleThemeImage(@"editor_paster_img", @"modify_paster")
onTouchUpInside:@selector(onBtnPasterClicked)];
[self initEditContainerView];
}
- (void) initSubtitleFunciton {
if (!_config.subtitleEnabled) {
return;
}
_btnSubtitle = [self addFunctionIconButtonWithImage:TUIMultimediaPluginBundleThemeImage(@"editor_subtitle_img", @"modify_subtitle")
onTouchUpInside:@selector(onBtnSubtitleClicked)];
[self initEditContainerView];
}
- (void) initBGMFunction {
if (!_config.musicEditEnabled) {
return;
}
_btnMusic = [self addFunctionIconButtonWithImage:TUIMultimediaPluginBundleThemeImage(@"editor_music_img", @"modify_music")
onTouchUpInside:@selector(onBtnMusicClicked)];
}
- (void) initCropFunciton {
if (!_config.cropEnabled) {
return;
}
_btnCrop = [self addFunctionIconButtonWithImage:TUIMultimediaPluginBundleThemeImage(@"editor_crop_img", @"modify_crop")
onTouchUpInside:@selector(onBtnCropClicked)];
[self initCropCtrlView];
}
- (void)initCropCtrlView {
if (_cropControlView != nil) {
return;
}
_cropControlView = [[TUIMultimediaCropControlView alloc] initWithFrame:self.frame editorControl:self];
[self addSubview:_cropControlView];
_cropControlView.hidden = YES;
[_cropControlView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
}];
_cropControlView.delegate = self;
}
- (void)initDrawCtrlView {
if (_drawCtrlView != nil) {
return;
}
_drawCtrlView = [[TUIMultimediaDrawCtrlView alloc] init];
[self addSubview:_drawCtrlView];
[_drawCtrlView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self);
make.top.equalTo(_stkViewButtons).offset(-50);
make.bottom.equalTo(self);
}];
_drawCtrlView.drawEnable = NO;
_drawCtrlView.delegate = self;
[_editContainerView addSubview:_drawCtrlView.drawView];
[_drawCtrlView.drawView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(_previewView);
}];
}
- (void) initEditContainerView {
if (_editContainerView != nil) {
return;
}
_editContainerView = [[UIView alloc] init];
[self addSubview:_editContainerView];
_editContainerView.userInteractionEnabled = YES;
_editContainerView.clipsToBounds = YES;
UITapGestureRecognizer *containerTapRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTapContainerView:)];
containerTapRec.cancelsTouchesInView = NO;
[_editContainerView addGestureRecognizer:containerTapRec];
[_editContainerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(_previewView);
}];
}
- (void) initSendAndCancelBtn {
_btnSend = [UIButton buttonWithType:UIButtonTypeSystem];
if (_stkViewButtons.arrangedSubviews.count == 0) {
[_stkViewButtons removeFromSuperview];
[self addSubview:_btnSend];
[_btnSend mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(BUTTON_SEND_SIZE);
make.right.equalTo(self).inset(20);
make.bottom.equalTo(self.mas_safeAreaLayoutGuideBottom);
}];
} else {
[_stkViewButtons addArrangedSubview:_btnSend];
[_btnSend mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(BUTTON_SEND_SIZE);
}];
}
_btnSend.backgroundColor = [[TUIMultimediaConfig sharedInstance] getThemeColor];
[_btnSend setTitleColor:UIColor.whiteColor forState:UIControlStateNormal];
_btnSend.layer.cornerRadius = 5;
NSString* titile = [TUIMultimediaCommon localizedStringForKey:@"send"];
if (_sourceType == SOURCE_TYPE_ALBUM) {
titile = [TUIMultimediaCommon localizedStringForKey:@"done"];
}
[_btnSend setTitle:titile forState:UIControlStateNormal];
[_btnSend addTarget:self action:@selector(onBtnSendClicked) forControlEvents:UIControlEventTouchUpInside];
_btnCancel = [UIButton buttonWithType:UIButtonTypeCustom];
[self addSubview:_btnCancel];
[_btnCancel setImage:TUIMultimediaPluginBundleThemeImage(@"editor_cancel_img", @"return_arrow") forState:UIControlStateNormal];
[_btnCancel addTarget:self action:@selector(onBtnCancelClicked) forControlEvents:UIControlEventTouchUpInside];
[_btnCancel mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(24, 24));
make.top.equalTo(self.mas_safeAreaLayoutGuideTop).inset(10);
if([[TUIGlobalization getPreferredLanguage] hasPrefix:@"ar"]) {
make.right.equalTo(self.mas_safeAreaLayoutGuideRight).offset(-15);
} else {
make.left.equalTo(self.mas_safeAreaLayoutGuideLeft).offset(15);
}
}];
}
- (void)setSourceType:(int)sourceType {
NSLog(@"setSourceType sourceType = %d",sourceType);
_sourceType = sourceType;
NSString* titile = [TUIMultimediaCommon localizedStringForKey:@"send"];
if (_sourceType == SOURCE_TYPE_ALBUM) {
titile = [TUIMultimediaCommon localizedStringForKey:@"done"];
}
[_btnSend setTitle:titile forState:UIControlStateNormal];
}
- (void)initGenerateView {
_generateView = [[UIView alloc] init];
_generateView.backgroundColor = TUIMultimediaPluginDynamicColor(@"editor_generate_view_bg_color", @"#0000007F");
_generateView.hidden = YES;
[self addSubview:_generateView];
_progressView = [[TUIMultimediaCircleProgressView alloc] init];
_progressView.progressColor = [[TUIMultimediaConfig sharedInstance] getThemeColor];
[_generateView addSubview:_progressView];
_btnGenerateCancel = [UIButton buttonWithType:UIButtonTypeSystem];
[_btnGenerateCancel addTarget:self action:@selector(onBtnGenerateCancelClicked) forControlEvents:UIControlEventTouchUpInside];
[_btnGenerateCancel setTitle:[TUIMultimediaCommon localizedStringForKey:@"cancel"] forState:UIControlStateNormal];
[_btnGenerateCancel setTitleColor:UIColor.whiteColor forState:UIControlStateNormal];
[_generateView addSubview:_btnGenerateCancel];
[_generateView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
}];
[_progressView mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(100, 100));
make.center.equalTo(_generateView);
}];
[_btnGenerateCancel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.mas_safeAreaLayoutGuideTop).inset(10);
make.left.equalTo(self).inset(10);
make.size.mas_equalTo(CGSizeMake(54, 32));
}];
}
- (UIButton *)addFunctionIconButtonWithImage:(UIImage *)img onTouchUpInside:(SEL)sel {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
[_stkViewButtons addArrangedSubview:btn];
UIImage *imgNormal = [TUIMultimediaImageUtil imageFromImage:img withTintColor:
TUIMultimediaPluginDynamicColor(@"editor_func_btn_normal_color", @"#FFFFFF")];
UIImage *imgDisabled = [TUIMultimediaImageUtil imageFromImage:img withTintColor:
TUIMultimediaPluginDynamicColor(@"editor_func_btn_disabled_color", @"#6D6D6D")];
UIImage *imgPressed = [TUIMultimediaImageUtil imageFromImage:img withTintColor:
TUIMultimediaPluginDynamicColor(@"editor_func_btn_pressed_color", @"#7F7F7F")];
UIImage *imgSelected = [TUIMultimediaImageUtil imageFromImage:img withTintColor:
[[TUIMultimediaConfig sharedInstance] getThemeColor]];
[btn setImage:imgNormal forState:UIControlStateNormal];
[btn setImage:imgDisabled forState:UIControlStateDisabled];
[btn setImage:imgPressed forState:UIControlStateHighlighted];
[btn setImage:imgSelected forState:UIControlStateSelected];
[btn setImageEdgeInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[btn addTarget:self action:sel forControlEvents:UIControlEventTouchUpInside];
[btn mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(FUNCTION_BUTTON_SIZE);
}];
return btn;
}
#pragma mark Internal Functions
- (void)setDrawEnabled:(BOOL)drawGraffitiEnabled {
if (!_config.drawGraffitiEnabled) {
return;
}
_lastSelectedStickerView.selected = NO;
_lastSelectedStickerView = nil;
_btnDrawGraffiti.selected = drawGraffitiEnabled;
if(drawGraffitiEnabled) {
_btnDrawMosaic.selected = NO;
}
_drawCtrlView.drawMode = GRAFFITI;
_drawCtrlView.drawEnable = drawGraffitiEnabled;
for (TUIMultimediaStickerView *v in _stickerViewList) {
v.userInteractionEnabled = !drawGraffitiEnabled;
}
}
- (void)setDrawMosaicEnabled:(BOOL)drawMosaicEnabled {
if (!_config.drawMosaicEnabled) {
return;
}
_lastSelectedStickerView.selected = NO;
_lastSelectedStickerView = nil;
_btnDrawMosaic.selected = drawMosaicEnabled;
if(drawMosaicEnabled) {
_btnDrawGraffiti.selected = NO;
}
_drawCtrlView.drawMode = MOSAIC;
_drawCtrlView.drawEnable = drawMosaicEnabled;
for (TUIMultimediaStickerView *v in _stickerViewList) {
v.userInteractionEnabled = !drawMosaicEnabled;
}
}
- (NSArray<TUIMultimediaSticker *> *)getStickers {
NSArray<TUIMultimediaSticker *> *stickers = [_stickerViewList tui_multimedia_map:^TUIMultimediaSticker *(TUIMultimediaStickerView *v) {
[v resignFirstResponder];
TUIMultimediaSticker *sticker = [[TUIMultimediaSticker alloc] init];
sticker.image = [TUIMultimediaImageUtil imageFromView:v withRotate:v.rotation];
sticker.frame = v.frame;
return sticker;
}];
TUIMultimediaSticker *drawSticker = _drawCtrlView != nil ? _drawCtrlView.drawSticker : nil;
if (drawSticker != nil) {
stickers = [NSArray tui_multimedia_arrayWithArray:stickers append:@[ drawSticker ]];
}
return stickers;
}
- (void) clearAllStaticker {
if (_drawCtrlView != nil) {
[_drawCtrlView clearAllDraw];
}
for (TUIMultimediaStickerView *v in _stickerViewList) {
[v removeFromSuperview];
}
[_stickerViewList removeAllObjects];
}
#pragma mark - UIGestureRecognizer actions
- (void)onTapContainerView:(UITapGestureRecognizer *)rec {
_lastSelectedStickerView.selected = NO;
_lastSelectedStickerView = nil;
}
#pragma mark - Actions
- (void)onBtnSendClicked {
[self setDrawEnabled:NO];
[self setDrawMosaicEnabled:NO];
[_delegate onCommonEditorControlViewComplete:self stickers:[self getStickers]];
}
- (void)onBtnCancelClicked {
[_delegate onCommonEditorControlViewCancel:self];
}
- (void)onBtnSubtitleClicked {
[_delegate onCommonEditorControlViewNeedModifySubtitle:[[TUIMultimediaSubtitleInfo alloc] init]
callback:^(TUIMultimediaSubtitleInfo *subtitle, BOOL isOk) {
if (isOk) {
[self addSubtitle:subtitle];
}
}];
[self setDrawEnabled:NO];
[self setDrawMosaicEnabled:NO];
_lastSelectedStickerView.selected = NO;
_lastSelectedStickerView = nil;
}
- (void)onBtnPasterClicked {
[_delegate onCommonEditorControlViewNeedAddPaster:self];
[self setDrawEnabled:NO];
[self setDrawMosaicEnabled:NO];
_lastSelectedStickerView.selected = NO;
_lastSelectedStickerView = nil;
}
- (void)onBtnDrawGraffitiClicked {
[self setDrawEnabled:!_btnDrawGraffiti.selected];
_drawCtrlView.drawMode = GRAFFITI;
}
- (void)onBtnDrawMosaicClicked {
[self setDrawMosaicEnabled:!_btnDrawMosaic.selected];
_drawCtrlView.drawMode = MOSAIC;
}
- (void)onBtnMusicClicked {
[self setDrawEnabled:NO];
[self setDrawMosaicEnabled:NO];
[_delegate onCommonEditorControlViewNeedEditMusic:self];
_lastSelectedStickerView.selected = NO;
_lastSelectedStickerView = nil;
}
- (void)onBtnCropClicked {
[self setDrawEnabled:NO];
[self setDrawMosaicEnabled:NO];
[_cropControlView show];
_drawCtrlView.drawEnable = NO;
_stkViewButtons.hidden = YES;
_btnCancel.hidden = YES;
}
- (void)onBtnGenerateCancelClicked {
[_delegate onCommonEditorControlViewCancelGenerate:self];
self.isGenerating = false;
_progressView.progress = 0;
}
#pragma mark - Properties
- (BOOL)modifyButtonsHidden {
return _stkViewButtons.hidden;
}
- (void)setModifyButtonsHidden:(BOOL)modifyButtonsHidden {
_stkViewButtons.hidden = modifyButtonsHidden;
}
- (void)setPreviewSize:(CGSize)previewSize {
_previewSize = previewSize;
if (previewSize.width == 0 || previewSize.height == 0) {
return;
}
int width = self.frame.size.width;
int height = previewSize.height / previewSize.width * width;
_previewView.frame = CGRectMake(0,0, width, height);
_previewView.center = self.center;
_previewLimitRect = _previewView.frame;
}
- (BOOL)isGenerating {
return !_generateView.hidden;
}
- (void)setIsGenerating:(BOOL)isGenerating {
_generateView.hidden = !isGenerating;
_stkViewButtons.hidden = isGenerating;
_btnCancel.hidden = isGenerating;
}
- (CGFloat)progressBarProgress {
return _progressView.progress;
}
- (void)setProgressBarProgress:(CGFloat)progressBarProgress {
[_progressView setProgress:progressBarProgress animated:YES];
}
- (BOOL)musicEdited {
return _btnMusic != nil ? _btnMusic.selected : FALSE;
}
- (void)setMusicEdited:(BOOL)musicEdited {
if (_btnMusic != nil) {
_btnMusic.selected = musicEdited;
}
}
-(void)setMosaciOriginalImage:(UIImage *)mosaciOriginalImage {
_mosaciOriginalImage = mosaciOriginalImage;
if (_drawCtrlView) {
_drawCtrlView.drawView.mosaciOriginalImage = mosaciOriginalImage;
}
}
#pragma mark - TUIMultimediaCropControlDelegate protocol
- (void)onCancelCrop {
[self previewRotationToZero];
self.previewSize = _previewSize;
_stkViewButtons.hidden = NO;
_btnCancel.hidden = NO;
}
- (void)onConfirmCrop:(CGRect)cropRect {
CGFloat cropX = (cropRect.origin.x - _previewView.frame.origin.x) / _previewView.frame.size.width;
CGFloat cropY = (cropRect.origin.y - _previewView.frame.origin.y) / _previewView.frame.size.height;
CGFloat cropWidth = cropRect.size.width / _previewView.frame.size.width;
CGFloat cropHeight = cropRect.size.height / _previewView.frame.size.height;
CGRect normalizedCropRect = CGRectMake(cropX, cropY, cropWidth, cropHeight);
CGFloat rotationAngle = _previewRotationAngle;
if ((_previewRotationAngle + 360) % 360 != 0) {
_previewView.hidden = YES;
}
[self previewRotationToZero];
[_delegate onCommonEditorControlViewCrop:rotationAngle normalizedCropRect:normalizedCropRect stickers:[self getStickers]];
_stkViewButtons.hidden = NO;
_btnCancel.hidden = NO;
[self clearAllStaticker];
}
#pragma mark - TUIMultimediaStickerViewDelegate protocol
- (void)onStickerViewSelected:(TUIMultimediaStickerView *)v {
[_editContainerView bringSubviewToFront:v];
_lastSelectedStickerView.selected = NO;
_lastSelectedStickerView = v;
}
- (void)onStickerViewShouldDelete:(TUIMultimediaStickerView *)v {
[v removeFromSuperview];
[_stickerViewList removeObject:v];
}
- (void)onStickerViewShouldEdit:(TUIMultimediaStickerView *)v {
if ([v isKindOfClass:TUIMultimediaSubtitleView.class]) {
TUIMultimediaSubtitleView *vsub = (TUIMultimediaSubtitleView *)v;
vsub.hidden = YES;
TUIMultimediaSubtitleInfo *info = vsub.subtitleInfo;
[_delegate onCommonEditorControlViewNeedModifySubtitle:info
callback:^(TUIMultimediaSubtitleInfo *newInfo, BOOL isOk) {
if (isOk) {
vsub.subtitleInfo = newInfo;
}
vsub.hidden = NO;
}];
}
}
- (void)onStickerViewSizeChanged:(TUIMultimediaStickerView *)v {
}
#pragma mark - TUIMultimediaDrawCtrlViewDelegate
- (void)onIsDrawCtrlViewDrawing:(BOOL)Hidden {
_stkViewButtons.hidden = Hidden;
}
@end
#pragma mark - TUIMultimediaCommonEditorConfig
@implementation TUIMultimediaCommonEditorConfig
+ (instancetype)configForVideoEditor {
TUIMultimediaCommonEditorConfig *config = [[TUIMultimediaCommonEditorConfig alloc] init];
config.pasterEnabled = [[TUIMultimediaConfig sharedInstance] isSupportVideoEditPaster];
config.subtitleEnabled = [[TUIMultimediaConfig sharedInstance] isSupportVideoEditSubtitle];
config.drawGraffitiEnabled = [[TUIMultimediaConfig sharedInstance] isSupportVideoEditGraffiti];
config.musicEditEnabled = [[TUIMultimediaConfig sharedInstance] isSupportVideoEditBGM];
config.cropEnabled = NO;
config.drawMosaicEnabled = NO;
return config;
}
+ (instancetype)configForPictureEditor {
TUIMultimediaCommonEditorConfig *config = [[TUIMultimediaCommonEditorConfig alloc] init];
config.pasterEnabled = [[TUIMultimediaConfig sharedInstance] isSupportPictureEditPaster];
config.subtitleEnabled = [[TUIMultimediaConfig sharedInstance] isSupportPictureEditSubtitle];
config.drawGraffitiEnabled = [[TUIMultimediaConfig sharedInstance] isSupportPictureEditGraffiti];
config.drawMosaicEnabled = [[TUIMultimediaConfig sharedInstance] isSupportPictureEditMosaic];
config.cropEnabled = [[TUIMultimediaConfig sharedInstance] isSupportPictureEditCrop];
config.musicEditEnabled = NO;
return config;
}
@end