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