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 { StyleConstants } from '../constants/StyleConstants';
17import { amsMissionManager } from '../manager/AmsMissionManager'
18
19interface DataList {
20  name: string;
21  image: ResourceStr | PixelMap;
22  missionId: number;
23  boxSize: number;
24  bundleName: string;
25  left?: number;
26  right?: number;
27}
28
29@Component
30export struct ScrollerComponent {
31  @StorageLink('snapshotList') dataList: DataList[] = [];
32  @StorageLink('snapShotWidth') listWidth: number = 0;
33  scroller: Scroller = new Scroller();
34  private screenWidth = 800;
35  popupHide: Function = () => {};
36  updateData: Function = (isUpdate: boolean, bundleName: string, callback: () => void) => {};
37
38  aboutToDisappear(): void {
39  }
40
41  build() {
42    Row() {
43      Column() {
44        Button({ type: ButtonType.Circle, stateEffect: true }) {
45          Image($r('app.media.ic_public_arrow_left'))
46            .width(20)
47            .height(20)
48            .objectFit(ImageFit.Contain)
49        }
50        .width(24)
51        .height(24)
52        .backgroundColor('#00000005')
53        .onClick((event: ClickEvent) => {
54          this.scroller.scrollPage({ next: false })
55        })
56      }
57      .alignItems(HorizontalAlign.Center)
58      .justifyContent(FlexAlign.Center)
59      .width(StyleConstants.DEFAULT_56)
60      .height(StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT)
61      .visibility(this.listWidth > this.screenWidth ? Visibility.Visible : Visibility.None)
62
63      Scroll(this.scroller) {
64        Row({ space: StyleConstants.DEFAULT_14 }) {
65          ForEach(this.dataList, (item: DataList) => {
66            Column() {
67              Row() {
68                Text(item.name.toString())
69                  .height(StyleConstants.DEFAULT_24)
70                  .textOverflow({ overflow: TextOverflow.Ellipsis })
71                  .fontSize(StyleConstants.DEFAULT_14)
72                  .textAlign(TextAlign.Start)
73                  .maxLines(StyleConstants.DEFAULT_1)
74                  .width(item.boxSize - StyleConstants.DEFAULT_30)
75                  .hoverEffect(HoverEffect.None)
76                  .fontWeight(FontWeight.Medium)
77
78                Image($r('app.media.ic_public_cancel'))
79                  .width(StyleConstants.DEFAULT_16)
80                  .height(StyleConstants.DEFAULT_16)
81                  .objectFit(ImageFit.Contain)
82                  .margin({ right: StyleConstants.DEFAULT_4 })
83                  .onClick((event: ClickEvent) => {
84                    if (this.dataList.length <= 1) {
85                      this.updateData(false, '', () => amsMissionManager.clearMission(item.missionId));
86                      return
87                    }
88                    this.updateData(true, item.bundleName, () => amsMissionManager.clearMission(item.missionId));
89                  })
90              }
91              .alignItems(VerticalAlign.Center)
92              .justifyContent(FlexAlign.SpaceBetween)
93              .width(item.boxSize)
94
95              Image(item.image)
96                .height(StyleConstants.DEFAULT_SMART_DOCK_MISSION_IMAGE_HEIGHT)
97                .objectFit(ImageFit.Contain)
98                .borderRadius(StyleConstants.DEFAULT_8)
99                .hoverEffect(HoverEffect.None)
100            }
101            .onClick((event: ClickEvent) => {
102              this.popupHide();
103              amsMissionManager.moveMissionToFront(item.missionId);
104            })
105            .width(item.boxSize)
106            .borderRadius(StyleConstants.DEFAULT_5)
107            .justifyContent(FlexAlign.Center)
108          }, (item: DataList) => JSON.stringify(item))
109        }
110        .alignItems(VerticalAlign.Center)
111        .margin({
112          left: this.listWidth > this.screenWidth ? StyleConstants.DEFAULT_0 : StyleConstants.DEFAULT_14,
113          right: this.listWidth > this.screenWidth ? StyleConstants.DEFAULT_0 : StyleConstants.DEFAULT_14
114        })
115      }
116      .constraintSize({
117        maxWidth: this.screenWidth,
118        maxHeight: StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT
119      })
120      .scrollable(ScrollDirection.Horizontal)
121      .scrollBar(BarState.Off)
122      .height(StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT)
123
124      Column() {
125        Button({ type: ButtonType.Circle, stateEffect: true }) {
126          Image($r('app.media.ic_public_arrow_right'))
127            .width(20)
128            .height(20)
129            .objectFit(ImageFit.Contain)
130        }
131        .width(24)
132        .height(24)
133        .backgroundColor('#00000005')
134        .onClick((event: ClickEvent) => {
135          this.scroller.scrollPage({ next: true })
136        })
137      }
138      .alignItems(HorizontalAlign.Center)
139      .justifyContent(FlexAlign.Center)
140      .width(StyleConstants.DEFAULT_56)
141      .height(StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT)
142      .visibility(this.listWidth > this.screenWidth ? Visibility.Visible : Visibility.None)
143    }
144    .alignItems(VerticalAlign.Center)
145    .justifyContent(FlexAlign.SpaceBetween)
146    .constraintSize({
147      maxWidth: this.screenWidth + 2 * StyleConstants.DEFAULT_56,
148      maxHeight: StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT
149    })
150    .height(StyleConstants.DEFAULT_SMART_DOCK_MISSION_HEIGHT)
151    .visibility(this.dataList.length < 1 ? Visibility.None : Visibility.Visible)
152  }
153}