MyGUI
3.2.1
|
00001 /* 00002 * This source file is part of MyGUI. For the latest info, see http://mygui.info/ 00003 * Distributed under the MIT License 00004 * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT) 00005 */ 00006 00007 #include "MyGUI_Precompiled.h" 00008 #include "MyGUI_Gui.h" 00009 #include "MyGUI_ControllerManager.h" 00010 #include "MyGUI_WidgetManager.h" 00011 #include "MyGUI_FactoryManager.h" 00012 00013 #include "MyGUI_ControllerEdgeHide.h" 00014 #include "MyGUI_ControllerFadeAlpha.h" 00015 #include "MyGUI_ControllerPosition.h" 00016 #include "MyGUI_ControllerRepeatClick.h" 00017 00018 namespace MyGUI 00019 { 00020 00021 template <> ControllerManager* Singleton<ControllerManager>::msInstance = nullptr; 00022 template <> const char* Singleton<ControllerManager>::mClassTypeName = "ControllerManager"; 00023 00024 ControllerManager::ControllerManager() : 00025 mIsInitialise(false), 00026 mCategoryName("Controller") 00027 { 00028 } 00029 00030 void ControllerManager::initialise() 00031 { 00032 MYGUI_ASSERT(!mIsInitialise, getClassTypeName() << " initialised twice"); 00033 MYGUI_LOG(Info, "* Initialise: " << getClassTypeName()); 00034 00035 WidgetManager::getInstance().registerUnlinker(this); 00036 00037 FactoryManager::getInstance().registerFactory<ControllerEdgeHide>(mCategoryName); 00038 FactoryManager::getInstance().registerFactory<ControllerFadeAlpha>(mCategoryName); 00039 FactoryManager::getInstance().registerFactory<ControllerPosition>(mCategoryName); 00040 FactoryManager::getInstance().registerFactory<ControllerRepeatClick>(mCategoryName); 00041 00042 MYGUI_LOG(Info, getClassTypeName() << " successfully initialized"); 00043 mIsInitialise = true; 00044 } 00045 00046 void ControllerManager::shutdown() 00047 { 00048 MYGUI_ASSERT(mIsInitialise, getClassTypeName() << " is not initialised"); 00049 MYGUI_LOG(Info, "* Shutdown: " << getClassTypeName()); 00050 00051 FactoryManager::getInstance().unregisterFactory<ControllerEdgeHide>(mCategoryName); 00052 FactoryManager::getInstance().unregisterFactory<ControllerFadeAlpha>(mCategoryName); 00053 FactoryManager::getInstance().unregisterFactory<ControllerPosition>(mCategoryName); 00054 FactoryManager::getInstance().unregisterFactory<ControllerRepeatClick>(mCategoryName); 00055 00056 WidgetManager::getInstance().unregisterUnlinker(this); 00057 clear(); 00058 00059 MYGUI_LOG(Info, getClassTypeName() << " successfully shutdown"); 00060 mIsInitialise = false; 00061 } 00062 00063 void ControllerManager::clear() 00064 { 00065 for (ListControllerItem::iterator iter = mListItem.begin(); iter != mListItem.end(); ++iter) 00066 { 00067 delete (*iter).second; 00068 } 00069 mListItem.clear(); 00070 } 00071 00072 ControllerItem* ControllerManager::createItem(const std::string& _type) 00073 { 00074 IObject* object = FactoryManager::getInstance().createObject(mCategoryName, _type); 00075 return object == nullptr ? nullptr : object->castType<ControllerItem>(); 00076 } 00077 00078 void ControllerManager::addItem(Widget* _widget, ControllerItem* _item) 00079 { 00080 // если виджет первый, то подписываемся на кадры 00081 if (mListItem.empty()) 00082 Gui::getInstance().eventFrameStart += newDelegate(this, &ControllerManager::frameEntered); 00083 00084 // подготавливаем 00085 _item->prepareItem(_widget); 00086 00087 for (ListControllerItem::iterator iter = mListItem.begin(); iter != mListItem.end(); ++iter) 00088 { 00089 // такой уже в списке есть 00090 if ((*iter).first == _widget) 00091 { 00092 if ((*iter).second->getTypeName() == _item->getTypeName()) 00093 { 00094 delete (*iter).second; 00095 (*iter).second = _item; 00096 return; 00097 } 00098 } 00099 } 00100 00101 // вставляем в самый конец 00102 mListItem.push_back(PairControllerItem(_widget, _item)); 00103 } 00104 00105 void ControllerManager::removeItem(Widget* _widget) 00106 { 00107 // не удаляем из списка, а обнуляем, в цикле он будет удален 00108 for (ListControllerItem::iterator iter = mListItem.begin(); iter != mListItem.end(); ++iter) 00109 { 00110 if ((*iter).first == _widget) (*iter).first = nullptr; 00111 } 00112 } 00113 00114 void ControllerManager::_unlinkWidget(Widget* _widget) 00115 { 00116 removeItem(_widget); 00117 } 00118 00119 void ControllerManager::frameEntered(float _time) 00120 { 00121 for (ListControllerItem::iterator iter = mListItem.begin(); iter != mListItem.end(); /*added in body*/) 00122 { 00123 if (nullptr == (*iter).first) 00124 { 00125 delete (*iter).second; 00126 // удаляем из списка, итератор не увеличиваем и на новый круг 00127 iter = mListItem.erase(iter); 00128 continue; 00129 } 00130 00131 if ((*iter).second->addTime((*iter).first, _time)) 00132 { 00133 ++iter; 00134 continue; 00135 } 00136 00137 // на следующей итерации виджет вылетит из списка 00138 (*iter).first = nullptr; 00139 } 00140 00141 if (mListItem.empty()) 00142 Gui::getInstance().eventFrameStart -= newDelegate(this, &ControllerManager::frameEntered); 00143 } 00144 00145 const std::string& ControllerManager::getCategoryName() const 00146 { 00147 return mCategoryName; 00148 } 00149 00150 } // namespace MyGUI