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