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}