1c41cb6d2Sopenharmony_ci/**
2c41cb6d2Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3c41cb6d2Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c41cb6d2Sopenharmony_ci * you may not use this file except in compliance with the License.
5c41cb6d2Sopenharmony_ci * You may obtain a copy of the License at
6c41cb6d2Sopenharmony_ci *
7c41cb6d2Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c41cb6d2Sopenharmony_ci *
9c41cb6d2Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c41cb6d2Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c41cb6d2Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c41cb6d2Sopenharmony_ci * See the License for the specific language governing permissions and
13c41cb6d2Sopenharmony_ci * limitations under the License.
14c41cb6d2Sopenharmony_ci */
15c41cb6d2Sopenharmony_ciimport ComponentConfig from './ComponentConfig';
16c41cb6d2Sopenharmony_ci
17c41cb6d2Sopenharmony_ci/**
18c41cb6d2Sopenharmony_ci * Slider component
19c41cb6d2Sopenharmony_ci */
20c41cb6d2Sopenharmony_ci@Component
21c41cb6d2Sopenharmony_ciexport default struct SliderComponent {
22c41cb6d2Sopenharmony_ci  @State clickConfirm: boolean = true;
23c41cb6d2Sopenharmony_ci  @State showStep: boolean = false;
24c41cb6d2Sopenharmony_ci  @State value: number = 0;
25c41cb6d2Sopenharmony_ci  @State fontSize: number = 18; // Font size
26c41cb6d2Sopenharmony_ci  private visible: boolean = true;
27c41cb6d2Sopenharmony_ci  private min: number = 0;
28c41cb6d2Sopenharmony_ci  private max: number = 100;
29c41cb6d2Sopenharmony_ci  private step: number = 1;
30c41cb6d2Sopenharmony_ci  private leftImage: string = '';
31c41cb6d2Sopenharmony_ci  private rightImage: string = '';
32c41cb6d2Sopenharmony_ci  private onChange?: (value: number, mode: SliderChangeMode) => void
33c41cb6d2Sopenharmony_ci  private summary: string | Resource = ''; // Text details
34c41cb6d2Sopenharmony_ci
35c41cb6d2Sopenharmony_ci  build() {
36c41cb6d2Sopenharmony_ci    Flex({ direction: FlexDirection.Row }) {
37c41cb6d2Sopenharmony_ci      Column() {
38c41cb6d2Sopenharmony_ci        Image(this.leftImage)
39c41cb6d2Sopenharmony_ci          .width($r('app.float.slider_image_width'))
40c41cb6d2Sopenharmony_ci          .height($r('app.float.slider_image_height'))
41c41cb6d2Sopenharmony_ci          .objectFit(ImageFit.Contain);
42c41cb6d2Sopenharmony_ci      }
43c41cb6d2Sopenharmony_ci      .align(Alignment.TopStart)
44c41cb6d2Sopenharmony_ci      .visibility(this.visible ? Visibility.Visible : Visibility.None)
45c41cb6d2Sopenharmony_ci      .padding({ left: $r('app.float.slider_image_margin') })
46c41cb6d2Sopenharmony_ci      .onClick(() => {
47c41cb6d2Sopenharmony_ci        if (this.value != this.min && this.clickConfirm) {
48c41cb6d2Sopenharmony_ci          this.value = Math.max(this.min, this.value - this?.step);
49c41cb6d2Sopenharmony_ci          this.onChangeHandler(this.value, SliderChangeMode.End);
50c41cb6d2Sopenharmony_ci        }
51c41cb6d2Sopenharmony_ci      })
52c41cb6d2Sopenharmony_ci      .align(Alignment.Center)
53c41cb6d2Sopenharmony_ci
54c41cb6d2Sopenharmony_ci      Column() {
55c41cb6d2Sopenharmony_ci        Row() {
56c41cb6d2Sopenharmony_ci          Text(this.summary)
57c41cb6d2Sopenharmony_ci            .fontSize(this.fontSize)
58c41cb6d2Sopenharmony_ci            .textAlign(TextAlign.Start);
59c41cb6d2Sopenharmony_ci        }
60c41cb6d2Sopenharmony_ci        .width(ComponentConfig.WH_83_100)
61c41cb6d2Sopenharmony_ci
62c41cb6d2Sopenharmony_ci        Slider({
63c41cb6d2Sopenharmony_ci          value: this.value,
64c41cb6d2Sopenharmony_ci          min: this.min,
65c41cb6d2Sopenharmony_ci          max: this.max,
66c41cb6d2Sopenharmony_ci          step: this.step
67c41cb6d2Sopenharmony_ci        })
68c41cb6d2Sopenharmony_ci          .selectedColor(Color.Blue)
69c41cb6d2Sopenharmony_ci          .blockColor(Color.Blue)
70c41cb6d2Sopenharmony_ci          .width(ComponentConfig.WH_100_100)
71c41cb6d2Sopenharmony_ci          .showSteps(this.showStep)
72c41cb6d2Sopenharmony_ci          .onChange((value, mode) => {
73c41cb6d2Sopenharmony_ci            this.onChangeHandler(value, mode)
74c41cb6d2Sopenharmony_ci          });
75c41cb6d2Sopenharmony_ci      }.align(Alignment.Center).flexGrow(1)
76c41cb6d2Sopenharmony_ci
77c41cb6d2Sopenharmony_ci      Column() {
78c41cb6d2Sopenharmony_ci        Image(this.rightImage)
79c41cb6d2Sopenharmony_ci          .width($r('app.float.slider_image_width'))
80c41cb6d2Sopenharmony_ci          .height($r('app.float.slider_image_height'))
81c41cb6d2Sopenharmony_ci          .align(Alignment.Start)
82c41cb6d2Sopenharmony_ci          .objectFit(ImageFit.Contain);
83c41cb6d2Sopenharmony_ci      }
84c41cb6d2Sopenharmony_ci      .align(Alignment.TopEnd)
85c41cb6d2Sopenharmony_ci      .visibility(this.visible ? Visibility.Visible : Visibility.None)
86c41cb6d2Sopenharmony_ci      .padding({ right: $r('app.float.slider_image_margin') })
87c41cb6d2Sopenharmony_ci      .onClick(() => {
88c41cb6d2Sopenharmony_ci        if (this.value != this.max && this.clickConfirm) {
89c41cb6d2Sopenharmony_ci          this.value = Math.min(this.max, this.value + this?.step);
90c41cb6d2Sopenharmony_ci          this.onChangeHandler(this.value, SliderChangeMode.End);
91c41cb6d2Sopenharmony_ci        }
92c41cb6d2Sopenharmony_ci      })
93c41cb6d2Sopenharmony_ci      .align(Alignment.Center)
94c41cb6d2Sopenharmony_ci
95c41cb6d2Sopenharmony_ci    }.width(ComponentConfig.WH_100_100).align(Alignment.TopStart)
96c41cb6d2Sopenharmony_ci  }
97c41cb6d2Sopenharmony_ci
98c41cb6d2Sopenharmony_ci  /**
99c41cb6d2Sopenharmony_ci   * Change handler
100c41cb6d2Sopenharmony_ci   *
101c41cb6d2Sopenharmony_ci   * @param value - Change value
102c41cb6d2Sopenharmony_ci   * @param mode - State
103c41cb6d2Sopenharmony_ci   */
104c41cb6d2Sopenharmony_ci  onChangeHandler(value: number, mode: SliderChangeMode) {
105c41cb6d2Sopenharmony_ci    if (this.onChange) {
106c41cb6d2Sopenharmony_ci      this.onChange(value, mode);
107c41cb6d2Sopenharmony_ci    }
108c41cb6d2Sopenharmony_ci  }
109c41cb6d2Sopenharmony_ci}