MyGUI
3.2.1
|
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_Widget.h" 00010 00011 #include "MyGUI_InputManager.h" 00012 #include "MyGUI_SubWidgetManager.h" 00013 #include "MyGUI_LogManager.h" 00014 #include "MyGUI_SkinManager.h" 00015 #include "MyGUI_WidgetManager.h" 00016 #include "MyGUI_LayerManager.h" 00017 #include "MyGUI_FontManager.h" 00018 #include "MyGUI_ControllerManager.h" 00019 #include "MyGUI_PointerManager.h" 00020 #include "MyGUI_ClipboardManager.h" 00021 #include "MyGUI_LayoutManager.h" 00022 #include "MyGUI_PluginManager.h" 00023 #include "MyGUI_DynLibManager.h" 00024 #include "MyGUI_LanguageManager.h" 00025 #include "MyGUI_ResourceManager.h" 00026 #include "MyGUI_RenderManager.h" 00027 #include "MyGUI_FactoryManager.h" 00028 #include "MyGUI_ToolTipManager.h" 00029 #include "MyGUI_TextureUtility.h" 00030 00031 namespace MyGUI 00032 { 00033 00034 template <> Gui* Singleton<Gui>::msInstance = nullptr; 00035 template <> const char* Singleton<Gui>::mClassTypeName = "Gui"; 00036 00037 Gui::Gui() : 00038 mInputManager(nullptr), 00039 mSubWidgetManager(nullptr), 00040 mLayerManager(nullptr), 00041 mSkinManager(nullptr), 00042 mWidgetManager(nullptr), 00043 mFontManager(nullptr), 00044 mControllerManager(nullptr), 00045 mPointerManager(nullptr), 00046 mClipboardManager(nullptr), 00047 mLayoutManager(nullptr), 00048 mDynLibManager(nullptr), 00049 mPluginManager(nullptr), 00050 mLanguageManager(nullptr), 00051 mResourceManager(nullptr), 00052 mFactoryManager(nullptr), 00053 mToolTipManager(nullptr), 00054 mIsInitialise(false) 00055 { 00056 } 00057 00058 void Gui::initialise(const std::string& _core) 00059 { 00060 MYGUI_ASSERT(!mIsInitialise, getClassTypeName() << " initialised twice"); 00061 MYGUI_LOG(Info, "* Initialise: " << getClassTypeName()); 00062 00063 MYGUI_LOG(Info, "* MyGUI version " 00064 << MYGUI_VERSION_MAJOR << "." 00065 << MYGUI_VERSION_MINOR << "." 00066 << MYGUI_VERSION_PATCH); 00067 00068 // создаем и инициализируем синглтоны 00069 mResourceManager = new ResourceManager(); 00070 mLayerManager = new LayerManager(); 00071 mWidgetManager = new WidgetManager(); 00072 mInputManager = new InputManager(); 00073 mSubWidgetManager = new SubWidgetManager(); 00074 mSkinManager = new SkinManager(); 00075 mFontManager = new FontManager(); 00076 mControllerManager = new ControllerManager(); 00077 mPointerManager = new PointerManager(); 00078 mClipboardManager = new ClipboardManager(); 00079 mLayoutManager = new LayoutManager(); 00080 mDynLibManager = new DynLibManager(); 00081 mPluginManager = new PluginManager(); 00082 mLanguageManager = new LanguageManager(); 00083 mFactoryManager = new FactoryManager(); 00084 mToolTipManager = new ToolTipManager(); 00085 00086 mResourceManager->initialise(); 00087 mLayerManager->initialise(); 00088 mWidgetManager->initialise(); 00089 mInputManager->initialise(); 00090 mSubWidgetManager->initialise(); 00091 mSkinManager->initialise(); 00092 mFontManager->initialise(); 00093 mControllerManager->initialise(); 00094 mPointerManager->initialise(); 00095 mClipboardManager->initialise(); 00096 mLayoutManager->initialise(); 00097 mDynLibManager->initialise(); 00098 mPluginManager->initialise(); 00099 mLanguageManager->initialise(); 00100 mFactoryManager->initialise(); 00101 mToolTipManager->initialise(); 00102 00103 WidgetManager::getInstance().registerUnlinker(this); 00104 00105 // загружаем дефолтные настройки если надо 00106 if (!_core.empty()) 00107 mResourceManager->load(_core); 00108 00109 BackwardCompatibility::initialise(); 00110 00111 MYGUI_LOG(Info, getClassTypeName() << " successfully initialized"); 00112 mIsInitialise = true; 00113 } 00114 00115 #ifndef MYGUI_DONT_USE_OBSOLETE 00116 void Gui::initialise(const std::string& _core, const std::string& _logFileName) 00117 { 00118 initialise(_core); 00119 } 00120 #endif // MYGUI_DONT_USE_OBSOLETE 00121 00122 void Gui::shutdown() 00123 { 00124 MYGUI_ASSERT(mIsInitialise, getClassTypeName() << " is not initialised"); 00125 MYGUI_LOG(Info, "* Shutdown: " << getClassTypeName()); 00126 00127 BackwardCompatibility::shutdown(); 00128 00129 _destroyAllChildWidget(); 00130 00131 // деинициализируем и удаляем синглтоны 00132 mPointerManager->shutdown(); 00133 mInputManager->shutdown(); 00134 mSkinManager->shutdown(); 00135 mSubWidgetManager->shutdown(); 00136 mLayerManager->shutdown(); 00137 mFontManager->shutdown(); 00138 mControllerManager->shutdown(); 00139 mClipboardManager->shutdown(); 00140 mLayoutManager->shutdown(); 00141 mPluginManager->shutdown(); 00142 mDynLibManager->shutdown(); 00143 mLanguageManager->shutdown(); 00144 mResourceManager->shutdown(); 00145 mFactoryManager->shutdown(); 00146 mToolTipManager->shutdown(); 00147 00148 WidgetManager::getInstance().unregisterUnlinker(this); 00149 mWidgetManager->shutdown(); 00150 00151 delete mPointerManager; 00152 delete mWidgetManager; 00153 delete mInputManager; 00154 delete mSkinManager; 00155 delete mSubWidgetManager; 00156 delete mLayerManager; 00157 delete mFontManager; 00158 delete mControllerManager; 00159 delete mClipboardManager; 00160 delete mLayoutManager; 00161 delete mDynLibManager; 00162 delete mPluginManager; 00163 delete mLanguageManager; 00164 delete mResourceManager; 00165 delete mFactoryManager; 00166 delete mToolTipManager; 00167 00168 // сбрасываем кеш 00169 texture_utility::getTextureSize("", false); 00170 00171 MYGUI_LOG(Info, getClassTypeName() << " successfully shutdown"); 00172 mIsInitialise = false; 00173 } 00174 00175 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) 00176 { 00177 Widget* widget = WidgetManager::getInstance().createWidget(_style, _type, _skin, _coord, /*_align, */nullptr, nullptr, _name); 00178 mWidgetChild.push_back(widget); 00179 00180 widget->setAlign(_align); 00181 00182 // присоединяем виджет с уровню 00183 if (!_layer.empty()) 00184 LayerManager::getInstance().attachToLayerNode(_layer, widget); 00185 return widget; 00186 } 00187 00188 Widget* Gui::findWidgetT(const std::string& _name, bool _throw) 00189 { 00190 for (VectorWidgetPtr::iterator iter = mWidgetChild.begin(); iter != mWidgetChild.end(); ++iter) 00191 { 00192 Widget* widget = (*iter)->findWidget(_name); 00193 if (widget != nullptr) return widget; 00194 } 00195 MYGUI_ASSERT(!_throw, "Widget '" << _name << "' not found"); 00196 return nullptr; 00197 } 00198 00199 // удяляет неудачника 00200 void Gui::_destroyChildWidget(Widget* _widget) 00201 { 00202 MYGUI_ASSERT(nullptr != _widget, "invalid widget pointer"); 00203 00204 VectorWidgetPtr::iterator iter = std::find(mWidgetChild.begin(), mWidgetChild.end(), _widget); 00205 if (iter != mWidgetChild.end()) 00206 { 00207 // сохраняем указатель 00208 MyGUI::Widget* widget = *iter; 00209 00210 // удаляем из списка 00211 mWidgetChild.erase(iter); 00212 00213 // отписываем от всех 00214 mWidgetManager->unlinkFromUnlinkers(_widget); 00215 00216 // непосредственное удаление 00217 WidgetManager::getInstance()._deleteWidget(widget); 00218 } 00219 else 00220 { 00221 MYGUI_EXCEPT("Widget '" << _widget->getName() << "' not found"); 00222 } 00223 } 00224 00225 // удаляет всех детей 00226 void Gui::_destroyAllChildWidget() 00227 { 00228 while (!mWidgetChild.empty()) 00229 { 00230 // сразу себя отписывем, иначе вложенной удаление убивает все 00231 Widget* widget = mWidgetChild.back(); 00232 mWidgetChild.pop_back(); 00233 00234 // отписываем от всех 00235 mWidgetManager->unlinkFromUnlinkers(widget); 00236 00237 // и сами удалим, так как его больше в списке нет 00238 WidgetManager::getInstance()._deleteWidget(widget); 00239 } 00240 } 00241 00242 void Gui::destroyWidget(Widget* _widget) 00243 { 00244 Widget* parent = _widget->getParent(); 00245 if (parent != nullptr) 00246 parent->_destroyChildWidget(_widget); 00247 else 00248 _destroyChildWidget(_widget); 00249 } 00250 00251 void Gui::destroyWidgets(const VectorWidgetPtr& _widgets) 00252 { 00253 for (VectorWidgetPtr::const_iterator iter = _widgets.begin(); iter != _widgets.end(); ++iter) 00254 destroyWidget(*iter); 00255 } 00256 00257 void Gui::destroyWidgets(EnumeratorWidgetPtr& _widgets) 00258 { 00259 VectorWidgetPtr widgets; 00260 while (_widgets.next()) 00261 widgets.push_back(_widgets.current()); 00262 destroyWidgets(widgets); 00263 } 00264 00265 void Gui::_unlinkWidget(Widget* _widget) 00266 { 00267 eventFrameStart.clear(_widget); 00268 } 00269 00270 void Gui::_linkChildWidget(Widget* _widget) 00271 { 00272 VectorWidgetPtr::iterator iter = std::find(mWidgetChild.begin(), mWidgetChild.end(), _widget); 00273 MYGUI_ASSERT(iter == mWidgetChild.end(), "widget already exist"); 00274 mWidgetChild.push_back(_widget); 00275 } 00276 00277 void Gui::_unlinkChildWidget(Widget* _widget) 00278 { 00279 VectorWidgetPtr::iterator iter = std::remove(mWidgetChild.begin(), mWidgetChild.end(), _widget); 00280 MYGUI_ASSERT(iter != mWidgetChild.end(), "widget not found"); 00281 mWidgetChild.erase(iter); 00282 } 00283 00284 Widget* Gui::createWidgetT(const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, const std::string& _layer, const std::string& _name) 00285 { 00286 return baseCreateWidget(WidgetStyle::Overlapped, _type, _skin, _coord, _align, _layer, _name); 00287 } 00289 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) 00290 { 00291 return createWidgetT(_type, _skin, IntCoord(_left, _top, _width, _height), _align, _layer, _name); 00292 } 00294 Widget* Gui::createWidgetRealT(const std::string& _type, const std::string& _skin, const FloatCoord& _coord, Align _align, const std::string& _layer, const std::string& _name) 00295 { 00296 IntSize size = RenderManager::getInstance().getViewSize(); 00297 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); 00298 } 00300 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) 00301 { 00302 IntSize size = RenderManager::getInstance().getViewSize(); 00303 return createWidgetT(_type, _skin, IntCoord((int)(_left * size.width), (int)(_top * size.height), (int)(_width * size.width), (int)(_height * size.height)), _align, _layer, _name); 00304 } 00305 00306 Widget* Gui::findWidgetT(const std::string& _name, const std::string& _prefix, bool _throw) 00307 { 00308 return findWidgetT(_prefix + _name, _throw); 00309 } 00310 00311 void Gui::destroyChildWidget(Widget* _widget) 00312 { 00313 _destroyChildWidget(_widget); 00314 } 00315 00316 void Gui::destroyAllChildWidget() 00317 { 00318 _destroyAllChildWidget(); 00319 } 00320 00321 EnumeratorWidgetPtr Gui::getEnumerator() const 00322 { 00323 return EnumeratorWidgetPtr(mWidgetChild); 00324 } 00325 00326 void Gui::frameEvent(float _time) 00327 { 00328 eventFrameStart(_time); 00329 } 00330 00331 } // namespace MyGUI