• 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 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}