MyGUI  3.2.1
MyGUI_ControllerManager.cpp
Go to the documentation of this file.
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