• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 
16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_PICKER_COLUMN_PATTERN_UTILS_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_PICKER_COLUMN_PATTERN_UTILS_H
18 
19 #include <utility>
20 #include <string>
21 
22 #include "core/components/picker/picker_theme.h"
23 #include "core/pipeline_ng/pipeline_context.h"
24 #include "core/components_ng/pattern/picker/picker_type_define.h"
25 
26 namespace OHOS::Ace::NG {
27 
28 template<class T>
29 class PickerColumnPatternCircleUtils {
30 public:
PickerColumnPatternCircleUtils()31     PickerColumnPatternCircleUtils() {}
32 
~PickerColumnPatternCircleUtils()33     virtual ~PickerColumnPatternCircleUtils() {}
34 
35     void SetSelectedMark(
36         T* pickerColumn, RefPtr<PickerTheme>& pickerTheme, bool focus, bool notify = true, bool reRender = true)
37     {
38         CHECK_NULL_VOID(pickerTheme);
39         CHECK_NULL_VOID(pickerColumn);
40         if (selectedMark_ == focus) {
41             return;
42         }
43         selectedMark_ = focus;
44         pickerColumn->SetSelectedMarkPaint(selectedMark_);
45         if (reRender) {
46             pickerColumn->UpdateSelectedTextColor(pickerTheme);
47         }
48 
49         if (focus && notify && pickerColumn->focusedListerner_) {
50             pickerColumn->focusedListerner_(pickerColumn->selectedColumnId_);
51         }
52     }
53 
54 #ifdef SUPPORT_DIGITAL_CROWN
GetCrownRotatePx(const CrownEvent & event,int32_t crownSensitivity)55     double GetCrownRotatePx(const CrownEvent& event, int32_t crownSensitivity)
56     {
57         float ration[][2] = {
58             {PICKER_ANGULAR_VELOCITY_SLOW, PICKER_DISPLAY_CONTROL_RATIO_VERY_SLOW},
59             {PICKER_ANGULAR_VELOCITY_MEDIUM, PICKER_DISPLAY_CONTROL_RATIO_SLOW},
60             {PICKER_ANGULAR_VELOCITY_FAST, PICKER_DISPLAY_CONTROL_RATIO_MEDIUM}};
61         double velocity = std::abs(event.angularVelocity * PICKER_ANGULAR_VELOCITY_FACTOR);
62         double px = (Dimension(PICKER_DISPLAY_CONTROL_RATIO_FAST, DimensionUnit::VP) * event.degree).ConvertToPx();
63         // Calculate the offset based on the angle of rotation of the crown
64         for (size_t i = 0; i < sizeof(ration) / sizeof(ration[0]); i++) {
65             if (LessOrEqualCustomPrecision(velocity, ration[i][0], 0.01f)) {
66                 px = (Dimension(ration[i][1], DimensionUnit::VP) * event.degree).ConvertToPx();
67                 break;
68             }
69         }
70 
71         switch (crownSensitivity) {
72             case static_cast<int32_t>(OHOS::Ace::CrownSensitivity::LOW):
73                 px *= PICKER_CROWN_SENSITIVITY_LOW;
74                 break;
75             case static_cast<int32_t>(OHOS::Ace::CrownSensitivity::MEDIUM):
76                 px *= PICKER_CROWN_SENSITIVITY_MEDIUM;
77                 break;
78             case static_cast<int32_t>(OHOS::Ace::CrownSensitivity::HIGH):
79                 px *= PICKER_CROWN_SENSITIVITY_HIGH;
80                 break;
81             default:
82                 px *= PICKER_CROWN_SENSITIVITY_MEDIUM;
83                 break;
84         }
85 
86         return px;
87     }
88 
OnCrownEvent(T * pickerColumn,const CrownEvent & event)89     bool OnCrownEvent(T* pickerColumn, const CrownEvent& event)
90     {
91         CHECK_NULL_RETURN(pickerColumn, false);
92         switch (event.action) {
93             case OHOS::Ace::CrownAction::BEGIN:
94                 pickerColumn->HandleCrownBeginEvent(event);
95                 break;
96             case OHOS::Ace::CrownAction::UPDATE:
97                 pickerColumn->HandleCrownMoveEvent(event);
98                 break;
99             case OHOS::Ace::CrownAction::END:
100                 pickerColumn->HandleCrownEndEvent(event);
101                 break;
102             default:
103                 return false;
104                 break;
105         }
106 
107         return true;
108     }
109 #endif
110 
111 private:
112     bool selectedMark_ = false;
113 };
114 
115 }
116 
117 #endif
118