MyGUI 3.0.1
|
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_LanguageManager.h" 00041 #include "MyGUI_ResourceManager.h" 00042 #include "MyGUI_RenderManager.h" 00043 #include "MyGUI_FactoryManager.h" 00044 00045 namespace MyGUI 00046 { 00047 00048 const std::string INSTANCE_TYPE_NAME("Gui"); 00049 00050 Gui* Gui::msInstance = nullptr; 00051 00052 Gui* Gui::getInstancePtr() 00053 { 00054 return msInstance; 00055 } 00056 00057 Gui& Gui::getInstance() 00058 { 00059 MYGUI_ASSERT(0 != msInstance, "instance " << INSTANCE_TYPE_NAME << " was not created"); 00060 return (*msInstance); 00061 } 00062 00063 Gui::Gui() : 00064 mIsInitialise(false) 00065 { 00066 MYGUI_ASSERT(0 == msInstance, "instance " << INSTANCE_TYPE_NAME << " is exsist"); 00067 msInstance = this; 00068 } 00069 00070 Gui::~Gui() 00071 { 00072 msInstance = nullptr; 00073 } 00074 00075 void Gui::initialise(const std::string& _core, const std::string& _logFileName) 00076 { 00077 // самый первый лог 00078 LogManager::registerSection(MYGUI_LOG_SECTION, _logFileName); 00079 00080 MYGUI_ASSERT(!mIsInitialise, INSTANCE_TYPE_NAME << " initialised twice"); 00081 00082 MYGUI_LOG(Info, "* Initialise: " << INSTANCE_TYPE_NAME); 00083 MYGUI_LOG(Info, "* MyGUI version " 00084 << MYGUI_VERSION_MAJOR << "." 00085 << MYGUI_VERSION_MINOR << "." 00086 << MYGUI_VERSION_PATCH); 00087 00088 // создаем и инициализируем синглтоны 00089 mResourceManager = new ResourceManager(); 00090 mLayerManager = new LayerManager(); 00091 mWidgetManager = new WidgetManager(); 00092 mInputManager = new InputManager(); 00093 mSubWidgetManager = new SubWidgetManager(); 00094 mSkinManager = new SkinManager(); 00095 mFontManager = new FontManager(); 00096 mControllerManager = new ControllerManager(); 00097 mPointerManager = new PointerManager(); 00098 mClipboardManager = new ClipboardManager(); 00099 mLayoutManager = new LayoutManager(); 00100 mDynLibManager = new DynLibManager(); 00101 mPluginManager = new PluginManager(); 00102 mLanguageManager = new LanguageManager(); 00103 mFactoryManager = new FactoryManager(); 00104 00105 mResourceManager->initialise(); 00106 mLayerManager->initialise(); 00107 mWidgetManager->initialise(); 00108 mInputManager->initialise(); 00109 mSubWidgetManager->initialise(); 00110 mSkinManager->initialise(); 00111 mFontManager->initialise(); 00112 mControllerManager->initialise(); 00113 mPointerManager->initialise(); 00114 mClipboardManager->initialise(); 00115 mLayoutManager->initialise(); 00116 mDynLibManager->initialise(); 00117 mPluginManager->initialise(); 00118 mLanguageManager->initialise(); 00119 mFactoryManager->initialise(); 00120 00121 WidgetManager::getInstance().registerUnlinker(this); 00122 00123 // загружаем дефолтные настройки если надо 00124 if ( _core.empty() == false ) mResourceManager->load(_core); 00125 00126 mViewSize = RenderManager::getInstance().getViewSize(); 00127 resizeWindow(mViewSize); 00128 00129 MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully initialized"); 00130 mIsInitialise = true; 00131 } 00132 00133 void Gui::shutdown() 00134 { 00135 if (!mIsInitialise) return; 00136 MYGUI_LOG(Info, "* Shutdown: " << INSTANCE_TYPE_NAME); 00137 00138 _destroyAllChildWidget(); 00139 00140 // деинициализируем и удаляем синглтоны 00141 mPointerManager->shutdown(); 00142 mInputManager->shutdown(); 00143 mSkinManager->shutdown(); 00144 mSubWidgetManager->shutdown(); 00145 mLayerManager->shutdown(); 00146 mFontManager->shutdown(); 00147 mControllerManager->shutdown(); 00148 mClipboardManager->shutdown(); 00149 mLayoutManager->shutdown(); 00150 mPluginManager->shutdown(); 00151 mDynLibManager->shutdown(); 00152 mLanguageManager->shutdown(); 00153 mResourceManager->shutdown(); 00154 mFactoryManager->shutdown(); 00155 00156 WidgetManager::getInstance().unregisterUnlinker(this); 00157 mWidgetManager->shutdown(); 00158 00159 delete mPointerManager; 00160 delete mWidgetManager; 00161 delete mInputManager; 00162 delete mSkinManager; 00163 delete mSubWidgetManager; 00164 delete mLayerManager; 00165 delete mFontManager; 00166 delete mControllerManager; 00167 delete mClipboardManager; 00168 delete mLayoutManager; 00169 delete mDynLibManager; 00170 delete mPluginManager; 00171 delete mLanguageManager; 00172 delete mResourceManager; 00173 delete mFactoryManager; 00174 00175 MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully shutdown"); 00176 00177 // last gui log 00178 LogManager::unregisterSection(MYGUI_LOG_SECTION); 00179 00180 mIsInitialise = false; 00181 } 00182 00183 bool Gui::injectMouseMove( int _absx, int _absy, int _absz) { return mInputManager->injectMouseMove(_absx, _absy, _absz); } 00184 bool Gui::injectMousePress( int _absx, int _absy, MouseButton _id ) { return mInputManager->injectMousePress(_absx, _absy, _id); } 00185 bool Gui::injectMouseRelease( int _absx, int _absy, MouseButton _id ) { return mInputManager->injectMouseRelease(_absx, _absy, _id); } 00186 00187 bool Gui::injectKeyPress(KeyCode _key, Char _text) { return mInputManager->injectKeyPress(_key, _text); } 00188 bool Gui::injectKeyRelease(KeyCode _key) { return mInputManager->injectKeyRelease(_key); } 00189 00190 00191 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) 00192 { 00193 Widget* widget = WidgetManager::getInstance().createWidget(_style, _type, _skin, _coord, _align, nullptr, nullptr, this, _name); 00194 mWidgetChild.push_back(widget); 00195 // присоединяем виджет с уровню 00196 if (!_layer.empty()) LayerManager::getInstance().attachToLayerNode(_layer, widget); 00197 return widget; 00198 } 00199 00200 Widget* Gui::findWidgetT(const std::string& _name, bool _throw) 00201 { 00202 for (VectorWidgetPtr::iterator iter = mWidgetChild.begin(); iter!=mWidgetChild.end(); ++iter) 00203 { 00204 Widget* widget = (*iter)->findWidget(_name); 00205 if (widget != nullptr) return widget; 00206 } 00207 MYGUI_ASSERT(!_throw, "Widget '" << _name << "' not found"); 00208 return nullptr; 00209 } 00210 00211 // удяляет неудачника 00212 void Gui::_destroyChildWidget(Widget* _widget) 00213 { 00214 MYGUI_ASSERT(nullptr != _widget, "invalid widget pointer"); 00215 00216 VectorWidgetPtr::iterator iter = std::find(mWidgetChild.begin(), mWidgetChild.end(), _widget); 00217 if (iter != mWidgetChild.end()) 00218 { 00219 // сохраняем указатель 00220 MyGUI::Widget* widget = *iter; 00221 00222 // удаляем из списка 00223 *iter = mWidgetChild.back(); 00224 mWidgetChild.pop_back(); 00225 00226 // отписываем от всех 00227 mWidgetManager->unlinkFromUnlinkers(_widget); 00228 00229 // непосредственное удаление 00230 _deleteWidget(widget); 00231 } 00232 else MYGUI_EXCEPT("Widget '" << _widget->getName() << "' not found"); 00233 } 00234 00235 // удаляет всех детей 00236 void Gui::_destroyAllChildWidget() 00237 { 00238 while (!mWidgetChild.empty()) 00239 { 00240 // сразу себя отписывем, иначе вложенной удаление убивает все 00241 Widget* widget = mWidgetChild.back(); 00242 mWidgetChild.pop_back(); 00243 00244 //widget->detachWidget(); 00245 00246 // отписываем от всех 00247 mWidgetManager->unlinkFromUnlinkers(widget); 00248 00249 // и сами удалим, так как его больше в списке нет 00250 _deleteWidget(widget); 00251 } 00252 } 00253 00254 bool Gui::load(const std::string& _file) 00255 { 00256 return mResourceManager->load(_file); 00257 } 00258 00259 void Gui::destroyWidget(Widget* _widget) 00260 { 00261 mWidgetManager->destroyWidget(_widget); 00262 } 00263 00264 void Gui::destroyWidgets(VectorWidgetPtr& _widgets) 00265 { 00266 mWidgetManager->destroyWidgets(_widgets); 00267 } 00268 00269 void Gui::destroyWidgets(EnumeratorWidgetPtr& _widgets) 00270 { 00271 mWidgetManager->destroyWidgets(_widgets); 00272 } 00273 00274 void Gui::setVisiblePointer(bool _value) 00275 { 00276 mPointerManager->setVisible(_value); 00277 } 00278 00279 bool Gui::isVisiblePointer() 00280 { 00281 return mPointerManager->isVisible(); 00282 } 00283 00284 void Gui::_injectFrameEntered(float _time) 00285 { 00286 eventFrameStart(_time); 00287 } 00288 00289 void Gui::_unlinkWidget(Widget* _widget) 00290 { 00291 eventFrameStart.clear(_widget); 00292 } 00293 00294 void Gui::_linkChildWidget(Widget* _widget) 00295 { 00296 VectorWidgetPtr::iterator iter = std::find(mWidgetChild.begin(), mWidgetChild.end(), _widget); 00297 MYGUI_ASSERT(iter == mWidgetChild.end(), "widget already exist"); 00298 mWidgetChild.push_back(_widget); 00299 } 00300 00301 void Gui::_unlinkChildWidget(Widget* _widget) 00302 { 00303 VectorWidgetPtr::iterator iter = std::remove(mWidgetChild.begin(), mWidgetChild.end(), _widget); 00304 MYGUI_ASSERT(iter != mWidgetChild.end(), "widget not found"); 00305 mWidgetChild.erase(iter); 00306 } 00307 00308 void Gui::resizeWindow(const IntSize& _size) 00309 { 00310 IntSize oldViewSize = mViewSize; 00311 mViewSize = _size; 00312 00313 // выравниваем рутовые окна 00314 for (VectorWidgetPtr::iterator iter = mWidgetChild.begin(); iter!=mWidgetChild.end(); ++iter) 00315 { 00316 ((ICroppedRectangle*)(*iter))->_setAlign(oldViewSize, true); 00317 } 00318 } 00319 00320 } // namespace MyGUI