16e80583aSopenharmony_ci/**
26e80583aSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
36e80583aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
46e80583aSopenharmony_ci * you may not use this file except in compliance with the License.
56e80583aSopenharmony_ci * You may obtain a copy of the License at
66e80583aSopenharmony_ci *
76e80583aSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
86e80583aSopenharmony_ci *
96e80583aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
106e80583aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
116e80583aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126e80583aSopenharmony_ci * See the License for the specific language governing permissions and
136e80583aSopenharmony_ci * limitations under the License.
146e80583aSopenharmony_ci */
156e80583aSopenharmony_ci
166e80583aSopenharmony_ciimport { Log } from '../utils/Log';
176e80583aSopenharmony_ciimport { MenuInfo } from '../bean/MenuInfo';
186e80583aSopenharmony_ciimport { StyleConstants } from '../constants/StyleConstants';
196e80583aSopenharmony_ciimport { CommonConstants } from '../constants/CommonConstants';
206e80583aSopenharmony_ciimport { ResourceManager } from '../manager/ResourceManager';
216e80583aSopenharmony_ci
226e80583aSopenharmony_ciconst TAG = 'AppMenu';
236e80583aSopenharmony_ci
246e80583aSopenharmony_ci@Component
256e80583aSopenharmony_ciexport struct AppMenu {
266e80583aSopenharmony_ci  menuInfoList: Array<MenuInfo> = [];
276e80583aSopenharmony_ci  getMenuInfoList?: Function;
286e80583aSopenharmony_ci  menuMode: number = CommonConstants.MENU_UI_MODE_LIGHT;
296e80583aSopenharmony_ci  fixedMenuList: Array<MenuInfo> = [];
306e80583aSopenharmony_ci  dynamicMenuList: Array<MenuInfo> = [];
316e80583aSopenharmony_ci  isBothTypeMenuExist: boolean = true;
326e80583aSopenharmony_ci  closeMenu: Function = () => {};
336e80583aSopenharmony_ci
346e80583aSopenharmony_ci  aboutToAppear(): void {
356e80583aSopenharmony_ci    Log.showInfo(TAG, 'aboutToAppear start');
366e80583aSopenharmony_ci    if (this.getMenuInfoList) {
376e80583aSopenharmony_ci      this.menuInfoList = this.getMenuInfoList();
386e80583aSopenharmony_ci    }
396e80583aSopenharmony_ci    this.fixedMenuList = [];
406e80583aSopenharmony_ci    this.dynamicMenuList = [];
416e80583aSopenharmony_ci    for (let menuInfo of this.menuInfoList) {
426e80583aSopenharmony_ci      if (menuInfo.menuType == CommonConstants.MENU_TYPE_FIXED) {
436e80583aSopenharmony_ci        this.fixedMenuList.push(menuInfo);
446e80583aSopenharmony_ci      } else {
456e80583aSopenharmony_ci        this.dynamicMenuList.push(menuInfo);
466e80583aSopenharmony_ci      }
476e80583aSopenharmony_ci    }
486e80583aSopenharmony_ci    this.isBothTypeMenuExist = this.fixedMenuList.length > 0 && this.dynamicMenuList.length > 0;
496e80583aSopenharmony_ci  }
506e80583aSopenharmony_ci
516e80583aSopenharmony_ci  aboutToDisappear(): void {
526e80583aSopenharmony_ci    Log.showInfo(TAG, 'aboutToDisappear start');
536e80583aSopenharmony_ci    this.fixedMenuList = [];
546e80583aSopenharmony_ci    this.dynamicMenuList = [];
556e80583aSopenharmony_ci  }
566e80583aSopenharmony_ci
576e80583aSopenharmony_ci  build() {
586e80583aSopenharmony_ci    Column() {
596e80583aSopenharmony_ci      Column() {
606e80583aSopenharmony_ci        ForEach(this.dynamicMenuList, (item: MenuInfo) => {
616e80583aSopenharmony_ci          Column() {
626e80583aSopenharmony_ci            HorizontalMenuItem({
636e80583aSopenharmony_ci              menuInfo: item,
646e80583aSopenharmony_ci              menuMode: this.menuMode,
656e80583aSopenharmony_ci              closeMenu: this.closeMenu
666e80583aSopenharmony_ci            })
676e80583aSopenharmony_ci          }
686e80583aSopenharmony_ci        }, (item: MenuInfo) => JSON.stringify(item))
696e80583aSopenharmony_ci      }
706e80583aSopenharmony_ci      .visibility(this.dynamicMenuList.length > 0 ? Visibility.Visible : Visibility.None)
716e80583aSopenharmony_ci
726e80583aSopenharmony_ci      if (this.isBothTypeMenuExist) {
736e80583aSopenharmony_ci        Divider()
746e80583aSopenharmony_ci          .vertical(false)
756e80583aSopenharmony_ci          .color((this.menuMode == CommonConstants.MENU_UI_MODE_LIGHT) ? '#33000000' : '#33ffffff')
766e80583aSopenharmony_ci          .strokeWidth(1)
776e80583aSopenharmony_ci      }
786e80583aSopenharmony_ci
796e80583aSopenharmony_ci      Column() {
806e80583aSopenharmony_ci        ForEach(this.fixedMenuList, (item: MenuInfo) => {
816e80583aSopenharmony_ci          Column() {
826e80583aSopenharmony_ci            HorizontalMenuItem({
836e80583aSopenharmony_ci              menuInfo: item,
846e80583aSopenharmony_ci              menuMode: this.menuMode,
856e80583aSopenharmony_ci              closeMenu: this.closeMenu
866e80583aSopenharmony_ci            })
876e80583aSopenharmony_ci          }
886e80583aSopenharmony_ci        }, (item: MenuInfo) => JSON.stringify(item))
896e80583aSopenharmony_ci      }
906e80583aSopenharmony_ci      .visibility(this.fixedMenuList.length > 0 ? Visibility.Visible : Visibility.None)
916e80583aSopenharmony_ci    }
926e80583aSopenharmony_ci    .padding({
936e80583aSopenharmony_ci      top: 4,
946e80583aSopenharmony_ci      bottom: 4,
956e80583aSopenharmony_ci      left: 4,
966e80583aSopenharmony_ci      right: 4
976e80583aSopenharmony_ci    })
986e80583aSopenharmony_ci    .borderRadius(StyleConstants.DEFAULT_12)
996e80583aSopenharmony_ci  }
1006e80583aSopenharmony_ci}
1016e80583aSopenharmony_ci
1026e80583aSopenharmony_ci@Component
1036e80583aSopenharmony_cistruct HorizontalMenuItem {
1046e80583aSopenharmony_ci  @State shortcutIcon: string = StyleConstants.DEFAULT_ICON;
1056e80583aSopenharmony_ci  @State shortcutName: string = '';
1066e80583aSopenharmony_ci  private mResourceManager = ResourceManager.getInstance();
1076e80583aSopenharmony_ci  menuInfo: MenuInfo = new MenuInfo();
1086e80583aSopenharmony_ci  menuMode: number = CommonConstants.MENU_UI_MODE_LIGHT;
1096e80583aSopenharmony_ci  closeMenu: Function = () => {};
1106e80583aSopenharmony_ci
1116e80583aSopenharmony_ci  aboutToAppear(): void {
1126e80583aSopenharmony_ci    this.mResourceManager = ResourceManager.getInstance();
1136e80583aSopenharmony_ci    this.updateIcon();
1146e80583aSopenharmony_ci    this.updateName();
1156e80583aSopenharmony_ci  }
1166e80583aSopenharmony_ci
1176e80583aSopenharmony_ci  aboutToDisappear(): void {
1186e80583aSopenharmony_ci  }
1196e80583aSopenharmony_ci
1206e80583aSopenharmony_ci  public shortcutIconLoadCallback = (image: string) => {
1216e80583aSopenharmony_ci    this.shortcutIcon = image;
1226e80583aSopenharmony_ci  }
1236e80583aSopenharmony_ci
1246e80583aSopenharmony_ci  public shortcutNameLoadCallback = (name: string) => {
1256e80583aSopenharmony_ci    this.shortcutName = name;
1266e80583aSopenharmony_ci  }
1276e80583aSopenharmony_ci
1286e80583aSopenharmony_ci  public updateIcon() {
1296e80583aSopenharmony_ci    if (this.menuInfo.shortcutIconId != -1 && this.menuInfo.menuImgSrc != '' && this.menuInfo.menuImgSrc != null) {
1306e80583aSopenharmony_ci      this.mResourceManager.getAppIconWithCache(this.menuInfo.shortcutIconId, this.menuInfo.bundleName,
1316e80583aSopenharmony_ci        this.menuInfo.moduleName, this.shortcutIconLoadCallback, StyleConstants.DEFAULT_ICON);
1326e80583aSopenharmony_ci    } else {
1336e80583aSopenharmony_ci      this.shortcutIconLoadCallback(this.menuInfo.menuImgSrc);
1346e80583aSopenharmony_ci    }
1356e80583aSopenharmony_ci  }
1366e80583aSopenharmony_ci
1376e80583aSopenharmony_ci  public updateName() {
1386e80583aSopenharmony_ci    if (this.menuInfo.shortcutLabelId != -1 && this.menuInfo.menuText != '' && this.menuInfo.menuText != null && this.mResourceManager) {
1396e80583aSopenharmony_ci      this.mResourceManager.getAppNameWithCache(this.menuInfo.shortcutLabelId, this.menuInfo.bundleName,
1406e80583aSopenharmony_ci        this.menuInfo.moduleName, this.shortcutName, this.shortcutNameLoadCallback);
1416e80583aSopenharmony_ci    } else {
1426e80583aSopenharmony_ci      this.shortcutNameLoadCallback(this.menuInfo.menuText);
1436e80583aSopenharmony_ci    }
1446e80583aSopenharmony_ci  }
1456e80583aSopenharmony_ci
1466e80583aSopenharmony_ci  build() {
1476e80583aSopenharmony_ci    Row() {
1486e80583aSopenharmony_ci      if (this.shortcutIcon != null && this.shortcutIcon != '') {
1496e80583aSopenharmony_ci        Image(this.shortcutIcon)
1506e80583aSopenharmony_ci          .objectFit(ImageFit.Contain)
1516e80583aSopenharmony_ci          .height(StyleConstants.DEFAULT_20)
1526e80583aSopenharmony_ci          .width(StyleConstants.DEFAULT_20)
1536e80583aSopenharmony_ci          .margin({
1546e80583aSopenharmony_ci            left: 12
1556e80583aSopenharmony_ci          })
1566e80583aSopenharmony_ci      } else {
1576e80583aSopenharmony_ci        Image('')
1586e80583aSopenharmony_ci          .objectFit(ImageFit.Contain)
1596e80583aSopenharmony_ci          .height(StyleConstants.DEFAULT_20)
1606e80583aSopenharmony_ci          .width(StyleConstants.DEFAULT_20)
1616e80583aSopenharmony_ci          .backgroundColor('#33ffffFF')
1626e80583aSopenharmony_ci          .margin({
1636e80583aSopenharmony_ci            left: 12
1646e80583aSopenharmony_ci          })
1656e80583aSopenharmony_ci      }
1666e80583aSopenharmony_ci      Text(this.shortcutName)
1676e80583aSopenharmony_ci        .fontColor((this.menuMode == CommonConstants.MENU_UI_MODE_LIGHT) ? '#e5000000' : '#e5ffffff')
1686e80583aSopenharmony_ci        .fontSize(14)
1696e80583aSopenharmony_ci        .height(StyleConstants.DEFAULT_20)
1706e80583aSopenharmony_ci        .margin({
1716e80583aSopenharmony_ci          left: StyleConstants.DEFAULT_8
1726e80583aSopenharmony_ci        })
1736e80583aSopenharmony_ci        .textOverflow({overflow: TextOverflow.Ellipsis})
1746e80583aSopenharmony_ci    }
1756e80583aSopenharmony_ci    .alignItems(VerticalAlign.Center)
1766e80583aSopenharmony_ci    .borderRadius(StyleConstants.DEFAULT_ITEM_RADIUS)
1776e80583aSopenharmony_ci    .height(StyleConstants.DEFAULT_40)
1786e80583aSopenharmony_ci    .width(235)
1796e80583aSopenharmony_ci    .onClick(() => {
1806e80583aSopenharmony_ci      this.menuInfo?.onMenuClick();
1816e80583aSopenharmony_ci      this.closeMenu();
1826e80583aSopenharmony_ci    })
1836e80583aSopenharmony_ci  }
1846e80583aSopenharmony_ci}