MyGUI  3.0.1
MyGUI_Gui.cpp
Go to the documentation of this file.
1 
7 /*
8  This file is part of MyGUI.
9 
10  MyGUI is free software: you can redistribute it and/or modify
11  it under the terms of the GNU Lesser General Public License as published by
12  the Free Software Foundation, either version 3 of the License, or
13  (at your option) any later version.
14 
15  MyGUI is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  GNU Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with MyGUI. If not, see <http://www.gnu.org/licenses/>.
22 */
23 #include "MyGUI_Precompiled.h"
24 #include "MyGUI_Gui.h"
25 #include "MyGUI_Widget.h"
26 
27 #include "MyGUI_InputManager.h"
28 #include "MyGUI_SubWidgetManager.h"
29 #include "MyGUI_LogManager.h"
30 #include "MyGUI_SkinManager.h"
31 #include "MyGUI_WidgetManager.h"
32 #include "MyGUI_LayerManager.h"
33 #include "MyGUI_FontManager.h"
35 #include "MyGUI_PointerManager.h"
36 #include "MyGUI_ClipboardManager.h"
37 #include "MyGUI_LayoutManager.h"
38 #include "MyGUI_PluginManager.h"
39 #include "MyGUI_DynLibManager.h"
40 #include "MyGUI_LanguageManager.h"
41 #include "MyGUI_ResourceManager.h"
42 #include "MyGUI_RenderManager.h"
43 #include "MyGUI_FactoryManager.h"
44 
45 namespace MyGUI
46 {
47 
48  const std::string INSTANCE_TYPE_NAME("Gui");
49 
50  Gui* Gui::msInstance = nullptr;
51 
53  {
54  return msInstance;
55  }
56 
58  {
59  MYGUI_ASSERT(0 != msInstance, "instance " << INSTANCE_TYPE_NAME << " was not created");
60  return (*msInstance);
61  }
62 
64  mIsInitialise(false)
65  {
66  MYGUI_ASSERT(0 == msInstance, "instance " << INSTANCE_TYPE_NAME << " is exsist");
67  msInstance = this;
68  }
69 
71  {
72  msInstance = nullptr;
73  }
74 
75  void Gui::initialise(const std::string& _core, const std::string& _logFileName)
76  {
77  // самый первый лог
79 
80  MYGUI_ASSERT(!mIsInitialise, INSTANCE_TYPE_NAME << " initialised twice");
81 
82  MYGUI_LOG(Info, "* Initialise: " << INSTANCE_TYPE_NAME);
83  MYGUI_LOG(Info, "* MyGUI version "
84  << MYGUI_VERSION_MAJOR << "."
85  << MYGUI_VERSION_MINOR << "."
87 
88  // создаем и инициализируем синглтоны
89  mResourceManager = new ResourceManager();
90  mLayerManager = new LayerManager();
91  mWidgetManager = new WidgetManager();
92  mInputManager = new InputManager();
93  mSubWidgetManager = new SubWidgetManager();
94  mSkinManager = new SkinManager();
95  mFontManager = new FontManager();
96  mControllerManager = new ControllerManager();
97  mPointerManager = new PointerManager();
98  mClipboardManager = new ClipboardManager();
99  mLayoutManager = new LayoutManager();
100  mDynLibManager = new DynLibManager();
101  mPluginManager = new PluginManager();
102  mLanguageManager = new LanguageManager();
103  mFactoryManager = new FactoryManager();
104 
105  mResourceManager->initialise();
106  mLayerManager->initialise();
107  mWidgetManager->initialise();
108  mInputManager->initialise();
109  mSubWidgetManager->initialise();
110  mSkinManager->initialise();
111  mFontManager->initialise();
112  mControllerManager->initialise();
113  mPointerManager->initialise();
114  mClipboardManager->initialise();
115  mLayoutManager->initialise();
116  mDynLibManager->initialise();
117  mPluginManager->initialise();
118  mLanguageManager->initialise();
119  mFactoryManager->initialise();
120 
121  WidgetManager::getInstance().registerUnlinker(this);
122 
123  // загружаем дефолтные настройки если надо
124  if ( _core.empty() == false ) mResourceManager->load(_core);
125 
126  mViewSize = RenderManager::getInstance().getViewSize();
127  resizeWindow(mViewSize);
128 
129  MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully initialized");
130  mIsInitialise = true;
131  }
132 
134  {
135  if (!mIsInitialise) return;
136  MYGUI_LOG(Info, "* Shutdown: " << INSTANCE_TYPE_NAME);
137 
138  _destroyAllChildWidget();
139 
140  // деинициализируем и удаляем синглтоны
141  mPointerManager->shutdown();
142  mInputManager->shutdown();
143  mSkinManager->shutdown();
144  mSubWidgetManager->shutdown();
145  mLayerManager->shutdown();
146  mFontManager->shutdown();
147  mControllerManager->shutdown();
148  mClipboardManager->shutdown();
149  mLayoutManager->shutdown();
150  mPluginManager->shutdown();
151  mDynLibManager->shutdown();
152  mLanguageManager->shutdown();
153  mResourceManager->shutdown();
154  mFactoryManager->shutdown();
155 
156  WidgetManager::getInstance().unregisterUnlinker(this);
157  mWidgetManager->shutdown();
158 
159  delete mPointerManager;
160  delete mWidgetManager;
161  delete mInputManager;
162  delete mSkinManager;
163  delete mSubWidgetManager;
164  delete mLayerManager;
165  delete mFontManager;
166  delete mControllerManager;
167  delete mClipboardManager;
168  delete mLayoutManager;
169  delete mDynLibManager;
170  delete mPluginManager;
171  delete mLanguageManager;
172  delete mResourceManager;
173  delete mFactoryManager;
174 
175  MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully shutdown");
176 
177  // last gui log
179 
180  mIsInitialise = false;
181  }
182 
183  bool Gui::injectMouseMove( int _absx, int _absy, int _absz) { return mInputManager->injectMouseMove(_absx, _absy, _absz); }
184  bool Gui::injectMousePress( int _absx, int _absy, MouseButton _id ) { return mInputManager->injectMousePress(_absx, _absy, _id); }
185  bool Gui::injectMouseRelease( int _absx, int _absy, MouseButton _id ) { return mInputManager->injectMouseRelease(_absx, _absy, _id); }
186 
187  bool Gui::injectKeyPress(KeyCode _key, Char _text) { return mInputManager->injectKeyPress(_key, _text); }
188  bool Gui::injectKeyRelease(KeyCode _key) { return mInputManager->injectKeyRelease(_key); }
189 
190 
191  Widget* Gui::baseCreateWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name)
192  {
193  Widget* widget = WidgetManager::getInstance().createWidget(_style, _type, _skin, _coord, _align, nullptr, nullptr, this, _name);
194  mWidgetChild.push_back(widget);
195  // присоединяем виджет с уровню
196  if (!_layer.empty()) LayerManager::getInstance().attachToLayerNode(_layer, widget);
197  return widget;
198  }
199 
200  Widget* Gui::findWidgetT(const std::string& _name, bool _throw)
201  {
202  for (VectorWidgetPtr::iterator iter = mWidgetChild.begin(); iter!=mWidgetChild.end(); ++iter)
203  {
204  Widget* widget = (*iter)->findWidget(_name);
205  if (widget != nullptr) return widget;
206  }
207  MYGUI_ASSERT(!_throw, "Widget '" << _name << "' not found");
208  return nullptr;
209  }
210 
211  // удяляет неудачника
212  void Gui::_destroyChildWidget(Widget* _widget)
213  {
214  MYGUI_ASSERT(nullptr != _widget, "invalid widget pointer");
215 
216  VectorWidgetPtr::iterator iter = std::find(mWidgetChild.begin(), mWidgetChild.end(), _widget);
217  if (iter != mWidgetChild.end())
218  {
219  // сохраняем указатель
220  MyGUI::Widget* widget = *iter;
221 
222  // удаляем из списка
223  *iter = mWidgetChild.back();
224  mWidgetChild.pop_back();
225 
226  // отписываем от всех
227  mWidgetManager->unlinkFromUnlinkers(_widget);
228 
229  // непосредственное удаление
230  _deleteWidget(widget);
231  }
232  else MYGUI_EXCEPT("Widget '" << _widget->getName() << "' not found");
233  }
234 
235  // удаляет всех детей
236  void Gui::_destroyAllChildWidget()
237  {
238  while (!mWidgetChild.empty())
239  {
240  // сразу себя отписывем, иначе вложенной удаление убивает все
241  Widget* widget = mWidgetChild.back();
242  mWidgetChild.pop_back();
243 
244  //widget->detachWidget();
245 
246  // отписываем от всех
247  mWidgetManager->unlinkFromUnlinkers(widget);
248 
249  // и сами удалим, так как его больше в списке нет
250  _deleteWidget(widget);
251  }
252  }
253 
254  bool Gui::load(const std::string& _file)
255  {
256  return mResourceManager->load(_file);
257  }
258 
259  void Gui::destroyWidget(Widget* _widget)
260  {
261  mWidgetManager->destroyWidget(_widget);
262  }
263 
265  {
266  mWidgetManager->destroyWidgets(_widgets);
267  }
268 
270  {
271  mWidgetManager->destroyWidgets(_widgets);
272  }
273 
274  void Gui::setVisiblePointer(bool _value)
275  {
276  mPointerManager->setVisible(_value);
277  }
278 
280  {
281  return mPointerManager->isVisible();
282  }
283 
284  void Gui::_injectFrameEntered(float _time)
285  {
286  eventFrameStart(_time);
287  }
288 
289  void Gui::_unlinkWidget(Widget* _widget)
290  {
291  eventFrameStart.clear(_widget);
292  }
293 
294  void Gui::_linkChildWidget(Widget* _widget)
295  {
296  VectorWidgetPtr::iterator iter = std::find(mWidgetChild.begin(), mWidgetChild.end(), _widget);
297  MYGUI_ASSERT(iter == mWidgetChild.end(), "widget already exist");
298  mWidgetChild.push_back(_widget);
299  }
300 
301  void Gui::_unlinkChildWidget(Widget* _widget)
302  {
303  VectorWidgetPtr::iterator iter = std::remove(mWidgetChild.begin(), mWidgetChild.end(), _widget);
304  MYGUI_ASSERT(iter != mWidgetChild.end(), "widget not found");
305  mWidgetChild.erase(iter);
306  }
307 
308  void Gui::resizeWindow(const IntSize& _size)
309  {
310  IntSize oldViewSize = mViewSize;
311  mViewSize = _size;
312 
313  // выравниваем рутовые окна
314  for (VectorWidgetPtr::iterator iter = mWidgetChild.begin(); iter!=mWidgetChild.end(); ++iter)
315  {
316  ((ICroppedRectangle*)(*iter))->_setAlign(oldViewSize, true);
317  }
318  }
319 
320 } // namespace MyGUI