1 /* 2 * Copyright (c) 2022-2023 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_PATTERNS_TIME_PICKER_TIME_PICKER_COLUMN_PATTERN_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_TIME_PICKER_TIME_PICKER_COLUMN_PATTERN_H 18 19 #include <utility> 20 21 #include "adapter/ohos/entrance/picker/picker_haptic_interface.h" 22 #include "base/i18n/localization.h" 23 #include "core/components/common/properties/color.h" 24 #include "core/components/picker/picker_base_component.h" 25 #include "core/components/picker/picker_date_component.h" 26 #include "core/components_ng/base/frame_node.h" 27 #include "core/components_ng/pattern/linear_layout/linear_layout_pattern.h" 28 #include "core/components_ng/pattern/picker_utils/picker_column_pattern.h" 29 #include "core/components_ng/pattern/picker_utils/picker_column_pattern_utils.h" 30 #include "core/components_ng/pattern/picker_utils/toss_animation_controller.h" 31 #include "core/components_ng/pattern/text/text_layout_property.h" 32 #include "core/components_ng/pattern/time_picker/timepicker_column_accessibility_property.h" 33 #include "core/components_ng/pattern/time_picker/timepicker_column_layout_algorithm.h" 34 #include "core/components_ng/pattern/time_picker/timepicker_layout_property.h" 35 36 namespace OHOS::Ace::NG { 37 38 class TimePickerColumnPattern : public PickerColumnPattern { 39 DECLARE_ACE_TYPE(TimePickerColumnPattern, PickerColumnPattern); 40 41 public: TimePickerColumnPattern()42 TimePickerColumnPattern() : PickerColumnPattern() {} 43 virtual ~TimePickerColumnPattern() = default; 44 CreateLayoutAlgorithm()45 RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override 46 { 47 auto layoutAlgorithm = MakeRefPtr<TimePickerColumnLayoutAlgorithm>(); 48 if (algorithmOffset_.size() == 0) { 49 ResetAlgorithmOffset(); 50 } 51 layoutAlgorithm->SetCurrentOffset(algorithmOffset_); 52 return layoutAlgorithm; 53 } 54 CreateLayoutProperty()55 RefPtr<LayoutProperty> CreateLayoutProperty() override 56 { 57 return MakeRefPtr<LinearLayoutProperty>(isVertical_); 58 } 59 CreateAccessibilityProperty()60 RefPtr<AccessibilityProperty> CreateAccessibilityProperty() override 61 { 62 return MakeRefPtr<TimePickerColumnAccessibilityProperty>(); 63 } 64 65 void FlushCurrentOptions(bool isDown = false, bool isUpateTextContentOnly = false, 66 bool isUpdateAnimationProperties = false, bool isTossPlaying = false) override; 67 void UpdateColumnChildPosition(double offsetY) override; 68 bool CanMove(bool isDown) const override; 69 void ScrollTimeColumn(); 70 void UpdateCurrentOffset(float offset); 71 GetOptions()72 const std::map<WeakPtr<FrameNode>, uint32_t>& GetOptions() const 73 { 74 return optionsTotalCount_; 75 } 76 SetOptions(const std::map<WeakPtr<FrameNode>,uint32_t> & value)77 void SetOptions(const std::map<WeakPtr<FrameNode>, uint32_t>& value) 78 { 79 optionsTotalCount_ = value; 80 } 81 82 uint32_t GetOptionCount() const override; 83 SetShowCount(const uint32_t showCount)84 void SetShowCount(const uint32_t showCount) 85 { 86 showCount_ = showCount; 87 GetHost()->MarkModifyDone(); 88 } 89 GetFocusPattern()90 FocusPattern GetFocusPattern() const override 91 { 92 return { FocusType::NODE, true }; 93 } 94 SetHour24(bool value)95 void SetHour24(bool value) 96 { 97 hour24_ = value; 98 } 99 GetHour24()100 bool GetHour24() const 101 { 102 return hour24_; 103 } 104 105 void UpdateScrollDelta(double delta); 106 107 void InitHapticController(const RefPtr<FrameNode>& host) override; 108 bool IsStartEndTimeDefined(); 109 bool IsTossNeedToStop() override; 110 GetEnterIndex()111 uint32_t GetEnterIndex() const 112 { 113 return currentEnterIndex_; 114 } 115 SetEnterIndex(uint32_t value)116 void SetEnterIndex(uint32_t value) 117 { 118 if (value != currentEnterIndex_) { 119 currentEnterIndex_ = value; 120 } 121 } 122 HandleEnterSelectedAreaEventCallback(bool refresh)123 void HandleEnterSelectedAreaEventCallback(bool refresh) 124 { 125 if (enterSelectedAreaEventCallback_) { 126 enterSelectedAreaEventCallback_(refresh); 127 } 128 } 129 GetEnterSelectedAreaEventCallback()130 const EventCallback& GetEnterSelectedAreaEventCallback() const 131 { 132 return enterSelectedAreaEventCallback_; 133 } 134 SetEnterSelectedAreaEventCallback(EventCallback && value)135 void SetEnterSelectedAreaEventCallback(EventCallback&& value) 136 { 137 enterSelectedAreaEventCallback_ = value; 138 } 139 GetButtonHoverColor()140 const Color& GetButtonHoverColor() const override 141 { 142 return hoverColor_; 143 } 144 GetButtonBgColor()145 const Color& GetButtonBgColor() const override 146 { 147 return buttonBgColor_; 148 } 149 GetButtonPressColor()150 const Color& GetButtonPressColor() const override 151 { 152 return pressColor_; 153 } 154 155 std::string GetCurrentOption() const override; 156 157 bool GetCanLoopFromLayoutProperty() const override; 158 159 private: 160 void OnModifyDone() override; 161 void SetDividerHeight(uint32_t showOptionCount); 162 void ChangeTextStyle(uint32_t index, uint32_t showOptionCount, const RefPtr<TextLayoutProperty>& textLayoutProperty, 163 const RefPtr<TimePickerLayoutProperty>& timePickerLayoutProperty); 164 void ChangeAmPmTextStyle(uint32_t index, uint32_t showOptionCount, 165 const RefPtr<TextLayoutProperty>& textLayoutProperty, 166 const RefPtr<TimePickerLayoutProperty>& timePickerLayoutProperty); 167 168 void InitOnKeyEvent(const RefPtr<FocusHub>& focusHub); 169 bool OnKeyEvent(const KeyEvent& event); 170 bool HandleDirectionKey(KeyCode code); 171 void UpdateSelectedTextColor(const RefPtr<PickerTheme>& pickerTheme) override; 172 void GetAnimationColor(uint32_t index, uint32_t showCount, Color& color, bool selectedMark = false); 173 void UpdateAnimationColor(const RefPtr<PickerTheme>& pickerTheme); 174 #ifdef SUPPORT_DIGITAL_CROWN 175 void HandleCrownMoveEvent(const CrownEvent& event); 176 #endif 177 void TextPropertiesLinearAnimation(const RefPtr<TextLayoutProperty>& textLayoutProperty, uint32_t index, 178 uint32_t showCount, bool isDown, double scale) override; 179 void InitTextFontFamily() override; 180 void HandleEnterSelectedArea(double scrollDelta, float shiftDistance, PickerScrollDirection dir) override; 181 182 Color pressColor_; 183 Color hoverColor_; 184 Color buttonBgColor_ = Color::TRANSPARENT; 185 bool hour24_ = SystemProperties::Is24HourClock(); 186 // column options number 187 std::map<WeakPtr<FrameNode>, uint32_t> optionsTotalCount_; 188 EventCallback enterSelectedAreaEventCallback_; 189 uint32_t currentEnterIndex_ = 0; 190 bool isVertical_ = true; 191 float gradientHeight_ = 0.0f; 192 float dividerHeight_ = 0.0f; 193 float dividerSpacingWidth_ = 0.0f; 194 double enterDelta_ = 0.0; 195 float dividerSpacing_ = 0.0f; 196 bool hasAppCustomFont_ = false; 197 bool hasUserDefinedDisappearFontFamily_ = false; 198 bool hasUserDefinedNormalFontFamily_ = false; 199 bool hasUserDefinedSelectedFontFamily_ = false; 200 bool isTossReadyToStop_ = false; 201 ACE_DISALLOW_COPY_AND_MOVE(TimePickerColumnPattern); 202 friend class PickerColumnPatternCircleUtils<TimePickerColumnPattern>; 203 }; 204 } // namespace OHOS::Ace::NG 205 206 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_TIME_PICKER_TIME_PICKER_COLUMN_PATTERN_H 207