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