1/* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import { PhotoEditMode } from '../base/PhotoEditType'; 17import { 18 BigDataConstants, 19 BroadCast, 20 BroadCastConstants, 21 BroadCastManager, 22 Constants, 23 Log, 24 ReportToBigDataUtil, 25 UiUtil, 26 WindowUtil 27} from '@ohos/common'; 28import { PhotoEditorManager } from '../PhotoEditorManager'; 29import { PhotoEditCrop } from '../crop/PhotoEditCrop'; 30import router from '@ohos.router'; 31import { Router } from '@ohos.arkui.UIContext'; 32 33const TAG: string = 'editor_TitleBar'; 34 35@Component 36export struct TitleBar { 37 @Consume isRedo: boolean; 38 @Consume isUndo: boolean; 39 @State name: Resource | undefined = undefined; 40 @State isPcStyle: boolean = true; 41 @Consume('selected') selectedMode: number; 42 @Consume broadCast: BroadCast; 43 @Consume isVerticalScreen: boolean; 44 @State isImmersive: boolean = false; 45 @Consume editorManager: PhotoEditorManager; 46 @Consume cropEdit: PhotoEditCrop; 47 private appBroadCast: BroadCast = BroadCastManager.getInstance().getBroadCast(); 48 private newImageId: number = -1; 49 private immersiveClick: Function = (): void => {}; 50 private onBackAfterSaveComplete: Function = (): void => {}; 51 52 saveAsNewCallback() { 53 Log.debug(TAG, 'saveAsNewCallback called'); 54 interface Msg { 55 saveType: string; 56 } 57 let msg: Msg = { 58 saveType: BigDataConstants.SAVE_AS_NEW 59 } 60 ReportToBigDataUtil.report(BigDataConstants.PHOTO_EDIT_SAVE_ID, msg); 61 PhotoEditorManager.getInstance().save(false, (uri: string): void => this.saveImageCallback(uri)); 62 } 63 64 replaceOriginalCallback(): void { 65 Log.debug(TAG, 'replaceOriginalCallback called'); 66 interface Msg { 67 saveType: string; 68 } 69 let msg: Msg = { 70 saveType: BigDataConstants.SAVE_REPLACE 71 } 72 ReportToBigDataUtil.report(BigDataConstants.PHOTO_EDIT_SAVE_ID, msg); 73 PhotoEditorManager.getInstance().save(true, (uri: string): void => this.saveImageCallback(uri)); 74 } 75 76 discardCallback() { 77 Log.debug(TAG, 'discardCallback called'); 78 } 79 80 saveImageCallback(uri: string) { 81 Log.debug(TAG, `saveImageCallback uri = ${uri}`); 82 if (uri == undefined || uri == null || uri.length == 0) { 83 this.broadCast.emit(BroadCastConstants.EXIT_SAVE_PROGRESS_CLOSE, []); 84 UiUtil.showToast($r('app.string.edit_photo_save_fail')); 85 router.back(); 86 } else { 87 AppStorage.SetOrCreate(BroadCastConstants.PHOTO_EDIT_SAVE_URI, uri); 88 this.appBroadCast.emit(BroadCastConstants.PHOTO_BROWSER_ACTIVE, [true, Constants.PHOTO_TRANSITION_EDIT]); 89 } 90 } 91 92 backAfterSaveComplete() { 93 Log.debug(TAG, `backAfterSaveComplete called`); 94 this.appBroadCast.emit(BroadCastConstants.PHOTO_BROWSER_ACTIVE, [false, Constants.PHOTO_TRANSITION_EDIT]); 95 this.broadCast.emit(BroadCastConstants.EXIT_SAVE_PROGRESS_CLOSE, []); 96 AppStorage.SetOrCreate(BroadCastConstants.PHOTO_EDIT_SAVE_URI, ""); 97 router.back(); 98 } 99 100 aboutToAppear() { 101 this.immersiveClick = (isImmersive: boolean): void => this.immersive(isImmersive); 102 this.broadCast.on(Constants.IS_IMMERSIVE, this.immersiveClick); 103 this.onBackAfterSaveComplete = (): void => this.backAfterSaveComplete(); 104 this.appBroadCast.on(BroadCastConstants.PHOTO_EDIT_SAVE_COMPLETE, this.onBackAfterSaveComplete); 105 } 106 107 aboutToDisappear() { 108 this.broadCast.off(Constants.IS_IMMERSIVE, this.immersiveClick); 109 this.appBroadCast.off(BroadCastConstants.PHOTO_EDIT_SAVE_COMPLETE, this.onBackAfterSaveComplete); 110 } 111 112 immersive(isImmersive: boolean) { 113 this.isImmersive = isImmersive; 114 } 115 116 onBackClicked(): void { 117 Log.debug(TAG, 'back clicked'); 118 if (this.isRedo || this.isUndo) { 119 this.broadCast.emit(BroadCastConstants.SHOW_EDIT_EXIT_PHOTO_DIALOG, [(): void => this.discardCallback()]); 120 } else if (this.selectedMode == PhotoEditMode.EDIT_MODE_CROP && this.cropEdit.couldReset()) { 121 this.broadCast.emit(BroadCastConstants.SHOW_EDIT_EXIT_PHOTO_DIALOG, [(): void => this.discardCallback()]); 122 } else { 123 router.back({ 124 url: '', 125 params: {} 126 }); 127 } 128 } 129 130 onSaveClicked(): void { 131 Log.info(TAG, 'save clicked'); 132 if (this.isRedo || this.isRedo) { 133 this.broadCast.emit(BroadCastConstants.SHOW_SAVE_PHOTO_DIALOG, 134 [(): void => this.saveAsNewCallback(), (): void => this.replaceOriginalCallback()]); 135 } else if (this.selectedMode == PhotoEditMode.EDIT_MODE_CROP && this.cropEdit.couldReset()) { 136 this.broadCast.emit(BroadCastConstants.SHOW_SAVE_PHOTO_DIALOG, 137 [(): void => this.saveAsNewCallback(), (): void => this.replaceOriginalCallback()]); 138 } else { 139 router.back({ 140 url: '', 141 params: {} 142 }); 143 } 144 } 145 146 build() { 147 if (!this.isImmersive) { 148 Row() { 149 Column() { 150 if (this.selectedMode == PhotoEditMode.EDIT_MODE_CROP) { 151 Row() { 152 Flex({ 153 direction: FlexDirection.Column, 154 justifyContent: FlexAlign.Center, 155 alignItems: ItemAlign.Center 156 }) { 157 Image($r('app.media.ic_gallery_public_back')) 158 .key('PhotoEditBackButton') 159 .width($r('app.float.ic_size_default')) 160 .height($r('app.float.ic_size_default')) 161 .fillColor($r('app.color.default_white_color')) 162 } 163 .height($r('app.float.buttonWithoutText')) 164 .width($r('app.float.buttonWithoutText')) 165 .margin({ 166 left: $r('app.float.bottom_bar_padding'), 167 right: $r('app.float.adjust_text_margin_left') 168 }) 169 .onClick(() => { 170 this.onBackClicked() 171 }) 172 173 Row() { 174 Text(this.name) 175 .fontSize($r('sys.float.ohos_id_text_size_headline8')) 176 .fontWeight(FontWeight.Medium) 177 .fontColor($r('app.color.default_white_color')) 178 .margin({ 179 left: $r('app.float.adjust_text_margin_bottom'), 180 right: $r('app.float.adjust_text_margin_left') 181 }) 182 } 183 } 184 } 185 } 186 .alignItems(HorizontalAlign.Start) 187 .width('50%') 188 189 Column() { 190 Row() { 191 if (this.selectedMode == PhotoEditMode.EDIT_MODE_CROP) { 192 Flex({ 193 direction: FlexDirection.Column, 194 justifyContent: FlexAlign.Center, 195 alignItems: ItemAlign.Center 196 }) { 197 Image(this.isPcStyle ? $r('app.media.ic_gallery_public_ok') : $r('app.media.ic_gallery_public_save')) 198 .key('PhotoEditSaveButton') 199 .width($r('app.float.ic_size_default')) 200 .height($r('app.float.ic_size_default')) 201 .fillColor($r('app.color.default_white_color')) 202 } 203 .height($r('app.float.buttonWithoutText')) 204 .width($r('app.float.buttonWithoutText')) 205 .margin({ right: $r('app.float.actionbar_first_icon_margin') }) 206 .onClick(() => { 207 this.onSaveClicked() 208 }) 209 .zIndex(100) 210 } 211 } 212 } 213 .alignItems(HorizontalAlign.End) 214 .width('50%') 215 } 216 } 217 } 218}