00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "MyGUI_Precompiled.h"
00024 #include "MyGUI_Gui.h"
00025 #include "MyGUI_ControllerManager.h"
00026 #include "MyGUI_WidgetManager.h"
00027 #include "MyGUI_FactoryManager.h"
00028
00029 #include "MyGUI_ControllerEdgeHide.h"
00030 #include "MyGUI_ControllerFadeAlpha.h"
00031 #include "MyGUI_ControllerPosition.h"
00032
00033 namespace MyGUI
00034 {
00035
00036 MYGUI_INSTANCE_IMPLEMENT( ControllerManager )
00037
00038 void ControllerManager::initialise()
00039 {
00040 MYGUI_ASSERT(!mIsInitialise, INSTANCE_TYPE_NAME << " initialised twice");
00041 MYGUI_LOG(Info, "* Initialise: " << INSTANCE_TYPE_NAME);
00042
00043 WidgetManager::getInstance().registerUnlinker(this);
00044
00045 const std::string factory_type = "Controller";
00046
00047 FactoryManager::getInstance().registerFactory<ControllerEdgeHide>(factory_type);
00048 FactoryManager::getInstance().registerFactory<ControllerFadeAlpha>(factory_type);
00049 FactoryManager::getInstance().registerFactory<ControllerPosition>(factory_type);
00050
00051 MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully initialized");
00052 mIsInitialise = true;
00053 }
00054
00055 void ControllerManager::shutdown()
00056 {
00057 if (!mIsInitialise) return;
00058 MYGUI_LOG(Info, "* Shutdown: " << INSTANCE_TYPE_NAME);
00059
00060 const std::string factory_type = "Controller";
00061
00062 FactoryManager::getInstance().unregisterFactory<ControllerEdgeHide>(factory_type);
00063 FactoryManager::getInstance().unregisterFactory<ControllerFadeAlpha>(factory_type);
00064 FactoryManager::getInstance().unregisterFactory<ControllerPosition>(factory_type);
00065
00066 WidgetManager::getInstance().unregisterUnlinker(this);
00067 clear();
00068
00069 MYGUI_LOG(Info, INSTANCE_TYPE_NAME << " successfully shutdown");
00070 mIsInitialise = false;
00071 }
00072
00073 void ControllerManager::clear()
00074 {
00075 for (ListControllerItem::iterator iter=mListItem.begin(); iter!=mListItem.end(); ++iter)
00076 {
00077 delete (*iter).second;
00078 }
00079 mListItem.clear();
00080 }
00081
00082 ControllerItem* ControllerManager::createItem(const std::string& _type)
00083 {
00084 IObject* object = FactoryManager::getInstance().createObject("Controller", _type);
00085 return object == nullptr ? nullptr : object->castType<ControllerItem>();
00086 }
00087
00088 void ControllerManager::addItem(Widget* _widget, ControllerItem * _item)
00089 {
00090
00091 if (0 == mListItem.size()) Gui::getInstance().eventFrameStart += newDelegate(this, &ControllerManager::frameEntered);
00092
00093
00094 _item->prepareItem(_widget);
00095
00096 for (ListControllerItem::iterator iter=mListItem.begin(); iter!=mListItem.end(); ++iter)
00097 {
00098
00099 if ((*iter).first == _widget)
00100 {
00101 if ((*iter).second->getTypeName() == _item->getTypeName())
00102 {
00103 delete (*iter).second;
00104 (*iter).second = _item;
00105 return;
00106 }
00107 }
00108 }
00109
00110
00111 mListItem.push_back(PairControllerItem(_widget, _item));
00112 }
00113
00114 void ControllerManager::removeItem(Widget* _widget)
00115 {
00116
00117 for (ListControllerItem::iterator iter=mListItem.begin(); iter!=mListItem.end(); ++iter)
00118 {
00119 if ((*iter).first == _widget) (*iter).first = nullptr;
00120 }
00121 }
00122
00123 void ControllerManager::_unlinkWidget(Widget* _widget)
00124 {
00125 removeItem(_widget);
00126 }
00127
00128 void ControllerManager::frameEntered(float _time)
00129 {
00130 for (ListControllerItem::iterator iter=mListItem.begin(); iter!=mListItem.end(); )
00131 {
00132 if (nullptr == (*iter).first)
00133 {
00134 delete (*iter).second;
00135
00136 iter = mListItem.erase(iter);
00137 continue;
00138 }
00139
00140 if ((*iter).second->addTime((*iter).first, _time))
00141 {
00142 ++iter;
00143 continue;
00144 }
00145
00146
00147 (*iter).first = nullptr;
00148 }
00149
00150 if (0 == mListItem.size()) Gui::getInstance().eventFrameStart -= newDelegate(this, &ControllerManager::frameEntered);
00151 }
00152
00153 }