1 /*
2 * Copyright (c) 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 #include "core/components_ng/pattern/stepper/stepper_model_ng.h"
17
18 #include "base/i18n/localization.h"
19 #include "core/components_ng/base/view_stack_processor.h"
20 #include "core/components_ng/pattern/stepper/stepper_node.h"
21 #include "core/components_ng/pattern/stepper/stepper_pattern.h"
22 #include "core/components_ng/pattern/swiper/swiper_pattern.h"
23 #include "core/components_v2/inspector/inspector_constants.h"
24
25 namespace OHOS::Ace::NG {
26
Create(uint32_t index)27 void StepperModelNG::Create(uint32_t index)
28 {
29 auto* stack = ViewStackProcessor::GetInstance();
30 auto nodeId = stack->ClaimNodeId();
31 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::STEPPER_ETS_TAG, nodeId);
32 auto stepperNode = StepperNode::GetOrCreateStepperNode(
33 V2::STEPPER_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<StepperPattern>(); });
34 stack->Push(stepperNode);
35 bool hasSwiperNode = stepperNode->HasSwiperNode();
36 auto swiperId = stepperNode->GetSwiperId();
37 RefPtr<FrameNode> swiperNode;
38 if (!hasSwiperNode) {
39 swiperNode = CreateSwiperChild(swiperId, index);
40 swiperNode->MountToParent(stepperNode);
41 ACE_UPDATE_LAYOUT_PROPERTY(StepperLayoutProperty, Index, index);
42 } else {
43 swiperNode = AceType::DynamicCast<FrameNode>(
44 stepperNode->GetChildAtIndex(stepperNode->GetChildIndexById(stepperNode->GetSwiperId())));
45 CHECK_NULL_VOID(swiperNode);
46 auto swiperController = swiperNode->GetPattern<SwiperPattern>()->GetSwiperController();
47 swiperController->SwipeTo(index);
48 }
49 auto swiperPaintProperty = swiperNode->GetPaintProperty<SwiperPaintProperty>();
50 if (swiperPaintProperty) {
51 swiperPaintProperty->UpdateCurve(Curves::LINEAR);
52 }
53 }
54
SetOnFinish(RoutineCallbackEvent && eventOnFinish)55 void StepperModelNG::SetOnFinish(RoutineCallbackEvent&& eventOnFinish)
56 {
57 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
58 CHECK_NULL_VOID(frameNode);
59 auto eventHub = frameNode->GetEventHub<StepperEventHub>();
60 CHECK_NULL_VOID(eventHub);
61 eventHub->SetFinishEvent(std::move(eventOnFinish));
62 }
63
SetOnSkip(RoutineCallbackEvent && eventOnSkip)64 void StepperModelNG::SetOnSkip(RoutineCallbackEvent&& eventOnSkip)
65 {
66 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
67 CHECK_NULL_VOID(frameNode);
68 auto eventHub = frameNode->GetEventHub<StepperEventHub>();
69 CHECK_NULL_VOID(eventHub);
70 eventHub->SetSkipEvent(std::move(eventOnSkip));
71 }
72
SetOnChange(IndexCallbackEvent && eventOnChange)73 void StepperModelNG::SetOnChange(IndexCallbackEvent&& eventOnChange)
74 {
75 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
76 CHECK_NULL_VOID(frameNode);
77 auto eventHub = frameNode->GetEventHub<StepperEventHub>();
78 CHECK_NULL_VOID(eventHub);
79 eventHub->SetChangeEvent(std::move(eventOnChange));
80 }
81
SetOnNext(IndexCallbackEvent && eventOnNext)82 void StepperModelNG::SetOnNext(IndexCallbackEvent&& eventOnNext)
83 {
84 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
85 CHECK_NULL_VOID(frameNode);
86 auto eventHub = frameNode->GetEventHub<StepperEventHub>();
87 CHECK_NULL_VOID(eventHub);
88 eventHub->SetNextEvent(std::move(eventOnNext));
89 }
90
SetOnPrevious(IndexCallbackEvent && eventOnPrevious)91 void StepperModelNG::SetOnPrevious(IndexCallbackEvent&& eventOnPrevious)
92 {
93 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
94 CHECK_NULL_VOID(frameNode);
95 auto eventHub = frameNode->GetEventHub<StepperEventHub>();
96 CHECK_NULL_VOID(eventHub);
97 eventHub->SetPreviousEvent(std::move(eventOnPrevious));
98 }
99
CreateSwiperChild(int32_t id,uint32_t index)100 RefPtr<FrameNode> StepperModelNG::CreateSwiperChild(int32_t id, uint32_t index)
101 {
102 auto swiperNode =
103 FrameNode::GetOrCreateFrameNode(V2::SWIPER_ETS_TAG, id, []() { return AceType::MakeRefPtr<SwiperPattern>(); });
104 auto swiperPaintProperty = swiperNode->GetPaintProperty<SwiperPaintProperty>();
105 CHECK_NULL_RETURN(swiperPaintProperty, nullptr);
106 swiperPaintProperty->UpdateEdgeEffect(EdgeEffect::NONE);
107 auto swiperLayoutProperty = swiperNode->GetLayoutProperty<SwiperLayoutProperty>();
108 CHECK_NULL_RETURN(swiperLayoutProperty, nullptr);
109 swiperLayoutProperty->UpdateDisableSwipe(true);
110 swiperLayoutProperty->UpdateLoop(false);
111 swiperLayoutProperty->UpdateCachedCount(0);
112 swiperLayoutProperty->UpdateIndex(static_cast<int32_t>(index));
113 swiperLayoutProperty->UpdateShowIndicator(false);
114 swiperNode->MarkModifyDone();
115 return swiperNode;
116 }
117
SetOnChangeEvent(IndexChangeEvent && onChangeEvent)118 void StepperModelNG::SetOnChangeEvent(IndexChangeEvent&& onChangeEvent)
119 {
120 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
121 CHECK_NULL_VOID(frameNode);
122 auto eventHub = frameNode->GetEventHub<StepperEventHub>();
123 CHECK_NULL_VOID(eventHub);
124 eventHub->SetOnChangeEvent(std::move(onChangeEvent));
125 }
126 } // namespace OHOS::Ace::NG
127