• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/**
2 * Copyright (c) 2021-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 {
17  FolderComponent,
18} from '@ohos/common/component'
19import {
20  LauncherDragItemInfo,
21  Log,
22  Trace,
23  StyleConstants,
24  CommonConstants,
25  PresetStyleConstants,
26  AppItemInfo,
27  FolderItemInfo,
28  MenuInfo,
29  FolderData
30} from '@ohos/common';
31import {
32  BigFolderViewModel,
33  BigFolderStyleConfig,
34  BigFolderConstants
35} from '@ohos/bigfolder';
36import { PageDesktopDragHandler } from '../PageDesktopDragHandler';
37import { PageDesktopViewModel } from '../../viewmodel/PageDesktopViewModel'
38import { PageDesktopStartAppHandler } from '../PageDesktopStartAppHandler';
39import { PageDesktopGridStyleConfig } from '../PageDesktopGridStyleConfig';
40
41const TAG = 'FolderItem';
42
43interface FolderItemType {
44  folderId: string;
45  folderName: string;
46  enterEditing?: boolean;
47  layoutInfo: AppItemInfo[][]
48}
49
50/**
51 * Folder item, which display on desktop workspace.
52 */
53@Component
54export default struct FolderItem {
55  @StorageLink('dragItemInfo') pageDesktopDragItemInfo: LauncherDragItemInfo = new LauncherDragItemInfo();
56  @StorageLink('dragItemType') dragItemType: number = CommonConstants.DRAG_FROM_DESKTOP;
57  @StorageLink('openFolderStatus') openFolderStatus: number = BigFolderConstants.OPEN_FOLDER_STATUS_CLOSE;
58  @StorageLink('selectDesktopAppItem') selectDesktopAppItem: string = '';
59  private mAppNameHeight: number = StyleConstants.DEFAULT_APP_NAME_HEIGHT;
60  private mAppNameSize: number = StyleConstants.DEFAULT_APP_NAME_SIZE;
61  private folderItem: LauncherDragItemInfo = new LauncherDragItemInfo();
62  private isSwappingPage = false;
63  private mAppItemWidth: number = 0;
64  private mPageDesktopViewModel?: PageDesktopViewModel;
65  private mBigFolderViewModel?: BigFolderViewModel;
66  private mMargin: number = 0;
67  private mGridSpaceWidth: number = 0;
68  private mGridSpaceHeight: number = 0;
69  private mIconMarginVertical: number = StyleConstants.DEFAULT_10;
70  private mPageDesktopDragHandler: PageDesktopDragHandler = PageDesktopDragHandler.getInstance();
71  private mPageDesktopStartAppHandler: PageDesktopStartAppHandler = PageDesktopStartAppHandler.getInstance();
72  private mFolderStyleConfig: BigFolderStyleConfig = BigFolderViewModel.getInstance().getFolderStyleConfig();
73  mNameLines: number = PresetStyleConstants.DEFAULT_APP_NAME_LINES;
74
75  aboutToAppear(): void  {
76    this.mPageDesktopDragHandler = PageDesktopDragHandler.getInstance();
77    this.mPageDesktopStartAppHandler = PageDesktopStartAppHandler.getInstance();
78    this.mBigFolderViewModel = BigFolderViewModel.getInstance();
79    this.mFolderStyleConfig = this.mBigFolderViewModel.getFolderStyleConfig();
80    this.mPageDesktopViewModel = PageDesktopViewModel.getInstance();
81    let styleConfig = this.mPageDesktopViewModel.getPageDesktopStyleConfig();
82    this.mAppItemWidth = styleConfig.mIconSize;
83    this.mAppNameHeight = styleConfig.mNameHeight;
84    this.mAppNameSize = styleConfig.mNameSize;
85    this.mIconMarginVertical = styleConfig.mIconMarginVertical;
86    this.mMargin = styleConfig.mMargin;
87    this.mGridSpaceWidth = Number(this.mPageDesktopViewModel.getWorkSpaceWidth()) - this.mMargin;
88    this.mGridSpaceHeight = Number(this.mPageDesktopViewModel.getWorkSpaceHeight());
89    this.openFolderStatus = AppStorage.get('openFolderStatus') != 'undefined' ? (AppStorage.get('openFolderStatus') as number) : BigFolderConstants.OPEN_FOLDER_STATUS_CLOSE;
90    this.formatFolderInfo();
91  }
92
93  /**
94   * format FolderInfo
95   */
96  private formatFolderInfo() {
97    if (typeof this.folderItem.layoutInfo === 'undefined') return;
98    let column = this.mBigFolderViewModel?.getFolderLayoutConfig().column as number;
99    let row = this.mBigFolderViewModel?.getFolderLayoutConfig().row as number;
100    const allCount = column * row;
101    if (this.folderItem.layoutInfo[0].length > allCount) {
102      let folderLayoutInfoList: AppItemInfo[][] = [];
103      let integer = Math.floor(this.folderItem.layoutInfo[0].length / allCount);
104      let remainder = this.folderItem.layoutInfo[0].length % allCount;
105      for (let i = 0; i < integer; i++) {
106        folderLayoutInfoList.push(this.folderItem.layoutInfo[0].slice(i * allCount, (i + 1) * allCount));
107      }
108      if (remainder != 0) {
109        folderLayoutInfoList.push(this.folderItem.layoutInfo[0].slice(integer * allCount, integer * allCount + remainder));
110      }
111      this.folderItem.layoutInfo.splice(0, 1);
112      this.folderItem.layoutInfo = folderLayoutInfoList;
113    }
114  }
115
116  /**
117   * When rename is clicked, call this function to change folder state.
118   */
119  private renameClick = () => {
120    Log.showInfo(TAG, 'click menu folder rename');
121    AppStorage.setOrCreate('overlayMode', CommonConstants.OVERLAY_TYPE_HIDE);
122    this.mBigFolderViewModel?.openFolder(true, this.folderItem as FolderData);
123  }
124
125  private getOpenFolder(): string {
126    let openFolderData: FolderData = AppStorage.get('openFolderData') as FolderData;
127
128    return openFolderData.folderId;
129  }
130
131  dragStart = (event: DragEvent): CustomBuilder => {
132    ContextMenu.close();
133    this.dragItemType = CommonConstants.DRAG_FROM_DESKTOP;
134    this.folderItem.isDragging = true;
135    this.pageDesktopDragItemInfo = this.folderItem;
136    const selectAppIndex = PageDesktopDragHandler.getInstance().getItemIndex(event.getWindowX(), event.getWindowY());
137    const startPosition = PageDesktopDragHandler.getInstance().getTouchPosition(event.getWindowX(), event.getWindowY())
138    PageDesktopDragHandler.getInstance().mStartPosition = startPosition;
139    AppStorage.setOrCreate('selectAppIndex', selectAppIndex);
140    Log.showInfo(TAG, `onDragStart event: [${event.getWindowX()}, ${event.getWindowY()}], selectAppIndex: ${selectAppIndex}`);
141  }
142
143  build() {
144    Flex({
145      direction: FlexDirection.Column,
146      alignItems: ItemAlign.Center,
147      justifyContent: FlexAlign.SpaceAround
148    }) {
149      Column() {
150        FolderComponent({
151          showFolderName: true,
152          mFolderItem: this.folderItem,
153          badgeNumber: this.folderItem.badgeNumber,
154          isSelect: this.selectDesktopAppItem === this.folderItem.folderId,
155          folderNameHeight: this.mAppNameHeight,
156          folderNameLines: this.mNameLines,
157          folderNameSize: this.mAppNameSize,
158          folderGridSize:this.mFolderStyleConfig.mGridSize,
159          appIconSize: this.mFolderStyleConfig.mFolderAppSize,
160          gridMargin:this.mFolderStyleConfig.mGridMargin,
161          mPaddingTop: this.mIconMarginVertical,
162          gridGap:this.mFolderStyleConfig.mFolderGridGap,
163          iconNameMargin: this.mFolderStyleConfig.mIconNameMargin,
164          nameFontColor: PageDesktopViewModel.getInstance().getPageDesktopStyleConfig().mNameFontColor as string,
165          onAppIconClick: (event: ClickEvent, appItem: AppItemInfo) => {
166            Log.showInfo(TAG, "onAppIconClick");
167            Trace.start(Trace.CORE_METHOD_START_APP_ANIMATION);
168            this.setStartAppInfo(appItem);
169            PageDesktopViewModel.getInstance().openApplication(appItem.abilityName, appItem.bundleName, appItem.moduleName);
170          },
171          onOpenFolderClick: (event: ClickEvent, folderItem: FolderData) => {
172            Log.showInfo(TAG, "onOpenFolderClick");
173            Trace.start(Trace.CORE_METHOD_OPEN_FOLDER);
174            this.mBigFolderViewModel?.openFolder(false, folderItem);
175          },
176          onFolderTouch: (event: TouchEvent, folderItem: FolderData) => {
177            if (event.type === CommonConstants.TOUCH_TYPE_UP && this.pageDesktopDragItemInfo.isDragging) {
178              let mIsDragEffectArea = PageDesktopDragHandler.getInstance().isDragEffectArea(event.touches[0].windowX, event.touches[0].windowY);
179              Log.showInfo(TAG, `onTouch mIsDragEffectArea: ${mIsDragEffectArea}`);
180              if (!mIsDragEffectArea) {
181                PageDesktopDragHandler.getInstance().deleteBlankPageOutsideEffect();
182                AppStorage.setOrCreate<LauncherDragItemInfo>('dragItemInfo', new LauncherDragItemInfo());
183                AppStorage.setOrCreate('selectAppIndex', null);
184              }
185            }
186          },
187          onGetPosition: (getPosition: Function) => {
188            Log.showInfo(TAG, "onGetPosition");
189            let styleConfig = PageDesktopViewModel.getInstance().getPageDesktopStyleConfig() as PageDesktopGridStyleConfig;
190            let row = this.folderItem.row as number;
191            let column = this.folderItem.column as number;
192            Log.showInfo(TAG, `onGetPosition currentFolderPosition row: ${row}, column: ${column}`);
193            let x = styleConfig.mAppItemSize * column
194            + styleConfig.mColumnsGap * column + styleConfig.mMargin + styleConfig.mIconMarginHorizontal;
195            let y = styleConfig.mAppItemSize * row
196            + styleConfig.mRowsGap * row + styleConfig.mDesktopMarginTop + styleConfig.mIconMarginVertical;
197            Log.showInfo(TAG, `onGetPosition currentFolderPosition x: ${x}, y: ${y}`);
198            getPosition(x, y);
199          },
200          buildMenu: (folderItem: LauncherDragItemInfo) => {
201            return PageDesktopViewModel.getInstance().buildRenameMenuInfoList(folderItem, this.renameClick) as MenuInfo[];
202          },
203          dragStart: this.dragStart
204        })
205      }
206      .visibility((this.pageDesktopDragItemInfo.folderId === this.folderItem.folderId || (this.openFolderStatus != 0 && this.getOpenFolder() == this.folderItem.folderId)) ? Visibility.Hidden : Visibility.Visible)
207      .onMouse((event: MouseEvent) => {
208        if (event.button == MouseButton.Right) {
209          event.stopPropagation();
210          Log.showInfo(TAG, 'onMouse mouse button right');
211          AppStorage.setOrCreate('selectDesktopAppItem', this.folderItem.folderId);
212        }
213      })
214      .gesture(
215      GestureGroup(GestureMode.Exclusive,
216      TapGesture({ count: 2 })
217        .onAction((event: GestureEvent) => {
218          Log.showInfo(TAG, 'TapGesture double click');
219          this.mBigFolderViewModel?.openFolder(false, this.folderItem as FolderData);
220        })
221      )
222      )
223    }
224    .parallelGesture(LongPressGesture({ repeat: false }))
225    .width(StyleConstants.PERCENTAGE_100)
226    .height(StyleConstants.PERCENTAGE_100)
227  }
228
229  /**
230  * set start app info
231  */
232  private setStartAppInfo(appItem: AppItemInfo) {
233    AppStorage.setOrCreate('startAppItemInfo', appItem);
234    AppStorage.setOrCreate('startAppFromFolderItemInfo', this.folderItem);
235    AppStorage.setOrCreate('startAppTypeFromPageDesktop', CommonConstants.OVERLAY_TYPE_FOLDER);
236    this.mPageDesktopStartAppHandler.setAppIconSize(this.mFolderStyleConfig.mFolderAppSize);
237    this.mPageDesktopStartAppHandler.setAppIconInfo();
238  }
239}