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