MyGUI
3.2.1
|
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_WidgetManager.h" 00009 #include "MyGUI_Gui.h" 00010 #include "MyGUI_Widget.h" 00011 #include "MyGUI_FactoryManager.h" 00012 00013 #include "MyGUI_Button.h" 00014 #include "MyGUI_Canvas.h" 00015 #include "MyGUI_ComboBox.h" 00016 #include "MyGUI_DDContainer.h" 00017 #include "MyGUI_EditBox.h" 00018 #include "MyGUI_ItemBox.h" 00019 #include "MyGUI_ListBox.h" 00020 #include "MyGUI_MenuBar.h" 00021 #include "MyGUI_MenuControl.h" 00022 #include "MyGUI_MenuItem.h" 00023 #include "MyGUI_MultiListBox.h" 00024 #include "MyGUI_MultiListItem.h" 00025 #include "MyGUI_PopupMenu.h" 00026 #include "MyGUI_ProgressBar.h" 00027 #include "MyGUI_ScrollBar.h" 00028 #include "MyGUI_ScrollView.h" 00029 #include "MyGUI_ImageBox.h" 00030 #include "MyGUI_TextBox.h" 00031 #include "MyGUI_TabControl.h" 00032 #include "MyGUI_TabItem.h" 00033 #include "MyGUI_Widget.h" 00034 #include "MyGUI_Window.h" 00035 00036 #include "MyGUI_BackwardCompatibility.h" 00037 00038 namespace MyGUI 00039 { 00040 00041 template <> WidgetManager* Singleton<WidgetManager>::msInstance = nullptr; 00042 template <> const char* Singleton<WidgetManager>::mClassTypeName = "WidgetManager"; 00043 00044 WidgetManager::WidgetManager() : 00045 mIsInitialise(false), 00046 mCategoryName("Widget") 00047 { 00048 } 00049 00050 void WidgetManager::initialise() 00051 { 00052 MYGUI_ASSERT(!mIsInitialise, getClassTypeName() << " initialised twice"); 00053 MYGUI_LOG(Info, "* Initialise: " << getClassTypeName()); 00054 00055 FactoryManager& factory = FactoryManager::getInstance(); 00056 00057 factory.registerFactory<Button>(mCategoryName); 00058 factory.registerFactory<Canvas>(mCategoryName); 00059 factory.registerFactory<ComboBox>(mCategoryName); 00060 factory.registerFactory<DDContainer>(mCategoryName); 00061 factory.registerFactory<EditBox>(mCategoryName); 00062 factory.registerFactory<ItemBox>(mCategoryName); 00063 factory.registerFactory<ListBox>(mCategoryName); 00064 factory.registerFactory<MenuBar>(mCategoryName); 00065 factory.registerFactory<MenuControl>(mCategoryName); 00066 factory.registerFactory<MenuItem>(mCategoryName); 00067 factory.registerFactory<MultiListBox>(mCategoryName); 00068 factory.registerFactory<MultiListItem>(mCategoryName); 00069 factory.registerFactory<PopupMenu>(mCategoryName); 00070 factory.registerFactory<ProgressBar>(mCategoryName); 00071 factory.registerFactory<ScrollBar>(mCategoryName); 00072 factory.registerFactory<ScrollView>(mCategoryName); 00073 factory.registerFactory<ImageBox>(mCategoryName); 00074 factory.registerFactory<TextBox>(mCategoryName); 00075 factory.registerFactory<TabControl>(mCategoryName); 00076 factory.registerFactory<TabItem>(mCategoryName); 00077 factory.registerFactory<Widget>(mCategoryName); 00078 factory.registerFactory<Window>(mCategoryName); 00079 00080 BackwardCompatibility::registerWidgetTypes(); 00081 00082 Gui::getInstance().eventFrameStart += newDelegate(this, &WidgetManager::notifyEventFrameStart); 00083 00084 MYGUI_LOG(Info, getClassTypeName() << " successfully initialized"); 00085 mIsInitialise = true; 00086 } 00087 00088 void WidgetManager::shutdown() 00089 { 00090 MYGUI_ASSERT(mIsInitialise, getClassTypeName() << " is not initialised"); 00091 MYGUI_LOG(Info, "* Shutdown: " << getClassTypeName()); 00092 00093 Gui::getInstance().eventFrameStart -= newDelegate(this, &WidgetManager::notifyEventFrameStart); 00094 _deleteDelayWidgets(); 00095 00096 mVectorIUnlinkWidget.clear(); 00097 00098 FactoryManager::getInstance().unregisterFactory(mCategoryName); 00099 00100 MYGUI_LOG(Info, getClassTypeName() << " successfully shutdown"); 00101 mIsInitialise = false; 00102 } 00103 00104 Widget* WidgetManager::createWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Widget* _parent, ICroppedRectangle* _cropeedParent, const std::string& _name) 00105 { 00106 IObject* object = FactoryManager::getInstance().createObject(mCategoryName, _type); 00107 if (object != nullptr) 00108 { 00109 Widget* widget = object->castType<Widget>(); 00110 widget->_initialise(_style, _coord, _skin, _parent, _cropeedParent, _name); 00111 00112 return widget; 00113 } 00114 00115 MYGUI_EXCEPT("factory '" << _type << "' not found"); 00116 } 00117 00118 void WidgetManager::destroyWidget(Widget* _widget) 00119 { 00120 Gui::getInstance().destroyWidget(_widget); 00121 } 00122 00123 void WidgetManager::destroyWidgets(const VectorWidgetPtr& _widgets) 00124 { 00125 Gui::getInstance().destroyWidgets(_widgets); 00126 } 00127 00128 void WidgetManager::destroyWidgets(EnumeratorWidgetPtr _widgets) 00129 { 00130 Gui::getInstance().destroyWidgets(_widgets); 00131 } 00132 00133 void WidgetManager::registerUnlinker(IUnlinkWidget* _unlink) 00134 { 00135 unregisterUnlinker(_unlink); 00136 mVectorIUnlinkWidget.push_back(_unlink); 00137 } 00138 00139 void WidgetManager::unregisterUnlinker(IUnlinkWidget* _unlink) 00140 { 00141 VectorIUnlinkWidget::iterator iter = std::remove(mVectorIUnlinkWidget.begin(), mVectorIUnlinkWidget.end(), _unlink); 00142 if (iter != mVectorIUnlinkWidget.end()) 00143 mVectorIUnlinkWidget.erase(iter); 00144 } 00145 00146 void WidgetManager::unlinkFromUnlinkers(Widget* _widget) 00147 { 00148 for (VectorIUnlinkWidget::iterator iter = mVectorIUnlinkWidget.begin(); iter != mVectorIUnlinkWidget.end(); ++iter) 00149 { 00150 (*iter)->_unlinkWidget(_widget); 00151 } 00152 } 00153 00154 bool WidgetManager::isFactoryExist(const std::string& _type) 00155 { 00156 if (FactoryManager::getInstance().isFactoryExist(mCategoryName, _type)) 00157 { 00158 return true; 00159 } 00160 00161 return false; 00162 } 00163 00164 void WidgetManager::notifyEventFrameStart(float _time) 00165 { 00166 _deleteDelayWidgets(); 00167 } 00168 00169 void WidgetManager::_deleteWidget(Widget* _widget) 00170 { 00171 _widget->_shutdown(); 00172 00173 for (VectorWidgetPtr::iterator entry = mDestroyWidgets.begin(); entry != mDestroyWidgets.end(); ++entry) 00174 { 00175 /*if ((*entry) == _widget) 00176 return;*/ 00177 MYGUI_ASSERT((*entry) != _widget, "double delete widget"); 00178 } 00179 00180 mDestroyWidgets.push_back(_widget); 00181 } 00182 00183 void WidgetManager::_deleteDelayWidgets() 00184 { 00185 if (!mDestroyWidgets.empty()) 00186 { 00187 for (VectorWidgetPtr::iterator entry = mDestroyWidgets.begin(); entry != mDestroyWidgets.end(); ++entry) 00188 delete (*entry); 00189 mDestroyWidgets.clear(); 00190 } 00191 } 00192 00193 const std::string& WidgetManager::getCategoryName() const 00194 { 00195 return mCategoryName; 00196 } 00197 00198 } // namespace MyGUI