10 #ifndef smtk_attribute_ItemDefinitionManager_h
11 #define smtk_attribute_ItemDefinitionManager_h
13 #include "smtk/CoreExports.h"
16 #include "smtk/attribute/Item.h"
17 #include "smtk/attribute/ItemDefinition.h"
18 #include "smtk/attribute/Resource.h"
22 #include "smtk/resource/Manager.h"
23 #include "smtk/resource/Observer.h"
57 :
public std::enable_shared_from_this<ItemDefinitionManager>
62 static std::shared_ptr<ItemDefinitionManager> create()
84 bool registerResourceManager(smtk::resource::Manager::Ptr&);
90 for (
const auto& registerFunction : m_registerFunctions)
92 registerFunction.second(*resource);
99 template<
typename CustomDefinitionType>
105 resource.customItemDefinitionFactory().registerType<CustomDefinitionType>();
109 m_registerFunctions.insert(
110 std::make_pair(
typeid(CustomDefinitionType).hash_code(), registerCustomType));
113 if (
auto manager = m_manager.lock())
117 auto registerCustomTypeObserver =
132 m_observers.insert(std::make_pair(
133 typeid(CustomDefinitionType).hash_code(),
134 manager->observers().insert(
135 registerCustomTypeObserver,
136 "Register custom attribute type <" + smtk::common::typeName<CustomDefinitionType>() +
144 template<
typename CustomDefinitionType>
148 m_registerFunctions.erase(
typeid(CustomDefinitionType).hash_code());
151 m_observers.erase(
typeid(CustomDefinitionType).hash_code());
154 if (
auto manager = m_manager.lock())
159 resource->customItemDefinitionFactory().unregisterType<CustomDefinitionType>();
167 template<
typename Tuple>
170 return ItemDefinitionManager::registerDefinitions<0, Tuple>();
174 template<
typename Tuple>
177 return ItemDefinitionManager::unregisterDefinitions<0, Tuple>();
184 template<std::
size_t I,
typename Tuple>
185 inline typename std::enable_if<I != std::tuple_size<Tuple>::value,
bool>::type
186 registerDefinitions()
188 bool registered = this->registerDefinition<typename std::tuple_element<I, Tuple>::type>();
189 return registered && ItemDefinitionManager::registerDefinitions<I + 1, Tuple>();
192 template<std::
size_t I,
typename Tuple>
193 inline typename std::enable_if<I == std::tuple_size<Tuple>::value,
bool>::type
194 registerDefinitions()
199 template<std::
size_t I,
typename Tuple>
200 inline typename std::enable_if<I != std::tuple_size<Tuple>::value,
bool>::type
201 unregisterDefinitions()
203 bool unregistered = this->unregisterDefinition<typename std::tuple_element<I, Tuple>::type>();
204 return unregistered && ItemDefinitionManager::unregisterDefinitions<I + 1, Tuple>();
207 template<std::
size_t I,
typename Tuple>
208 inline typename std::enable_if<I == std::tuple_size<Tuple>::value,
bool>::type
209 unregisterDefinitions()
217 std::weak_ptr<smtk::resource::Manager> m_manager;
219 std::unordered_map<std::size_t, smtk::resource::Observers::Key> m_observers;