MyGUI  3.2.1
MyGUI_ControllerManager.cpp
Go to the documentation of this file.
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_Gui.h"
10 #include "MyGUI_WidgetManager.h"
11 #include "MyGUI_FactoryManager.h"
12 
16 
17 namespace MyGUI
18 {
19 
20  template <> ControllerManager* Singleton<ControllerManager>::msInstance = nullptr;
21  template <> const char* Singleton<ControllerManager>::mClassTypeName = "ControllerManager";
22 
24  mIsInitialise(false),
25  mCategoryName("Controller")
26  {
27  }
28 
30  {
31  MYGUI_ASSERT(!mIsInitialise, getClassTypeName() << " initialised twice");
32  MYGUI_LOG(Info, "* Initialise: " << getClassTypeName());
33 
35 
39 
40  MYGUI_LOG(Info, getClassTypeName() << " successfully initialized");
41  mIsInitialise = true;
42  }
43 
45  {
46  MYGUI_ASSERT(mIsInitialise, getClassTypeName() << " is not initialised");
47  MYGUI_LOG(Info, "* Shutdown: " << getClassTypeName());
48 
52 
54  clear();
55 
56  MYGUI_LOG(Info, getClassTypeName() << " successfully shutdown");
57  mIsInitialise = false;
58  }
59 
60  void ControllerManager::clear()
61  {
62  for (ListControllerItem::iterator iter = mListItem.begin(); iter != mListItem.end(); ++iter)
63  {
64  delete (*iter).second;
65  }
66  mListItem.clear();
67  }
68 
69  ControllerItem* ControllerManager::createItem(const std::string& _type)
70  {
71  IObject* object = FactoryManager::getInstance().createObject(mCategoryName, _type);
72  return object == nullptr ? nullptr : object->castType<ControllerItem>();
73  }
74 
76  {
77  // если виджет первый, то подписываемся на кадры
78  if (mListItem.empty())
79  Gui::getInstance().eventFrameStart += newDelegate(this, &ControllerManager::frameEntered);
80 
81  // подготавливаем
82  _item->prepareItem(_widget);
83 
84  for (ListControllerItem::iterator iter = mListItem.begin(); iter != mListItem.end(); ++iter)
85  {
86  // такой уже в списке есть
87  if ((*iter).first == _widget)
88  {
89  if ((*iter).second->getTypeName() == _item->getTypeName())
90  {
91  delete (*iter).second;
92  (*iter).second = _item;
93  return;
94  }
95  }
96  }
97 
98  // вставляем в самый конец
99  mListItem.push_back(PairControllerItem(_widget, _item));
100  }
101 
103  {
104  // не удаляем из списка, а обнуляем, в цикле он будет удален
105  for (ListControllerItem::iterator iter = mListItem.begin(); iter != mListItem.end(); ++iter)
106  {
107  if ((*iter).first == _widget) (*iter).first = nullptr;
108  }
109  }
110 
111  void ControllerManager::_unlinkWidget(Widget* _widget)
112  {
113  removeItem(_widget);
114  }
115 
116  void ControllerManager::frameEntered(float _time)
117  {
118  for (ListControllerItem::iterator iter = mListItem.begin(); iter != mListItem.end(); /*added in body*/)
119  {
120  if (nullptr == (*iter).first)
121  {
122  delete (*iter).second;
123  // удаляем из списка, итератор не увеличиваем и на новый круг
124  iter = mListItem.erase(iter);
125  continue;
126  }
127 
128  if ((*iter).second->addTime((*iter).first, _time))
129  {
130  ++iter;
131  continue;
132  }
133 
134  // на следующей итерации виджет вылетит из списка
135  (*iter).first = nullptr;
136  }
137 
138  if (mListItem.empty())
139  Gui::getInstance().eventFrameStart -= newDelegate(this, &ControllerManager::frameEntered);
140  }
141 
142  const std::string& ControllerManager::getCategoryName() const
143  {
144  return mCategoryName;
145  }
146 
147 } // namespace MyGUI