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