• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_INDICATOR_H
17 #define FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_INDICATOR_H
18 
19 #include "frameworks/bridge/declarative_frontend/jsview/js_view_abstract.h"
20 #include "frameworks/core/components_ng/base/ui_node.h"
21 #include "frameworks/core/components_ng/pattern/swiper_indicator/indicator_common/indicator_controller.h"
22 
23 namespace OHOS::Ace::Framework {
24 class JSIndicator : public JSViewAbstract {
25 public:
26     static void JSBind(BindingTarget globalObj);
27     static void Create(const JSCallbackInfo& info);
28 
29 protected:
30     static void SetLoop(const JSCallbackInfo& info);
31     static void SetOnChange(const JSCallbackInfo& info);
32     static void SetInitialIndex(const JSCallbackInfo& info);
33     static void SetStyle(const JSCallbackInfo& info);
34     static void SetCount(const JSCallbackInfo& info);
35     static void SetVertical(const JSCallbackInfo& info);
36     static SwiperParameters GetDotIndicatorInfo(const JSRef<JSObject>& obj);
37     static SwiperDigitalParameters GetDigitIndicatorInfo(const JSRef<JSObject>& obj);
38     static std::optional<Dimension> ParseIndicatorDimension(const JSRef<JSVal>& value);
39     static std::optional<Dimension> ParseIndicatorBottom(const JSRef<JSVal>& bottomValue, bool hasIgnoreSize);
40     static void GetFontContent(const JSRef<JSVal>& font, bool isSelected, SwiperDigitalParameters& digitalParameters);
41     static void SetDotIndicatorInfo(const JSRef<JSObject>& obj, SwiperParameters& swiperParameters,
42         const RefPtr<SwiperIndicatorTheme>& swiperIndicatorTheme);
43 };
44 
45 class JSIndicatorController final : public Referenced {
46 public:
47     JSIndicatorController() = default;
48     ~JSIndicatorController() override = default;
49     static void JSBind(BindingTarget globalObj);
50     static void Constructor(const JSCallbackInfo& args);
51     static void Destructor(JSIndicatorController* scroller);
52 
ShowNext(const JSCallbackInfo & args)53     void ShowNext(const JSCallbackInfo& args)
54     {
55         if (controller_.Upgrade()) {
56             ContainerScope scope(instanceId_);
57             controller_.Upgrade()->ShowNext();
58         }
59     }
60 
ShowPrevious(const JSCallbackInfo & args)61     void ShowPrevious(const JSCallbackInfo& args)
62     {
63         if (controller_.Upgrade()) {
64             ContainerScope scope(instanceId_);
65             controller_.Upgrade()->ShowPrevious();
66         }
67     }
68 
69     void ChangeIndex(const JSCallbackInfo& args);
70 
SetController(const RefPtr<NG::IndicatorController> & controller,RefPtr<NG::FrameNode> & indicatorNode)71     void SetController(const RefPtr<NG::IndicatorController>& controller, RefPtr<NG::FrameNode>& indicatorNode)
72     {
73         auto resetFunc = [wp = WeakClaim(this), wpNode = WeakClaim(RawPtr(indicatorNode))]() {
74             auto JSController = wp.Upgrade();
75             if (JSController) {
76                 auto host = JSController->controller_.Upgrade()->GetIndicatorNode();
77                 auto node = wpNode.Upgrade();
78                 if (node && node == host) {
79                     JSController->controller_ = nullptr;
80                 }
81             }
82         };
83         if (controller_.Upgrade()) {
84             controller_.Upgrade()->ResetIndicatorControllor(controller, indicatorNode);
85         }
86         controller_ = controller;
87         controller->SetJSIndicatorController(resetFunc);
88         controller->SetSwiperNode(swiperNode_.Upgrade());
89     }
90 
ResetSwiperNode()91     void ResetSwiperNode()
92     {
93         swiperNode_ = nullptr;
94     }
95 
SetInstanceId(int32_t id)96     void SetInstanceId(int32_t id)
97     {
98         instanceId_ = id;
99     }
100 
SetSwiperNodeBySwiper(const RefPtr<NG::FrameNode> & node)101     std::function<void()> SetSwiperNodeBySwiper(const RefPtr<NG::FrameNode>& node)
102     {
103         if (controller_.Upgrade()) {
104             controller_.Upgrade()->SetSwiperNode(node);
105             controller_.Upgrade()->UpdateIndicatorNode();
106         }
107         if (node != swiperNode_) {
108             swiperNode_ = node;
109             return [wp = WeakClaim(this), wpNode = WeakClaim(RawPtr(node))]() {
110                 auto JSController = wp.Upgrade();
111                 if (JSController) {
112                     auto node = wpNode.Upgrade();
113                     if (node && node == JSController->swiperNode_) {
114                         JSController->swiperNode_ = nullptr;
115                     }
116                     auto controller = JSController->controller_.Upgrade();
117                     CHECK_NULL_VOID(controller);
118                     controller->UpdateIndicatorNode();
119                 }
120             };
121         }
122         return nullptr;
123     }
124 
125 private:
126     int32_t instanceId_ = INSTANCE_ID_UNDEFINED;
127     WeakPtr<NG::IndicatorController> controller_;
128     WeakPtr<NG::FrameNode> swiperNode_;
129     ACE_DISALLOW_COPY_AND_MOVE(JSIndicatorController);
130 };
131 
132 } // namespace OHOS::Ace::Framework
133 #endif // FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_JS_VIEW_JS_INDICATOR_H