• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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}