MyGUI  3.2.1
MyGUI_WidgetManager.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_WidgetManager.h"
9 #include "MyGUI_Gui.h"
10 #include "MyGUI_Widget.h"
11 #include "MyGUI_FactoryManager.h"
12 
13 #include "MyGUI_Button.h"
14 #include "MyGUI_Canvas.h"
15 #include "MyGUI_ComboBox.h"
16 #include "MyGUI_DDContainer.h"
17 #include "MyGUI_EditBox.h"
18 #include "MyGUI_ItemBox.h"
19 #include "MyGUI_ListBox.h"
20 #include "MyGUI_MenuBar.h"
21 #include "MyGUI_MenuControl.h"
22 #include "MyGUI_MenuItem.h"
23 #include "MyGUI_MultiListBox.h"
24 #include "MyGUI_MultiListItem.h"
25 #include "MyGUI_PopupMenu.h"
26 #include "MyGUI_ProgressBar.h"
27 #include "MyGUI_ScrollBar.h"
28 #include "MyGUI_ScrollView.h"
29 #include "MyGUI_ImageBox.h"
30 #include "MyGUI_TextBox.h"
31 #include "MyGUI_TabControl.h"
32 #include "MyGUI_TabItem.h"
33 #include "MyGUI_Widget.h"
34 #include "MyGUI_Window.h"
35 
37 
38 namespace MyGUI
39 {
40 
41  template <> WidgetManager* Singleton<WidgetManager>::msInstance = nullptr;
42  template <> const char* Singleton<WidgetManager>::mClassTypeName = "WidgetManager";
43 
45  mIsInitialise(false),
46  mCategoryName("Widget")
47  {
48  }
49 
51  {
52  MYGUI_ASSERT(!mIsInitialise, getClassTypeName() << " initialised twice");
53  MYGUI_LOG(Info, "* Initialise: " << getClassTypeName());
54 
56 
57  factory.registerFactory<Button>(mCategoryName);
58  factory.registerFactory<Canvas>(mCategoryName);
59  factory.registerFactory<ComboBox>(mCategoryName);
60  factory.registerFactory<DDContainer>(mCategoryName);
61  factory.registerFactory<EditBox>(mCategoryName);
62  factory.registerFactory<ItemBox>(mCategoryName);
63  factory.registerFactory<ListBox>(mCategoryName);
64  factory.registerFactory<MenuBar>(mCategoryName);
65  factory.registerFactory<MenuControl>(mCategoryName);
66  factory.registerFactory<MenuItem>(mCategoryName);
67  factory.registerFactory<MultiListBox>(mCategoryName);
68  factory.registerFactory<MultiListItem>(mCategoryName);
69  factory.registerFactory<PopupMenu>(mCategoryName);
70  factory.registerFactory<ProgressBar>(mCategoryName);
71  factory.registerFactory<ScrollBar>(mCategoryName);
72  factory.registerFactory<ScrollView>(mCategoryName);
73  factory.registerFactory<ImageBox>(mCategoryName);
74  factory.registerFactory<TextBox>(mCategoryName);
75  factory.registerFactory<TabControl>(mCategoryName);
76  factory.registerFactory<TabItem>(mCategoryName);
77  factory.registerFactory<Widget>(mCategoryName);
78  factory.registerFactory<Window>(mCategoryName);
79 
81 
82  Gui::getInstance().eventFrameStart += newDelegate(this, &WidgetManager::notifyEventFrameStart);
83 
84  MYGUI_LOG(Info, getClassTypeName() << " successfully initialized");
85  mIsInitialise = true;
86  }
87 
89  {
90  MYGUI_ASSERT(mIsInitialise, getClassTypeName() << " is not initialised");
91  MYGUI_LOG(Info, "* Shutdown: " << getClassTypeName());
92 
93  Gui::getInstance().eventFrameStart -= newDelegate(this, &WidgetManager::notifyEventFrameStart);
95 
96  mVectorIUnlinkWidget.clear();
97 
99 
100  MYGUI_LOG(Info, getClassTypeName() << " successfully shutdown");
101  mIsInitialise = false;
102  }
103 
104  Widget* WidgetManager::createWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Widget* _parent, ICroppedRectangle* _cropeedParent, const std::string& _name)
105  {
106  IObject* object = FactoryManager::getInstance().createObject(mCategoryName, _type);
107  if (object != nullptr)
108  {
109  Widget* widget = object->castType<Widget>();
110  widget->_initialise(_style, _coord, _skin, _parent, _cropeedParent, _name);
111 
112  return widget;
113  }
114 
115  MYGUI_EXCEPT("factory '" << _type << "' not found");
116  }
117 
119  {
120  Gui::getInstance().destroyWidget(_widget);
121  }
122 
124  {
125  Gui::getInstance().destroyWidgets(_widgets);
126  }
127 
129  {
130  Gui::getInstance().destroyWidgets(_widgets);
131  }
132 
134  {
135  unregisterUnlinker(_unlink);
136  mVectorIUnlinkWidget.push_back(_unlink);
137  }
138 
140  {
141  VectorIUnlinkWidget::iterator iter = std::remove(mVectorIUnlinkWidget.begin(), mVectorIUnlinkWidget.end(), _unlink);
142  if (iter != mVectorIUnlinkWidget.end())
143  mVectorIUnlinkWidget.erase(iter);
144  }
145 
147  {
148  for (VectorIUnlinkWidget::iterator iter = mVectorIUnlinkWidget.begin(); iter != mVectorIUnlinkWidget.end(); ++iter)
149  {
150  (*iter)->_unlinkWidget(_widget);
151  }
152  }
153 
154  bool WidgetManager::isFactoryExist(const std::string& _type)
155  {
156  if (FactoryManager::getInstance().isFactoryExist(mCategoryName, _type))
157  {
158  return true;
159  }
160 
161  return false;
162  }
163 
164  void WidgetManager::notifyEventFrameStart(float _time)
165  {
167  }
168 
170  {
171  _widget->_shutdown();
172 
173  for (VectorWidgetPtr::iterator entry = mDestroyWidgets.begin(); entry != mDestroyWidgets.end(); ++entry)
174  {
175  /*if ((*entry) == _widget)
176  return;*/
177  MYGUI_ASSERT((*entry) != _widget, "double delete widget");
178  }
179 
180  mDestroyWidgets.push_back(_widget);
181  }
182 
184  {
185  if (!mDestroyWidgets.empty())
186  {
187  for (VectorWidgetPtr::iterator entry = mDestroyWidgets.begin(); entry != mDestroyWidgets.end(); ++entry)
188  delete (*entry);
189  mDestroyWidgets.clear();
190  }
191  }
192 
193  const std::string& WidgetManager::getCategoryName() const
194  {
195  return mCategoryName;
196  }
197 
198 } // namespace MyGUI