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" 9 #include "MyGUI_Widget.h" 10 11 #include "MyGUI_InputManager.h" 12 #include "MyGUI_SubWidgetManager.h" 13 #include "MyGUI_LogManager.h" 14 #include "MyGUI_SkinManager.h" 15 #include "MyGUI_WidgetManager.h" 16 #include "MyGUI_LayerManager.h" 17 #include "MyGUI_FontManager.h" 18 #include "MyGUI_ControllerManager.h" 19 #include "MyGUI_PointerManager.h" 20 #include "MyGUI_ClipboardManager.h" 21 #include "MyGUI_LayoutManager.h" 22 #include "MyGUI_PluginManager.h" 23 #include "MyGUI_DynLibManager.h" 24 #include "MyGUI_LanguageManager.h" 25 #include "MyGUI_ResourceManager.h" 26 #include "MyGUI_RenderManager.h" 27 #include "MyGUI_FactoryManager.h" 28 #include "MyGUI_ToolTipManager.h" 29 #include "MyGUI_TextureUtility.h" 30 31 namespace MyGUI 32 { 33 34 template <> Gui* Singleton<Gui>::msInstance = nullptr; 35 template <> const char* Singleton<Gui>::mClassTypeName = "Gui"; 36 Gui()37 Gui::Gui() : 38 mInputManager(nullptr), 39 mSubWidgetManager(nullptr), 40 mLayerManager(nullptr), 41 mSkinManager(nullptr), 42 mWidgetManager(nullptr), 43 mFontManager(nullptr), 44 mControllerManager(nullptr), 45 mPointerManager(nullptr), 46 mClipboardManager(nullptr), 47 mLayoutManager(nullptr), 48 mDynLibManager(nullptr), 49 mPluginManager(nullptr), 50 mLanguageManager(nullptr), 51 mResourceManager(nullptr), 52 mFactoryManager(nullptr), 53 mToolTipManager(nullptr), 54 mIsInitialise(false) 55 { 56 } 57 initialise(const std::string & _core)58 void Gui::initialise(const std::string& _core) 59 { 60 MYGUI_ASSERT(!mIsInitialise, getClassTypeName() << " initialised twice"); 61 MYGUI_LOG(Info, "* Initialise: " << getClassTypeName()); 62 63 MYGUI_LOG(Info, "* MyGUI version " 64 << MYGUI_VERSION_MAJOR << "." 65 << MYGUI_VERSION_MINOR << "." 66 << MYGUI_VERSION_PATCH); 67 68 // создаем и инициализируем синглтоны 69 mResourceManager = new ResourceManager(); 70 mLayerManager = new LayerManager(); 71 mWidgetManager = new WidgetManager(); 72 mInputManager = new InputManager(); 73 mSubWidgetManager = new SubWidgetManager(); 74 mSkinManager = new SkinManager(); 75 mFontManager = new FontManager(); 76 mControllerManager = new ControllerManager(); 77 mPointerManager = new PointerManager(); 78 mClipboardManager = new ClipboardManager(); 79 mLayoutManager = new LayoutManager(); 80 mDynLibManager = new DynLibManager(); 81 mPluginManager = new PluginManager(); 82 mLanguageManager = new LanguageManager(); 83 mFactoryManager = new FactoryManager(); 84 mToolTipManager = new ToolTipManager(); 85 86 mResourceManager->initialise(); 87 mLayerManager->initialise(); 88 mWidgetManager->initialise(); 89 mInputManager->initialise(); 90 mSubWidgetManager->initialise(); 91 mSkinManager->initialise(); 92 mFontManager->initialise(); 93 mControllerManager->initialise(); 94 mPointerManager->initialise(); 95 mClipboardManager->initialise(); 96 mLayoutManager->initialise(); 97 mDynLibManager->initialise(); 98 mPluginManager->initialise(); 99 mLanguageManager->initialise(); 100 mFactoryManager->initialise(); 101 mToolTipManager->initialise(); 102 103 WidgetManager::getInstance().registerUnlinker(this); 104 105 // загружаем дефолтные настройки если надо 106 if (!_core.empty()) 107 mResourceManager->load(_core); 108 109 BackwardCompatibility::initialise(); 110 111 MYGUI_LOG(Info, getClassTypeName() << " successfully initialized"); 112 mIsInitialise = true; 113 } 114 115 #ifndef MYGUI_DONT_USE_OBSOLETE initialise(const std::string & _core,const std::string & _logFileName)116 void Gui::initialise(const std::string& _core, const std::string& _logFileName) 117 { 118 initialise(_core); 119 } 120 #endif // MYGUI_DONT_USE_OBSOLETE 121 shutdown()122 void Gui::shutdown() 123 { 124 MYGUI_ASSERT(mIsInitialise, getClassTypeName() << " is not initialised"); 125 MYGUI_LOG(Info, "* Shutdown: " << getClassTypeName()); 126 127 BackwardCompatibility::shutdown(); 128 129 _destroyAllChildWidget(); 130 131 // деинициализируем и удаляем синглтоны 132 mPointerManager->shutdown(); 133 mInputManager->shutdown(); 134 mSkinManager->shutdown(); 135 mSubWidgetManager->shutdown(); 136 mLayerManager->shutdown(); 137 mFontManager->shutdown(); 138 mControllerManager->shutdown(); 139 mClipboardManager->shutdown(); 140 mLayoutManager->shutdown(); 141 mPluginManager->shutdown(); 142 mDynLibManager->shutdown(); 143 mLanguageManager->shutdown(); 144 mResourceManager->shutdown(); 145 mFactoryManager->shutdown(); 146 mToolTipManager->shutdown(); 147 148 WidgetManager::getInstance().unregisterUnlinker(this); 149 mWidgetManager->shutdown(); 150 151 delete mPointerManager; 152 delete mWidgetManager; 153 delete mInputManager; 154 delete mSkinManager; 155 delete mSubWidgetManager; 156 delete mLayerManager; 157 delete mFontManager; 158 delete mControllerManager; 159 delete mClipboardManager; 160 delete mLayoutManager; 161 delete mDynLibManager; 162 delete mPluginManager; 163 delete mLanguageManager; 164 delete mResourceManager; 165 delete mFactoryManager; 166 delete mToolTipManager; 167 168 // сбрасываем кеш 169 texture_utility::getTextureSize("", false); 170 171 MYGUI_LOG(Info, getClassTypeName() << " successfully shutdown"); 172 mIsInitialise = false; 173 } 174 baseCreateWidget(WidgetStyle _style,const std::string & _type,const std::string & _skin,const IntCoord & _coord,Align _align,const std::string & _layer,const std::string & _name)175 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) 176 { 177 Widget* widget = WidgetManager::getInstance().createWidget(_style, _type, _skin, _coord, /*_align, */nullptr, nullptr, _name); 178 mWidgetChild.push_back(widget); 179 180 widget->setAlign(_align); 181 182 // присоединяем виджет с уровню 183 if (!_layer.empty()) 184 LayerManager::getInstance().attachToLayerNode(_layer, widget); 185 return widget; 186 } 187 findWidgetT(const std::string & _name,bool _throw)188 Widget* Gui::findWidgetT(const std::string& _name, bool _throw) 189 { 190 for (VectorWidgetPtr::iterator iter = mWidgetChild.begin(); iter != mWidgetChild.end(); ++iter) 191 { 192 Widget* widget = (*iter)->findWidget(_name); 193 if (widget != nullptr) return widget; 194 } 195 MYGUI_ASSERT(!_throw, "Widget '" << _name << "' not found"); 196 return nullptr; 197 } 198 199 // удяляет неудачника _destroyChildWidget(Widget * _widget)200 void Gui::_destroyChildWidget(Widget* _widget) 201 { 202 MYGUI_ASSERT(nullptr != _widget, "invalid widget pointer"); 203 204 VectorWidgetPtr::iterator iter = std::find(mWidgetChild.begin(), mWidgetChild.end(), _widget); 205 if (iter != mWidgetChild.end()) 206 { 207 // сохраняем указатель 208 MyGUI::Widget* widget = *iter; 209 210 // удаляем из списка 211 mWidgetChild.erase(iter); 212 213 // отписываем от всех 214 mWidgetManager->unlinkFromUnlinkers(_widget); 215 216 // непосредственное удаление 217 WidgetManager::getInstance()._deleteWidget(widget); 218 } 219 else 220 { 221 MYGUI_EXCEPT("Widget '" << _widget->getName() << "' not found"); 222 } 223 } 224 225 // удаляет всех детей _destroyAllChildWidget()226 void Gui::_destroyAllChildWidget() 227 { 228 while (!mWidgetChild.empty()) 229 { 230 // сразу себя отписывем, иначе вложенной удаление убивает все 231 Widget* widget = mWidgetChild.back(); 232 mWidgetChild.pop_back(); 233 234 // отписываем от всех 235 mWidgetManager->unlinkFromUnlinkers(widget); 236 237 // и сами удалим, так как его больше в списке нет 238 WidgetManager::getInstance()._deleteWidget(widget); 239 } 240 } 241 destroyWidget(Widget * _widget)242 void Gui::destroyWidget(Widget* _widget) 243 { 244 Widget* parent = _widget->getParent(); 245 if (parent != nullptr) 246 parent->_destroyChildWidget(_widget); 247 else 248 _destroyChildWidget(_widget); 249 } 250 destroyWidgets(const VectorWidgetPtr & _widgets)251 void Gui::destroyWidgets(const VectorWidgetPtr& _widgets) 252 { 253 for (VectorWidgetPtr::const_iterator iter = _widgets.begin(); iter != _widgets.end(); ++iter) 254 destroyWidget(*iter); 255 } 256 destroyWidgets(EnumeratorWidgetPtr & _widgets)257 void Gui::destroyWidgets(EnumeratorWidgetPtr& _widgets) 258 { 259 VectorWidgetPtr widgets; 260 while (_widgets.next()) 261 widgets.push_back(_widgets.current()); 262 destroyWidgets(widgets); 263 } 264 _unlinkWidget(Widget * _widget)265 void Gui::_unlinkWidget(Widget* _widget) 266 { 267 eventFrameStart.clear(_widget); 268 } 269 _linkChildWidget(Widget * _widget)270 void Gui::_linkChildWidget(Widget* _widget) 271 { 272 VectorWidgetPtr::iterator iter = std::find(mWidgetChild.begin(), mWidgetChild.end(), _widget); 273 MYGUI_ASSERT(iter == mWidgetChild.end(), "widget already exist"); 274 mWidgetChild.push_back(_widget); 275 } 276 _unlinkChildWidget(Widget * _widget)277 void Gui::_unlinkChildWidget(Widget* _widget) 278 { 279 VectorWidgetPtr::iterator iter = std::remove(mWidgetChild.begin(), mWidgetChild.end(), _widget); 280 MYGUI_ASSERT(iter != mWidgetChild.end(), "widget not found"); 281 mWidgetChild.erase(iter); 282 } 283 createWidgetT(const std::string & _type,const std::string & _skin,const IntCoord & _coord,Align _align,const std::string & _layer,const std::string & _name)284 Widget* Gui::createWidgetT(const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name) 285 { 286 return baseCreateWidget(WidgetStyle::Overlapped, _type, _skin, _coord, _align, _layer, _name); 287 } 288 /** See Gui::createWidgetT */ createWidgetT(const std::string & _type,const std::string & _skin,int _left,int _top,int _width,int _height,Align _align,const std::string & _layer,const std::string & _name)289 Widget* Gui::createWidgetT(const std::string& _type, const std::string& _skin, int _left, int _top, int _width, int _height, Align _align, const std::string& _layer, const std::string& _name) 290 { 291 return createWidgetT(_type, _skin, IntCoord(_left, _top, _width, _height), _align, _layer, _name); 292 } 293 /** Create widget using coordinates relative to parent widget. see Gui::createWidgetT */ createWidgetRealT(const std::string & _type,const std::string & _skin,const FloatCoord & _coord,Align _align,const std::string & _layer,const std::string & _name)294 Widget* Gui::createWidgetRealT(const std::string& _type, const std::string& _skin, const FloatCoord& _coord, Align _align, const std::string& _layer, const std::string& _name) 295 { 296 IntSize size = RenderManager::getInstance().getViewSize(); 297 return createWidgetT(_type, _skin, IntCoord((int)(_coord.left * size.width), (int)(_coord.top * size.height), (int)(_coord.width * size.width), (int)(_coord.height * size.height)), _align, _layer, _name); 298 } 299 /** Create widget using coordinates relative to parent. see Gui::createWidgetT */ createWidgetRealT(const std::string & _type,const std::string & _skin,float _left,float _top,float _width,float _height,Align _align,const std::string & _layer,const std::string & _name)300 Widget* Gui::createWidgetRealT(const std::string& _type, const std::string& _skin, float _left, float _top, float _width, float _height, Align _align, const std::string& _layer, const std::string& _name) 301 { 302 IntSize size = RenderManager::getInstance().getViewSize(); 303 return createWidgetT(_type, _skin, IntCoord((int)(_left * size.width), (int)(_top * size.height), (int)(_width * size.width), (int)(_height * size.height)), _align, _layer, _name); 304 } 305 findWidgetT(const std::string & _name,const std::string & _prefix,bool _throw)306 Widget* Gui::findWidgetT(const std::string& _name, const std::string& _prefix, bool _throw) 307 { 308 return findWidgetT(_prefix + _name, _throw); 309 } 310 destroyChildWidget(Widget * _widget)311 void Gui::destroyChildWidget(Widget* _widget) 312 { 313 _destroyChildWidget(_widget); 314 } 315 destroyAllChildWidget()316 void Gui::destroyAllChildWidget() 317 { 318 _destroyAllChildWidget(); 319 } 320 getEnumerator() const321 EnumeratorWidgetPtr Gui::getEnumerator() const 322 { 323 return EnumeratorWidgetPtr(mWidgetChild); 324 } 325 frameEvent(float _time)326 void Gui::frameEvent(float _time) 327 { 328 eventFrameStart(_time); 329 } 330 331 } // namespace MyGUI 332