MyGUI
3.0.3
|
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_WidgetManager.h" 00026 #include "MyGUI_LayerManager.h" 00027 #include "MyGUI_Widget.h" 00028 #include "MyGUI_IWidgetCreator.h" 00029 #include "MyGUI_IWidgetFactory.h" 00030 #include "MyGUI_FactoryManager.h" 00031 00032 #include "MyGUI_Button.h" 00033 #include "MyGUI_Canvas.h" 00034 #include "MyGUI_ComboBox.h" 00035 #include "MyGUI_DDContainer.h" 00036 #include "MyGUI_Edit.h" 00037 #include "MyGUI_HScroll.h" 00038 #include "MyGUI_ItemBox.h" 00039 #include "MyGUI_List.h" 00040 #include "MyGUI_ListBox.h" 00041 #include "MyGUI_ListCtrl.h" 00042 #include "MyGUI_MenuBar.h" 00043 #include "MyGUI_MenuCtrl.h" 00044 #include "MyGUI_MenuItem.h" 00045 #include "MyGUI_Message.h" 00046 #include "MyGUI_MultiList.h" 00047 #include "MyGUI_PopupMenu.h" 00048 #include "MyGUI_Progress.h" 00049 #include "MyGUI_ScrollView.h" 00050 #include "MyGUI_StaticImage.h" 00051 #include "MyGUI_StaticText.h" 00052 #include "MyGUI_Tab.h" 00053 #include "MyGUI_TabItem.h" 00054 #include "MyGUI_VScroll.h" 00055 #include "MyGUI_Widget.h" 00056 #include "MyGUI_Window.h" 00057 00058 namespace MyGUI 00059 { 00060 00061 MYGUI_INSTANCE_IMPLEMENT( WidgetManager ) 00062 00063 void WidgetManager::initialise() 00064 { 00065 MYGUI_ASSERT(!mIsInitialise, INSTANCE_TYPE_NAME << " initialised twice"); 00066 MYGUI_LOG(Info, "* Initialise: " << INSTANCE_TYPE_NAME); 00067 00068 //registerUnlinker(this); 00069 00070 FactoryManager& factory = FactoryManager::getInstance(); 00071 00072 factory.registerFactory<Button>("Widget"); 00073 factory.registerFactory<Canvas>("Widget"); 00074 factory.registerFactory<ComboBox>("Widget"); 00075 factory.registerFactory<DDContainer>("Widget"); 00076 factory.registerFactory<Edit>("Widget"); 00077 factory.registerFactory<HScroll>("Widget"); 00078 factory.registerFactory<ItemBox>("Widget"); 00079 factory.registerFactory<List>("Widget"); 00080 factory.registerFactory<ListBox>("Widget"); 00081 factory.registerFactory<ListCtrl>("Widget"); 00082 factory.registerFactory<MenuBar>("Widget"); 00083 factory.registerFactory<MenuCtrl>("Widget"); 00084 factory.registerFactory<MenuItem>("Widget"); 00085 factory.registerFactory<Message>("Widget"); 00086 factory.registerFactory<MultiList>("Widget"); 00087 factory.registerFactory<PopupMenu>("Widget"); 00088 factory.registerFactory<Progress>("Widget"); 00089 factory.registerFactory<ScrollView>("Widget"); 00090 factory.registerFactory<StaticImage>("Widget"); 00091 factory.registerFactory<StaticText>("Widget"); 00092 factory.registerFactory<Tab>("Widget"); 00093 factory.registerFactory<TabItem>("Widget"); 00094 factory.registerFactory<VScroll>("Widget"); 00095 factory.registerFactory<Widget>("Widget"); 00096 factory.registerFactory<Window>("Widget"); 00097 00098 #ifndef MYGUI_DONT_USE_OBSOLETE 00099 00100 factory.registerFactory<RenderBox>("Widget"); 00101 factory.registerFactory<Sheet>("Widget"); 00102 00103 #endif // MYGUI_DONT_USE_OBSOLETE 00104 00105 MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully initialized"); 00106 mIsInitialise = true; 00107 } 00108 00109 void WidgetManager::shutdown() 00110 { 00111 if (!mIsInitialise) return; 00112 MYGUI_LOG(Info, "* Shutdown: " << INSTANCE_TYPE_NAME); 00113 00114 //unregisterUnlinker(this); 00115 00116 mFactoryList.clear(); 00117 mDelegates.clear(); 00118 mVectorIUnlinkWidget.clear(); 00119 00120 FactoryManager::getInstance().unregisterFactory("Widget"); 00121 00122 MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully shutdown"); 00123 mIsInitialise = false; 00124 } 00125 00126 Widget* WidgetManager::createWidget(WidgetStyle _style, const std::string& _type, const std::string& _skin, const IntCoord& _coord, Align _align, Widget* _parent, ICroppedRectangle * _cropeedParent, IWidgetCreator * _creator, const std::string& _name) 00127 { 00128 IObject* object = FactoryManager::getInstance().createObject("Widget", _type); 00129 if (object != nullptr) 00130 { 00131 Widget* widget = object->castType<Widget>(); 00132 ResourceSkin* skin = SkinManager::getInstance().getByName(_skin); 00133 widget->_initialise(_style, _coord, _align, skin, _parent, _cropeedParent, _creator, _name); 00134 00135 return widget; 00136 } 00137 00138 // старый вариант создания 00139 for (SetWidgetFactory::iterator factory = mFactoryList.begin(); factory != mFactoryList.end(); ++factory) 00140 { 00141 if ((*factory)->getTypeName() == _type) 00142 { 00143 Widget* widget = (*factory)->createWidget(_style, _skin, _coord, _align, _parent, _cropeedParent, _creator, _name); 00144 return widget; 00145 } 00146 } 00147 00148 MYGUI_EXCEPT("factory '" << _type << "' not found"); 00149 return nullptr; 00150 } 00151 00152 void WidgetManager::destroyWidget(Widget* _widget) 00153 { 00154 // иначе возможен бесконечный цикл 00155 MYGUI_ASSERT(_widget != nullptr, "widget is deleted"); 00156 00157 // делегирует удаление отцу виджета 00158 IWidgetCreator * creator = _widget->_getIWidgetCreator(); 00159 creator->_destroyChildWidget(_widget); 00160 } 00161 00162 void WidgetManager::destroyWidgets(const VectorWidgetPtr& _widgets) 00163 { 00164 for (VectorWidgetPtr::const_iterator iter = _widgets.begin(); iter != _widgets.end(); ++iter) 00165 { 00166 destroyWidget(*iter); 00167 } 00168 } 00169 00170 void WidgetManager::destroyWidgets(EnumeratorWidgetPtr _widgets) 00171 { 00172 VectorWidgetPtr widgets; 00173 while (_widgets.next()) 00174 { 00175 widgets.push_back(_widgets.current()); 00176 } 00177 destroyWidgets(widgets); 00178 } 00179 00180 void WidgetManager::registerUnlinker(IUnlinkWidget * _unlink) 00181 { 00182 unregisterUnlinker(_unlink); 00183 mVectorIUnlinkWidget.push_back(_unlink); 00184 } 00185 00186 void WidgetManager::unregisterUnlinker(IUnlinkWidget * _unlink) 00187 { 00188 for (size_t pos=0; pos<mVectorIUnlinkWidget.size(); pos++) 00189 { 00190 if (mVectorIUnlinkWidget[pos] == _unlink) 00191 { 00192 mVectorIUnlinkWidget[pos] = mVectorIUnlinkWidget[mVectorIUnlinkWidget.size()-1]; 00193 mVectorIUnlinkWidget.pop_back(); 00194 break; 00195 } 00196 } 00197 } 00198 00199 void WidgetManager::unlinkFromUnlinkers(Widget* _widget) 00200 { 00201 for (VectorIUnlinkWidget::iterator iter = mVectorIUnlinkWidget.begin(); iter!=mVectorIUnlinkWidget.end(); ++iter) 00202 { 00203 (*iter)->_unlinkWidget(_widget); 00204 } 00205 // вызывать последним, обнулится 00206 removeWidgetFromUnlink(_widget); 00207 } 00208 00209 void WidgetManager::addWidgetToUnlink(Widget* _widget) 00210 { 00211 if (_widget) mUnlinkWidgets.push_back(_widget); 00212 } 00213 00214 void WidgetManager::removeWidgetFromUnlink(Widget*& _widget) 00215 { 00216 VectorWidgetPtr::iterator iter = std::find(mUnlinkWidgets.begin(), mUnlinkWidgets.end(), _widget); 00217 if (iter != mUnlinkWidgets.end()) 00218 { 00219 (*iter) = mUnlinkWidgets.back(); 00220 mUnlinkWidgets.pop_back(); 00221 } 00222 else 00223 { 00224 _widget = nullptr; 00225 } 00226 } 00227 00228 bool WidgetManager::isFactoryExist(const std::string& _type) 00229 { 00230 if (FactoryManager::getInstance().isFactoryExist("Widget", _type)) 00231 { 00232 return true; 00233 } 00234 00235 // старый вариант 00236 for (SetWidgetFactory::iterator factory = mFactoryList.begin(); factory != mFactoryList.end(); ++factory) 00237 { 00238 if ((*factory)->getTypeName() == _type) 00239 { 00240 return true; 00241 } 00242 } 00243 00244 return false; 00245 } 00246 00247 #ifndef MYGUI_DONT_USE_OBSOLETE 00248 Widget* WidgetManager::findWidgetT(const std::string& _name, bool _throw) 00249 { 00250 return Gui::getInstance().findWidgetT(_name, _throw); 00251 } 00252 00253 Widget* WidgetManager::findWidgetT(const std::string& _name, const std::string& _prefix, bool _throw) 00254 { 00255 return Gui::getInstance().findWidgetT(_name, _prefix, _throw); 00256 } 00257 00258 void WidgetManager::registerFactory(IWidgetFactory * _factory) 00259 { 00260 mFactoryList.insert(_factory); 00261 MYGUI_LOG(Info, "* Register widget factory '" << _factory->getTypeName() << "'"); 00262 } 00263 00264 void WidgetManager::unregisterFactory(IWidgetFactory * _factory) 00265 { 00266 SetWidgetFactory::iterator iter = mFactoryList.find(_factory); 00267 if (iter != mFactoryList.end()) mFactoryList.erase(iter); 00268 MYGUI_LOG(Info, "* Unregister widget factory '" << _factory->getTypeName() << "'"); 00269 } 00270 00271 void WidgetManager::parse(Widget* _widget, const std::string &_key, const std::string &_value) 00272 { 00273 MapDelegate::iterator iter = mDelegates.find(_key); 00274 if (iter == mDelegates.end()) 00275 { 00276 //MYGUI_LOG(Error, "Unknown key '" << _key << "' with value '" << _value << "'"); 00277 _widget->setProperty(_key, _value); 00278 return; 00279 } 00280 iter->second(_widget, _key, _value); 00281 } 00282 00283 ParseDelegate& WidgetManager::registerDelegate(const std::string& _key) 00284 { 00285 MapDelegate::iterator iter = mDelegates.find(_key); 00286 MYGUI_ASSERT(iter == mDelegates.end(), "delegate with name '" << _key << "' already exist"); 00287 return (mDelegates[_key] = ParseDelegate()); 00288 } 00289 00290 void WidgetManager::unregisterDelegate(const std::string& _key) 00291 { 00292 MapDelegate::iterator iter = mDelegates.find(_key); 00293 if (iter != mDelegates.end()) mDelegates.erase(iter); 00294 } 00295 #endif // MYGUI_DONT_USE_OBSOLETE 00296 00297 void WidgetManager::_oldParse(Widget* _widget, const std::string &_key, const std::string &_value) 00298 { 00299 MapDelegate::iterator iter = mDelegates.find(_key); 00300 if (iter == mDelegates.end()) 00301 { 00302 _widget->setProperty(_key, _value); 00303 return; 00304 } 00305 iter->second(_widget, _key, _value); 00306 } 00307 00308 } // namespace MyGUI