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 Log from '../../../../../../../../common/src/main/ets/default/Log'; 17import Constants from '../common/Constants'; 18import StyleConfiguration, { SimpleToggleLayoutEditComponentStyle, SimpleToggleLayoutEditUpTitleStyle, 19 SimpleToggleLayoutEditOptMsgStyle } from '../common/StyleConfiguration'; 20import SimpleToggleLayoutEditGrid from './SimpleToggleLayoutEditGrid'; 21import SimpleToggleLayoutEditDialogComponent from './SimpleToggleLayoutEditDialogComponent'; 22 23const TAG = 'Control-SimpleToggleLayoutEditComponent'; 24const TAG_SimpleToggleLayoutEditUpTitle = 'Control-SimpleToggleLayoutEditUpTitle'; 25const TAG_SimpleToggleLayoutEditOptMsg = 'Control-SimpleToggleLayoutEditOptMsg'; 26 27@Component 28export default struct SimpleToggleLayoutEditComponent { 29 private mDisplayingToggles: string[] = []; 30 private mHidingToggles: string[] = []; 31 private mDefaultDisplayToggles: string[] = []; 32 @Prop mColumnCount: number; 33 private simpleToggleLayoutEditEndCallback: () => void = () => {}; 34 private onSaveDisplayingToggles: (toggles: string[]) => void = (toggles) => {}; 35 @State mNewDisplayingToggles: string[] = []; 36 @State mNewHidingToggles: string[] = []; 37 @State style: SimpleToggleLayoutEditComponentStyle = StyleConfiguration.getSimpleToggleLayoutEditComponentStyle(); 38 @State mOptMsg: Resource = $r('app.string.control_center_simple_toggle_layout_edit_opt_desc'); 39 private mDisplayingTogglesMaxCount: number = Constants.SIMPLE_TOGGLE_LAYOUT_MAX_TOGGLE_COUNT; 40 private mDisplayingTogglesMinCount: number = Constants.SIMPLE_TOGGLE_LAYOUT_MIN_TOGGLE_COUNT; 41 private mHidingTogglesMaxCount: number = 0; 42 private mHidingTogglesMinCount: number = 0; 43 @State mCurrentDragToggleName: string = ''; 44 private titleDisplayInside: boolean = false; 45 private backDialogController: CustomDialogController | null = new CustomDialogController({ 46 builder: SimpleToggleLayoutEditDialogComponent({ 47 title: $r("app.string.control_center_simple_toggle_layout_edit_back_confirm"), 48 leftButton: $r("app.string.control_center_simple_toggle_layout_edit_back_confirm_primary"), 49 rightButton: $r("app.string.control_center_simple_toggle_layout_edit_back_confirm_secondary"), 50 leftAction: (): void => this.callSimpleToggleLayoutEditEnd(), 51 rightAction: (): void => this.onFinishBtnClick(), 52 }), 53 autoCancel: false, 54 offset: { dx: 0, dy: 0 }, 55 customStyle: true, 56 alignment: DialogAlignment.Center 57 }); 58 private resetDialogController: CustomDialogController | null = new CustomDialogController({ 59 builder: SimpleToggleLayoutEditDialogComponent({ 60 title: $r("app.string.control_center_simple_toggle_layout_edit_reset_confirm"), 61 leftButton: $r("app.string.control_center_simple_toggle_layout_edit_reset_confirm_primary"), 62 rightButton: $r("app.string.control_center_simple_toggle_layout_edit_reset_confirm_secondary"), 63 leftAction: () => { 64 }, 65 rightAction: (): void => this.editResetConfirm(), 66 }), 67 autoCancel: false, 68 offset: { dx: 0, dy: 0 }, 69 customStyle: true, 70 alignment: DialogAlignment.Center 71 }); 72 73 aboutToAppear() { 74 Log.showInfo(TAG, 'aboutToAppear'); 75 this.mNewDisplayingToggles = [...this.mDisplayingToggles]; 76 this.mNewHidingToggles = [...this.mHidingToggles]; 77 let allTogglesCount = this.mNewDisplayingToggles.length + this.mNewHidingToggles.length; 78 this.mHidingTogglesMaxCount = allTogglesCount - this.mDisplayingTogglesMinCount; 79 if (this.mHidingTogglesMaxCount < 0) { 80 this.mHidingTogglesMaxCount = 0; 81 }; 82 this.mHidingTogglesMinCount = allTogglesCount - this.mDisplayingTogglesMaxCount; 83 if (this.mHidingTogglesMinCount < 0) { 84 this.mHidingTogglesMinCount = 0; 85 }; 86 } 87 88 aboutToDisappear() { 89 this.backDialogController = null 90 this.resetDialogController = null 91 92 Log.showInfo(TAG, 'aboutToDisappear '); 93 } 94 95 build() { 96 Column() { 97 if (!this.titleDisplayInside) { 98 Column() { 99 SimpleToggleLayoutEditUpTitle({ 100 simpleToggleLayoutEditEndCallback: (): void => this.onSimpleToggleLayoutEditEnd() 101 }) 102 } 103 .width('100%') 104 .height(this.style.titleHeight) 105 .margin({bottom: this.style.titleMarginBottom}) 106 } 107 108 Column() { 109 if (this.titleDisplayInside) { 110 Column() { 111 SimpleToggleLayoutEditUpTitle({ 112 simpleToggleLayoutEditEndCallback: (): void => this.onSimpleToggleLayoutEditEnd() 113 }) 114 } 115 .width('100%') 116 .height(this.style.titleHeight) 117 } 118 Column() { 119 SimpleToggleLayoutEditGrid({ 120 mToggles: $mNewDisplayingToggles, 121 mMaxCount: this.mDisplayingTogglesMaxCount, 122 mMinCount: this.mDisplayingTogglesMinCount, 123 mColumnCount: this.mColumnCount, 124 mGlobalDragToggleName: this.mCurrentDragToggleName, 125 gridTag: 'displaying', 126 onItemDragStart: (toggleName) => this.onDisplayingGridItemDragStart(toggleName), 127 onItemDrop: (status) => this.onDisplayingGridItemDrop(status) 128 }) 129 } 130 .margin({top: this.style.upGridMarginTop, bottom: this.style.upGridMarginBottom, left: this.style.gridMarginLeft, right: this.style.gridMarginRight}) 131 132 Column() { 133 Column() { 134 SimpleToggleLayoutEditOptMsg({ 135 mOptMsg: $mOptMsg 136 }) 137 }.margin({top: this.style.msgMarginTop}) 138 139 Column() { 140 SimpleToggleLayoutEditGrid({ 141 mToggles: $mNewHidingToggles, 142 mMaxCount: this.mHidingTogglesMaxCount, 143 mMinCount: this.mHidingTogglesMinCount, 144 mColumnCount: this.mColumnCount, 145 mGlobalDragToggleName: this.mCurrentDragToggleName, 146 gridTag: 'hiding', 147 onItemDragStart: (toggleName) => this.onHidingGridItemDragStart(toggleName), 148 onItemDrop: (status) => this.onHidingGridItemDrop(status) 149 }) 150 }.margin({top: this.style.msgMarginBottom, bottom: this.style.btnMarginTop, left: this.style.gridMarginLeft, right: this.style.gridMarginRight}) 151 152 Grid() { 153 GridItem() { 154 Button({ type: ButtonType.Capsule, stateEffect: true }) { 155 Text($r("app.string.control_center_simple_toggle_layout_edit_reset")) 156 .fontColor(this.style.editBtnFontColor) 157 .fontSize(this.style.editBtnFontSize) 158 .fontWeight(FontWeight.Medium) 159 } 160 .backgroundColor(this.style.editBtnBgColor) 161 .width('100%') 162 .height('100%') 163 .onClick(this.onResetBtnClick.bind(this)) 164 } 165 166 GridItem() { 167 Button({ type: ButtonType.Capsule, stateEffect: true }) { 168 Text($r("app.string.control_center_simple_toggle_layout_edit_finish")) 169 .fontColor(this.style.editBtnFontColor) 170 .fontSize(this.style.editBtnFontSize) 171 .fontWeight(FontWeight.Medium) 172 } 173 .backgroundColor(this.style.editBtnBgColor) 174 .width('100%') 175 .height('100%') 176 .onClick(this.onFinishBtnClick.bind(this)) 177 } 178 } 179 .height(this.style.editBtnHeight) 180 .margin({bottom: this.style.btnMarginBottom}) 181 .padding({left: this.style.editBtnMarginLeft, right: this.style.editBtnMarginRight}) 182 .columnsTemplate('1fr 1fr') 183 .rowsTemplate('1fr') 184 .columnsGap(this.style.editBtnSpace) 185 } 186 .width('100%') 187 .backgroundColor(this.style.downAreaBgColor) 188 189 } 190 .margin({left: this.style.marginLeft, right: this.style.marginRight}) 191 .borderRadius(this.style.borderRadius) 192 .backgroundColor(this.style.upAreaBgColor) 193 .clip(true) 194 195 } 196 .width('100%') 197 .margin({top: this.style.marginTop}) 198 .onTouch(this.onComponentTouch.bind(this)) 199 } 200 201 onSimpleToggleLayoutEditEnd() { 202 Log.showDebug(TAG, `onSimpleToggleLayoutEditEnd`); 203 let changed = JSON.stringify(this.mDisplayingToggles) != JSON.stringify(this.mNewDisplayingToggles); 204 Log.showDebug(TAG, `onSimpleToggleLayoutEditEnd, changed: ${changed}`); 205 if (changed) { 206 this.backDialogController?.open(); 207 } else { 208 this.callSimpleToggleLayoutEditEnd(); 209 }; 210 } 211 212 callSimpleToggleLayoutEditEnd() { 213 Log.showDebug(TAG, `callSimpleToggleLayoutEditEnd`); 214 if (this.simpleToggleLayoutEditEndCallback) { 215 this.simpleToggleLayoutEditEndCallback(); 216 }; 217 } 218 219 onResetBtnClick(event: ClickEvent) { 220 Log.showDebug(TAG, `onResetBtnClick`); 221 let equalDefault = JSON.stringify(this.mDefaultDisplayToggles) == JSON.stringify(this.mNewDisplayingToggles); 222 Log.showDebug(TAG, `onResetBtnClick, equalDefault: ${equalDefault}`); 223 if (!equalDefault) { 224 this.resetDialogController?.open(); 225 }; 226 } 227 228 editResetConfirm() { 229 Log.showDebug(TAG, `editResetConfirm`); 230 this.resetData(); 231 this.callSaveDisplayingToggles(); 232 } 233 234 resetData(): void{ 235 Log.showDebug(TAG, `resetData`); 236 let tempDisplayingToggles: string[] = [...this.mDefaultDisplayToggles]; 237 let tempHidingToggles: string[] = []; 238 this.mDisplayingToggles.forEach((toggleName) => { 239 if (tempDisplayingToggles.indexOf(toggleName) < 0) { 240 tempHidingToggles.push(toggleName); 241 }; 242 }) 243 this.mHidingToggles.forEach((toggleName) => { 244 if (tempDisplayingToggles.indexOf(toggleName) < 0) { 245 tempHidingToggles.push(toggleName); 246 }; 247 }) 248 this.mNewDisplayingToggles = tempDisplayingToggles; 249 this.mNewHidingToggles = tempHidingToggles; 250 this.mDisplayingToggles = [...tempDisplayingToggles]; 251 this.mHidingToggles = [...tempHidingToggles]; 252 Log.showDebug(TAG, `resetData, mNewDisplayingToggles: ${JSON.stringify(this.mNewDisplayingToggles)}`); 253 Log.showDebug(TAG, `resetData, mNewHidingToggles: ${JSON.stringify(this.mNewHidingToggles)}`); 254 } 255 256 onFinishBtnClick() { 257 Log.showDebug(TAG, `onFinishBtnClick`); 258 let changed = JSON.stringify(this.mDisplayingToggles) != JSON.stringify(this.mNewDisplayingToggles); 259 Log.showDebug(TAG, `onFinishBtnClick, changed: ${changed}`); 260 if (changed) { 261 this.callSaveDisplayingToggles(); 262 } 263 this.callSimpleToggleLayoutEditEnd(); 264 } 265 266 callSaveDisplayingToggles(): void{ 267 Log.showDebug(TAG, `callSaveDisplayingToggles`); 268 if (this.onSaveDisplayingToggles) { 269 this.onSaveDisplayingToggles(this.mNewDisplayingToggles); 270 }; 271 } 272 273 async onDisplayingGridItemDragStart(toggleName: string): Promise<void> { 274 Log.showDebug(TAG, `onDisplayingGridItemDragStart, toggleName: ${toggleName}`); 275 this.mCurrentDragToggleName = toggleName; 276 this.setOptMsg(toggleName); 277 } 278 279 async onDisplayingGridItemDrop(status: string): Promise<void> { 280 Log.showDebug(TAG, `onDisplayingGridItemDrop, status: ${status}`); 281 this.setOptMsg(''); 282 } 283 284 async onHidingGridItemDragStart(toggleName: string): Promise<void> { 285 Log.showDebug(TAG, `onHidingGridItemDragStart, toggleName: ${toggleName}`); 286 this.mCurrentDragToggleName = toggleName; 287 this.setOptMsg(toggleName); 288 } 289 290 async onHidingGridItemDrop(status: string): Promise<void> { 291 Log.showDebug(TAG, `onHidingGridItemDrop, status: ${status}`); 292 this.setOptMsg(''); 293 } 294 295 setOptMsg(toggleName: string): void { 296 Log.showInfo(TAG, `setOptMsg, toggleName: ${toggleName}, toggleName.length: ${toggleName.length}`); 297 if (!toggleName || toggleName.length == 0) { 298 this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_desc'); 299 return; 300 } 301 if (this.mNewDisplayingToggles.indexOf(toggleName) >= 0) { 302 if (this.mNewDisplayingToggles.length <= this.mDisplayingTogglesMinCount) { 303 this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_min', this.mDisplayingTogglesMinCount.toString()); 304 } else { 305 this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_drag'); 306 } 307 } else if (this.mNewHidingToggles.indexOf(toggleName) >= 0) { 308 if (this.mNewDisplayingToggles.length >= this.mDisplayingTogglesMaxCount) { 309 this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_max', this.mDisplayingTogglesMaxCount.toString()); 310 } else { 311 this.mOptMsg = $r('app.string.control_center_simple_toggle_layout_edit_opt_drag'); 312 } 313 }; 314 } 315 316 onComponentTouch(event: TouchEvent) { 317 Log.showDebug(TAG, `onComponentTouch`); 318 event.stopPropagation(); 319 } 320} 321 322@Component 323struct SimpleToggleLayoutEditUpTitle { 324 private simpleToggleLayoutEditEndCallback: Function = () => {}; 325 @State style: SimpleToggleLayoutEditUpTitleStyle = StyleConfiguration.getSimpleToggleLayoutEditUpTitleStyle(); 326 327 aboutToAppear() { 328 Log.showInfo(TAG_SimpleToggleLayoutEditUpTitle, 'aboutToAppear'); 329 } 330 331 aboutToDisappear() { 332 Log.showInfo(TAG_SimpleToggleLayoutEditUpTitle, 'aboutToDisappear '); 333 } 334 335 build() { 336 Row() { 337 Image($r('app.media.ic_public_back')) 338 .margin({left: this.style.marginLeft, right: this.style.editTitleSpace}) 339 .objectFit(ImageFit.Contain) 340 .size({ width: this.style.imageWidth, 341 height: this.style.imageHeight }) 342 .fillColor(this.style.fontColor) 343 .onClick(this.backClick.bind(this)) 344 Text($r('app.string.control_center_simple_toggle_layout_edit')) 345 .fontColor(this.style.fontColor) 346 .fontSize(this.style.titleFontSize) 347 .fontWeight(FontWeight.Medium) 348 }.width('100%') 349 .height('100%') 350 } 351 352 backClick(event: ClickEvent) { 353 Log.showDebug(TAG_SimpleToggleLayoutEditUpTitle, `backClick, event: ${JSON.stringify(event)}`); 354 this.simpleToggleLayoutEditEndCallback(); 355 } 356} 357 358@Component 359struct SimpleToggleLayoutEditOptMsg { 360 @Link mOptMsg: Resource; 361 @State style: SimpleToggleLayoutEditOptMsgStyle = StyleConfiguration.getSimpleToggleLayoutEditOptMsgStyle(); 362 363 aboutToAppear() { 364 Log.showInfo(TAG_SimpleToggleLayoutEditOptMsg, 'aboutToAppear'); 365 } 366 367 aboutToDisappear() { 368 Log.showInfo(TAG_SimpleToggleLayoutEditOptMsg, 'aboutToDisappear '); 369 } 370 371 build() { 372 Column() { 373 Text(this.mOptMsg) 374 .fontSize(this.style.fontSize) 375 .fontColor(this.style.fontColor) 376 } 377 .height(this.style.height) 378 .margin({left: this.style.marginLeftRight, right: this.style.marginLeftRight}) 379 .justifyContent(FlexAlign.Center) 380 } 381}