MyGUI  3.2.1
MyGUI_Gui.cpp
Go to the documentation of this file.
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