• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • Examples
  • File List
  • Globals

MyGUI_Gui.cpp

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

Generated on Sun Jan 30 2011 for MyGUI by  doxygen 1.7.1