1 /*
2  * Copyright (c) 2023 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 #include "core/components_ng/pattern/folder_stack/folder_stack_model_ng.h"
16 
17 #include "base/memory/ace_type.h"
18 #include "base/memory/referenced.h"
19 #include "base/perfmonitor/perf_constants.h"
20 #include "base/perfmonitor/perf_monitor.h"
21 #include "base/utils/utils.h"
22 #include "core/animation/page_transition_common.h"
23 #include "core/components_ng/base/view_stack_processor.h"
24 #include "core/components_ng/pattern/folder_stack/control_parts_stack_node.h"
25 #include "core/components_ng/pattern/folder_stack/control_parts_stack_pattern.h"
26 #include "core/components_ng/pattern/folder_stack/folder_stack_event_hub.h"
27 #include "core/components_ng/pattern/folder_stack/folder_stack_group_node.h"
28 #include "core/components_ng/pattern/folder_stack/folder_stack_layout_property.h"
29 #include "core/components_ng/pattern/folder_stack/folder_stack_pattern.h"
30 #include "core/components_ng/pattern/folder_stack/hover_stack_node.h"
31 #include "core/components_ng/pattern/folder_stack/hover_stack_pattern.h"
32 #include "core/components_ng/pattern/stack/stack_layout_property.h"
33 
34 namespace OHOS::Ace::NG {
Create()35 void FolderStackModelNG::Create()
36 {
37     std::vector<std::string> itemId;
38     Create(itemId);
39 }
Create(const std::vector<std::string> & itemId)40 void FolderStackModelNG::Create(const std::vector<std::string>& itemId)
41 {
42     auto* stack = ViewStackProcessor::GetInstance();
43     auto nodeId = stack->ClaimNodeId();
44     auto folderStackGroupNode = FolderStackGroupNode::GetOrCreateGroupNode(
45         V2::FOLDER_STACK_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<FolderStackPattern>(); });
46     folderStackGroupNode->SetItemId(itemId);
47     if (!folderStackGroupNode->GetHoverNode()) {
48         int32_t hoverId = ElementRegister::GetInstance()->MakeUniqueId();
49         auto hoverStackNode = HoverStackNode::GetOrCreateHoverStackNode(
50             V2::HOVER_STACK_ETS_TAG, hoverId, []() { return AceType::MakeRefPtr<HoverStackPattern>(); });
51         folderStackGroupNode->AddChild(hoverStackNode);
52         folderStackGroupNode->SetHoverNode(hoverStackNode);
53     }
54     if (!folderStackGroupNode->GetControlPartsStackNode()) {
55         int32_t controlPartsId = ElementRegister::GetInstance()->MakeUniqueId();
56         auto controlPartsNode = ControlPartsStackNode::GetOrCreateControlPartsStackNode(V2::CONTROL_PARTS_STACK_ETS_TAG,
57             controlPartsId, []() { return AceType::MakeRefPtr<ControlPartsStackPattern>(); });
58         folderStackGroupNode->AddChild(controlPartsNode);
59         folderStackGroupNode->SetControlPartsStackNode(controlPartsNode);
60     }
61     stack->Push(folderStackGroupNode);
62     ACE_UPDATE_LAYOUT_PROPERTY(FolderStackLayoutProperty, UpperItems, itemId);
63 }
64 
SetAlignment(Alignment alignment)65 void FolderStackModelNG::SetAlignment(Alignment alignment)
66 {
67     ACE_UPDATE_LAYOUT_PROPERTY(LayoutProperty, Alignment, alignment);
68 }
69 
SetEnableAnimation(FrameNode * frameNode,bool isEnableAnimation)70 void FolderStackModelNG::SetEnableAnimation(FrameNode* frameNode, bool isEnableAnimation)
71 {
72     ACE_UPDATE_NODE_LAYOUT_PROPERTY(FolderStackLayoutProperty, EnableAnimation, isEnableAnimation, frameNode);
73 }
74 
SetEnableAnimation(bool IsEnableAnimation)75 void FolderStackModelNG::SetEnableAnimation(bool IsEnableAnimation)
76 {
77     ACE_UPDATE_LAYOUT_PROPERTY(FolderStackLayoutProperty, EnableAnimation, IsEnableAnimation);
78 }
79 
SetAutoHalfFold(FrameNode * frameNode,bool isAutoHalfFold)80 void FolderStackModelNG::SetAutoHalfFold(FrameNode* frameNode, bool isAutoHalfFold)
81 {
82     ACE_UPDATE_NODE_LAYOUT_PROPERTY(FolderStackLayoutProperty, AutoHalfFold, isAutoHalfFold, frameNode);
83 }
84 
SetAutoHalfFold(bool IsAutoHalfFold)85 void FolderStackModelNG::SetAutoHalfFold(bool IsAutoHalfFold)
86 {
87     ACE_UPDATE_LAYOUT_PROPERTY(FolderStackLayoutProperty, AutoHalfFold, IsAutoHalfFold);
88 }
89 
SetOnFolderStateChange(std::function<void (const NG::FolderEventInfo & folderEventInfo)> && onChange)90 void FolderStackModelNG::SetOnFolderStateChange(
91     std::function<void(const NG::FolderEventInfo& folderEventInfo)>&& onChange)
92 {
93     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
94     CHECK_NULL_VOID(frameNode);
95     auto eventHub = frameNode->GetEventHub<FolderStackEventHub>();
96     CHECK_NULL_VOID(eventHub);
97     eventHub->SetOnFolderStateChange(std::move(onChange));
98 }
99 
SetOnHoverStatusChange(std::function<void (const NG::FolderEventInfo & folderEventInfo)> && onChange)100 void FolderStackModelNG::SetOnHoverStatusChange(
101     std::function<void(const NG::FolderEventInfo& folderEventInfo)>&& onChange)
102 {
103     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
104     CHECK_NULL_VOID(frameNode);
105     auto eventHub = frameNode->GetEventHub<FolderStackEventHub>();
106     CHECK_NULL_VOID(eventHub);
107     eventHub->SetOnHoverStatusChange(std::move(onChange));
108 }
109 } // namespace OHOS::Ace::NG
110