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