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 auto stepperNode = StepperNode::GetOrCreateStepperNode(
32 V2::STEPPER_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<StepperPattern>(); });
33 stack->Push(stepperNode);
34 bool hasSwiperNode = stepperNode->HasSwiperNode();
35 auto swiperId = stepperNode->GetSwiperId();
36 if (!hasSwiperNode) {
37 auto swiperNode = CreateSwiperChild(swiperId, index);
38 swiperNode->MountToParent(stepperNode);
39 ACE_UPDATE_LAYOUT_PROPERTY(StepperLayoutProperty, Index, index);
40 } else {
41 auto swiperNode = AceType::DynamicCast<FrameNode>(
42 stepperNode->GetChildAtIndex(stepperNode->GetChildIndexById(stepperNode->GetSwiperId())));
43 CHECK_NULL_VOID(swiperNode);
44 auto swiperController = swiperNode->GetPattern<SwiperPattern>()->GetSwiperController();
45 swiperController->SwipeTo(index);
46 }
47 }
48
SetOnFinish(RoutineCallbackEvent && eventOnFinish)49 void StepperModelNG::SetOnFinish(RoutineCallbackEvent&& eventOnFinish)
50 {
51 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
52 CHECK_NULL_VOID(frameNode);
53 auto eventHub = frameNode->GetEventHub<StepperEventHub>();
54 CHECK_NULL_VOID(eventHub);
55 eventHub->SetFinishEvent(std::move(eventOnFinish));
56 }
57
SetOnSkip(RoutineCallbackEvent && eventOnSkip)58 void StepperModelNG::SetOnSkip(RoutineCallbackEvent&& eventOnSkip)
59 {
60 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
61 CHECK_NULL_VOID(frameNode);
62 auto eventHub = frameNode->GetEventHub<StepperEventHub>();
63 CHECK_NULL_VOID(eventHub);
64 eventHub->SetSkipEvent(std::move(eventOnSkip));
65 }
66
SetOnChange(IndexCallbackEvent && eventOnChange)67 void StepperModelNG::SetOnChange(IndexCallbackEvent&& eventOnChange)
68 {
69 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
70 CHECK_NULL_VOID(frameNode);
71 auto eventHub = frameNode->GetEventHub<StepperEventHub>();
72 CHECK_NULL_VOID(eventHub);
73 eventHub->SetChangeEvent(std::move(eventOnChange));
74 }
75
SetOnNext(IndexCallbackEvent && eventOnNext)76 void StepperModelNG::SetOnNext(IndexCallbackEvent&& eventOnNext)
77 {
78 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
79 CHECK_NULL_VOID(frameNode);
80 auto eventHub = frameNode->GetEventHub<StepperEventHub>();
81 CHECK_NULL_VOID(eventHub);
82 eventHub->SetNextEvent(std::move(eventOnNext));
83 }
84
SetOnPrevious(IndexCallbackEvent && eventOnPrevious)85 void StepperModelNG::SetOnPrevious(IndexCallbackEvent&& eventOnPrevious)
86 {
87 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
88 CHECK_NULL_VOID(frameNode);
89 auto eventHub = frameNode->GetEventHub<StepperEventHub>();
90 CHECK_NULL_VOID(eventHub);
91 eventHub->SetPreviousEvent(std::move(eventOnPrevious));
92 }
93
CreateSwiperChild(int32_t id,uint32_t index)94 RefPtr<FrameNode> StepperModelNG::CreateSwiperChild(int32_t id, uint32_t index)
95 {
96 auto swiperNode =
97 FrameNode::GetOrCreateFrameNode(V2::SWIPER_ETS_TAG, id, []() { return AceType::MakeRefPtr<SwiperPattern>(); });
98 auto swiperPaintProperty = swiperNode->GetPaintProperty<SwiperPaintProperty>();
99 CHECK_NULL_RETURN(swiperPaintProperty, nullptr);
100 swiperPaintProperty->UpdateEdgeEffect(EdgeEffect::NONE);
101 swiperPaintProperty->UpdateDisableSwipe(true);
102 auto swiperLayoutProperty = swiperNode->GetLayoutProperty<SwiperLayoutProperty>();
103 CHECK_NULL_RETURN(swiperLayoutProperty, nullptr);
104 swiperLayoutProperty->UpdateLoop(false);
105 swiperLayoutProperty->UpdateCachedCount(0);
106 swiperLayoutProperty->UpdateIndex(static_cast<int32_t>(index));
107 swiperLayoutProperty->UpdateShowIndicator(false);
108 swiperNode->MarkModifyDone();
109 return swiperNode;
110 }
111
SetOnChangeEvent(IndexChangeEvent && onChangeEvent)112 void StepperModelNG::SetOnChangeEvent(IndexChangeEvent&& onChangeEvent)
113 {
114 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
115 CHECK_NULL_VOID(frameNode);
116 auto eventHub = frameNode->GetEventHub<StepperEventHub>();
117 CHECK_NULL_VOID(eventHub);
118 eventHub->SetOnChangeEvent(std::move(onChangeEvent));
119 }
120 } // namespace OHOS::Ace::NG
121