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