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 #ifndef PROPERTYHANDLEARRAYHOLDER_H
16 #define PROPERTYHANDLEARRAYHOLDER_H
17 #include <algorithm>
18 #include <scene_plugin/interface/intf_proxy_object.h>
19 
20 #include <meta/api/property/property_event_handler.h>
21 #include <meta/interface/intf_proxy_object.h>
22 #include <meta/interface/property/intf_property.h>
23 
24 #include "scene_holder.h"
25 
26 struct PropertyHandlerArrayHolder {
27     struct Handler {
28         META_NS::PropertyChangedEventHandler handler;
29         META_NS::IProperty::WeakPtr target;
30         META_NS::IProperty::WeakPtr source;
31     };
32 
33     SceneHolder* sceneHolder_ { nullptr };
34 
35     BASE_NS::vector<Handler> handlers;
36     BASE_NS::vector<SCENE_NS::IProxyObject::PropertyPair> relatedPairs_;
37 
38     bool useEcsDefaults_ { true };
39 
EraseHandlerPropertyHandlerArrayHolder40     void EraseHandler(META_NS::IProperty::Ptr target, META_NS::IProperty::Ptr source)
41     {
42         handlers.erase(std::remove_if(handlers.begin(), handlers.end(),
43             [&target, &source](const Handler& h) { return h.target.lock() == target && h.source.lock() == source; }));
44     }
45 
NewHandlerPropertyHandlerArrayHolder46     META_NS::PropertyChangedEventHandler& NewHandler(META_NS::IProperty::Ptr target, META_NS::IProperty::Ptr source)
47     {
48         handlers.push_back({ META_NS::PropertyChangedEventHandler(), target, source });
49         return handlers.back().handler;
50     }
51 
MarkRelatedPropertyHandlerArrayHolder52     void MarkRelated(META_NS::IProperty::ConstPtr first, META_NS::IProperty::ConstPtr second)
53     {
54         relatedPairs_.push_back({ first, second });
55     }
56 
ResetPropertyHandlerArrayHolder57     void Reset()
58     {
59         sceneHolder_ = nullptr;
60         handlers.clear();
61         relatedPairs_.clear();
62     }
63 
SetUseEcsDefaultsPropertyHandlerArrayHolder64     void SetUseEcsDefaults(bool value)
65     {
66         useEcsDefaults_ = value;
67     }
68 
GetUseEcsDefaultsPropertyHandlerArrayHolder69     bool GetUseEcsDefaults() const
70     {
71         return useEcsDefaults_;
72     }
73 
SetSceneHolderPropertyHandlerArrayHolder74     void SetSceneHolder(SceneHolder::Ptr holder)
75     {
76         sceneHolder_ = holder.get();
77     }
78 
GetSceneHolderPropertyHandlerArrayHolder79     SceneHolder* GetSceneHolder() const
80     {
81         return sceneHolder_;
82     }
83 
GetBoundPropertiesPropertyHandlerArrayHolder84     BASE_NS::vector<SCENE_NS::IProxyObject::PropertyPair> GetBoundProperties() const
85     {
86         BASE_NS::vector<SCENE_NS::IProxyObject::PropertyPair> ret;
87         for (const auto& pair : relatedPairs_) {
88             ret.push_back({ pair.first, pair.second });
89         }
90         for (auto& handler : handlers) {
91             if (auto target = handler.target.lock()) {
92                 if (auto source = handler.source.lock()) {
93                     ret.push_back({ source, target });
94                 }
95             }
96         }
97         return ret;
98     }
99 
GetTargetPropertyHandlerArrayHolder100     META_NS::IProperty::Ptr GetTarget(META_NS::IProperty::ConstPtr proxy)
101     {
102         for (auto& handler : handlers) {
103             if (proxy == handler.source.lock()) {
104                 return handler.target.lock();
105             }
106         }
107         return META_NS::IProperty::Ptr {};
108     }
109 };
110 
111 #endif
112