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 16 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PICKER_RENDER_PICKER_BASE_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PICKER_RENDER_PICKER_BASE_H 18 19 #include <functional> 20 #include <vector> 21 22 #include "core/components/box/render_box.h" 23 #include "core/components/button/render_button.h" 24 #include "core/components/checkable/render_checkbox.h" 25 #include "core/components/gesture_listener/render_gesture_listener.h" 26 #include "core/components/picker/picker_base_component.h" 27 #include "core/components/picker/picker_text_component.h" 28 #include "core/components/picker/render_picker_column.h" 29 #include "core/components/stack/render_stack.h" 30 #include "core/components/triangle/render_triangle.h" 31 #include "core/gestures/click_recognizer.h" 32 #include "core/gestures/drag_recognizer.h" 33 #include "core/gestures/raw_recognizer.h" 34 #include "core/pipeline/base/render_node.h" 35 36 namespace OHOS::Ace { 37 38 class RenderPickerBase : public RenderNode { 39 DECLARE_ACE_TYPE(RenderPickerBase, RenderNode); 40 41 public: 42 static RefPtr<RenderNode> Create(); 43 void Update(const RefPtr<Component>& component) override; 44 void PerformLayout() override; 45 OnPaintFinish()46 void OnPaintFinish() override 47 { 48 UpdateAccessibility(); 49 } 50 StartAnimation()51 void StartAnimation() 52 { 53 if (!data_) { 54 return; 55 } 56 data_->OnAnimationPlaying(); 57 } 58 59 void UpdateRenders(); 60 FlushColumnsOptions()61 void FlushColumnsOptions() 62 { 63 if (switch_ && data_ && data_->GetLunar()) { 64 auto lunar = data_->GetLunar(); 65 lunar->SetValue(data_->IsShowLunar()); 66 switch_->Update(lunar); 67 switch_->MarkNeedLayout(); 68 } 69 for (const auto& column : columns_) { 70 column->FlushCurrentOptions(); 71 } 72 } 73 74 bool TouchTest(const Point& globalPoint, const Point& parentLocalPoint, const TouchRestrict& touchRestrict, 75 TouchTestResult& result) override; 76 GetPickerBaseComponent()77 const RefPtr<PickerBaseComponent>& GetPickerBaseComponent() const 78 { 79 return data_; 80 } 81 GetRenderPickerColumn()82 const std::vector<RefPtr<RenderPickerColumn>>& GetRenderPickerColumn() const 83 { 84 return columns_; 85 } 86 GetColumnHeight()87 const Dimension& GetColumnHeight() const 88 { 89 return columnHeight_; 90 } 91 GetRange()92 const std::vector<std::string>& GetRange() const 93 { 94 return range_; 95 } 96 GetSelected()97 uint32_t GetSelected() const 98 { 99 return selectedIndex_; 100 } 101 GetStartDate()102 const PickerDate& GetStartDate() const 103 { 104 return startDateSolar_; 105 } 106 GetEndDate()107 const PickerDate& GetEndDate() const 108 { 109 return endDateSolar_; 110 } 111 GetSelectedDate()112 const PickerDate& GetSelectedDate() const 113 { 114 return selectedDate_; 115 } 116 GetType()117 const std::string GetType() const 118 { 119 return type_; 120 } 121 122 protected: OnTouchTestHit(const Offset &,const TouchRestrict &,TouchTestResult & result)123 void OnTouchTestHit(const Offset&, const TouchRestrict&, TouchTestResult& result) override 124 { 125 if (data_ && !data_->GetSubsidiary()) { 126 result.emplace_back(rawDetect_); 127 } 128 } 129 SetTextOnCancel(const std::function<void (void)> & value)130 void SetTextOnCancel(const std::function<void(void)>& value) 131 { 132 onTextCancel_ = value; 133 } 134 SetTextOnAccept(const std::function<void (const std::string &,double)> & value)135 void SetTextOnAccept(const std::function<void(const std::string&, double)>& value) 136 { 137 onTextAccept_ = value; 138 } 139 SetTextOnChange(const std::function<void (const std::string &,double)> & value)140 void SetTextOnChange(const std::function<void(const std::string&, double)>& value) 141 { 142 onTextChange_ = value; 143 } 144 145 void InitializeSelectedOption(const RefPtr<RenderPickerColumn>& pickerColumn); 146 const RefPtr<RenderBox> GetBgColorBox() const; 147 Size focusBoxSize_; 148 Offset focusBoxOffset_; 149 150 RefPtr<PickerBaseComponent> data_; 151 std::vector<RefPtr<RenderPickerColumn>> columns_; 152 RefPtr<RenderBox> box_; 153 RefPtr<RenderNode> columnParent_; 154 155 std::function<void(void)> onTextCancel_; 156 std::function<void(const std::string&, double)> onTextAccept_; 157 std::function<void(const std::string&, double)> onTextChange_; 158 159 private: 160 void HandleFinish(bool success); 161 void HandleSwitch(bool checked); 162 void HandleColumnChange(const std::string& tag, bool isAdd, uint32_t index, bool needNotify); 163 164 void GetRenders(); 165 void GetRenders(const RefPtr<RenderNode>& render); 166 void DealRenders(const RefPtr<RenderNode>& render); 167 void ClearRenders(); 168 169 void InitPickerAnimation(); 170 171 void SetButtonHandler(); 172 void SetSwitchHandler(); 173 174 void LayoutBoxes(); 175 void LayoutColumns(); 176 void SetOutBoxBorderRadius(); 177 178 void UpdateAccessibility(); 179 void UpdateTextAccessibility(const RefPtr<AccessibilityNode>& node, const RefPtr<RenderText>& text); 180 void UpdateButtonAccessibility(const RefPtr<AccessibilityNode>& node, const RefPtr<RenderButton>& button); 181 void UpdateSwitchAccessibility(const RefPtr<AccessibilityNode>& node, const RefPtr<RenderCheckbox>& renderSwitch); 182 // used for inspector node in PC preview 183 void UpdatePickerDialogAccessibility(const RefPtr<AccessibilityNode>& node, const RefPtr<RenderBox>& box); 184 185 void SetTriangleHandler(); 186 void HandleTriangleClick(bool value); 187 188 bool onChildTouchTest(const RefPtr<RenderNode>& child, const TouchRestrict& touchRestrict, TouchTestResult& result); 189 190 enum DialogStatus { 191 ACCEPT = 0, 192 CANCEL, 193 UPDATE, 194 }; 195 196 bool switchHandlerSetted_ = false; 197 bool hasLayout_ = false; 198 Dimension columnHeight_; 199 uint32_t selectedIndex_ = 0; 200 std::vector<std::string> range_ {""}; 201 std::string type_ = "DatePickerType.Date"; 202 PickerDate startDateSolar_ = PickerDate(1970, 1, 1); 203 PickerDate endDateSolar_ = PickerDate(2100, 12, 31); 204 PickerDate selectedDate_ = PickerDate::Current(); 205 206 std::function<void()> onCancelCallback_; 207 std::function<void(const std::shared_ptr<BaseEventInfo>&)> onChangeCallback_; 208 std::function<void(const std::string&)> onJSChangeCallback_; 209 std::function<void(const std::string&)> onColumnChangeCallback_; 210 std::function<void(const std::string&)> onDialogAccept_; 211 std::function<void()> onDialogCancel_; 212 std::function<void(const std::string&)> onDialogChange_; 213 RefPtr<RenderText> title_; 214 RefPtr<RenderTriangle> triangle_; 215 RefPtr<RenderDisplay> lunarDisplay_; 216 RefPtr<RenderDisplay> buttonsDisplay_; 217 RefPtr<RenderStack> stack_; 218 RefPtr<RenderBox> outBox_; 219 RefPtr<RenderButton> cancel_; 220 RefPtr<RenderButton> ok_; 221 RefPtr<RenderCheckbox> switch_; 222 RefPtr<RenderText> lunarText_; 223 RefPtr<RawRecognizer> rawDetect_ = AceType::MakeRefPtr<RawRecognizer>(); 224 }; 225 226 } // namespace OHOS::Ace 227 228 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_PICKER_RENDER_PICKER_BASE_H 229