1 /* 2 * This source file is part of MyGUI. For the latest info, see http://mygui.info/ 3 * Distributed under the MIT License 4 * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT) 5 */ 6 7 #include "MyGUI_Precompiled.h" 8 #include "MyGUI_LayoutManager.h" 9 #include "MyGUI_ResourceManager.h" 10 #include "MyGUI_FactoryManager.h" 11 #include "MyGUI_WidgetManager.h" 12 13 namespace MyGUI 14 { 15 16 template <> LayoutManager* Singleton<LayoutManager>::msInstance = nullptr; 17 template <> const char* Singleton<LayoutManager>::mClassTypeName = "LayoutManager"; 18 LayoutManager()19 LayoutManager::LayoutManager() : 20 mIsInitialise(false), 21 mXmlLayoutTagName("Layout") 22 { 23 } 24 initialise()25 void LayoutManager::initialise() 26 { 27 MYGUI_ASSERT(!mIsInitialise, getClassTypeName() << " initialised twice"); 28 MYGUI_LOG(Info, "* Initialise: " << getClassTypeName()); 29 30 ResourceManager::getInstance().registerLoadXmlDelegate(mXmlLayoutTagName) = newDelegate(this, &LayoutManager::_load); 31 32 std::string resourceCategory = ResourceManager::getInstance().getCategoryName(); 33 FactoryManager::getInstance().registerFactory<ResourceLayout>(resourceCategory); 34 35 MYGUI_LOG(Info, getClassTypeName() << " successfully initialized"); 36 mIsInitialise = true; 37 } 38 shutdown()39 void LayoutManager::shutdown() 40 { 41 MYGUI_ASSERT(mIsInitialise, getClassTypeName() << " is not initialised"); 42 MYGUI_LOG(Info, "* Shutdown: " << getClassTypeName()); 43 44 ResourceManager::getInstance().unregisterLoadXmlDelegate(mXmlLayoutTagName); 45 46 std::string resourceCategory = ResourceManager::getInstance().getCategoryName(); 47 FactoryManager::getInstance().unregisterFactory<ResourceLayout>(resourceCategory); 48 49 MYGUI_LOG(Info, getClassTypeName() << " successfully shutdown"); 50 mIsInitialise = false; 51 } 52 _load(xml::ElementPtr _node,const std::string & _file,Version _version)53 void LayoutManager::_load(xml::ElementPtr _node, const std::string& _file, Version _version) 54 { 55 ResourceLayout* resource = new ResourceLayout(_node, _file); 56 ResourceManager::getInstance().addResource(resource); 57 } 58 loadLayout(const std::string & _file,const std::string & _prefix,Widget * _parent)59 VectorWidgetPtr LayoutManager::loadLayout(const std::string& _file, const std::string& _prefix, Widget* _parent) 60 { 61 mCurrentLayoutName = _file; 62 63 ResourceLayout* resource = getByName(_file, false); 64 if (!resource) 65 { 66 ResourceManager::getInstance().load(_file); 67 resource = getByName(_file, false); 68 } 69 70 VectorWidgetPtr result; 71 if (resource) 72 result = resource->createLayout(_prefix, _parent); 73 else 74 MYGUI_LOG(Warning, "Layout '" << _file << "' couldn't be loaded"); 75 76 mCurrentLayoutName = ""; 77 78 return result; 79 } 80 unloadLayout(VectorWidgetPtr & _widgets)81 void LayoutManager::unloadLayout(VectorWidgetPtr& _widgets) 82 { 83 WidgetManager::getInstance().destroyWidgets(_widgets); 84 } 85 getByName(const std::string & _name,bool _throw) const86 ResourceLayout* LayoutManager::getByName(const std::string& _name, bool _throw) const 87 { 88 std::string skinName = BackwardCompatibility::getSkinRename(_name); 89 IResource* result = ResourceManager::getInstance().getByName(skinName, false); 90 91 if (result != nullptr) 92 { 93 ResourceLayout* resource = result->castType<ResourceLayout>(false); 94 if (resource == nullptr) 95 { 96 MYGUI_ASSERT(!_throw, "Resource '" << skinName << "' is not ResourceLayout type"); 97 } 98 return resource; 99 } 100 101 MYGUI_ASSERT(!_throw, "ResourceLayout '" << skinName << "' not found"); 102 return nullptr; 103 } 104 getCurrentLayout() const105 const std::string& LayoutManager::getCurrentLayout() const 106 { 107 return mCurrentLayoutName; 108 } 109 isExist(const std::string & _name) const110 bool LayoutManager::isExist(const std::string& _name) const 111 { 112 return getByName(_name, false) != nullptr; 113 } 114 115 } // namespace MyGUI 116