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