1 /*!
2 	@file
3 	@author		Georgiy Evmenov
4 	@date		12/2009
5 */
6 
7 #include "Precompiled.h"
8 #include "PanelControllers.h"
9 #include "EditorWidgets.h"
10 #include "UndoManager.h"
11 #include "PropertyFieldManager.h"
12 #include "Localise.h"
13 
14 namespace tools
15 {
16 
PanelControllers()17 	PanelControllers::PanelControllers() :
18 		BasePanelViewItem("PanelControllers.layout"),
19 		mControllerName(nullptr),
20 		mButtonAdd(nullptr),
21 		mButtonDelete(nullptr),
22 		mList(nullptr),
23 		mCurrentWidget(nullptr),
24 		mButtonLeft(0),
25 		mButtonRight(0),
26 		mButtonSpace(0),
27 		mIndexSelected(MyGUI::ITEM_NONE)
28 	{
29 	}
30 
initialise()31 	void PanelControllers::initialise()
32 	{
33 		mPanelCell->setCaption(replaceTags("PanelControllersName"));
34 
35 		assignWidget(mControllerName, "controllerName");
36 		assignWidget(mButtonAdd, "buttonAdd");
37 		assignWidget(mButtonDelete, "buttonDelete");
38 		assignWidget(mList, "list");
39 
40 		mButtonAdd->eventMouseButtonClick += MyGUI::newDelegate(this, &PanelControllers::notifyAdd);
41 		mButtonDelete->eventMouseButtonClick += MyGUI::newDelegate(this, &PanelControllers::notifyDelete);
42 		mList->eventListChangePosition += MyGUI::newDelegate(this, &PanelControllers::notifySelectItem);
43 
44 		mButtonLeft = mButtonAdd->getLeft();
45 		mButtonRight = mMainWidget->getWidth() - mButtonDelete->getRight();
46 		mButtonSpace = mButtonDelete->getLeft() - mButtonAdd->getRight();
47 
48 		MyGUI::ResourceManager::getInstance().registerLoadXmlDelegate("ControllerTypes") = MyGUI::newDelegate(this, &PanelControllers::loadControllerTypes);
49 		MyGUI::ResourceManager::getInstance().load("Controllers.xml");
50 	}
51 
shutdown()52 	void PanelControllers::shutdown()
53 	{
54 		destroyPropertyFields();
55 	}
56 
update(MyGUI::Widget * _currentWidget)57 	void PanelControllers::update(MyGUI::Widget* _currentWidget)
58 	{
59 		destroyPropertyFields();
60 
61 		mCurrentWidget = _currentWidget;
62 		if (mCurrentWidget == nullptr)
63 			return;
64 
65 		WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(_currentWidget);
66 
67 		mList->removeAllItems();
68 		for (std::vector<ControllerInfo*>::iterator iter = widgetContainer->mController.begin(); iter != widgetContainer->mController.end(); ++iter)
69 		{
70 			mList->addItem((*iter)->mType, *iter);
71 		}
72 
73 		mPanelCell->setClientHeight(mButtonDelete->getCoord().bottom());
74 	}
75 
notifyChangeWidth(int _width)76 	void PanelControllers::notifyChangeWidth(int _width)
77 	{
78 		int width = mMainWidget->getClientCoord().width;
79 
80 		int half_width = (width - (mButtonLeft + mButtonRight + mButtonSpace)) / 2;
81 		mButtonAdd->setSize(half_width, mButtonAdd->getHeight());
82 		mButtonDelete->setCoord(mButtonAdd->getRight() + mButtonSpace, mButtonDelete->getTop(), width - (mButtonAdd->getRight() + mButtonSpace + mButtonRight), mButtonDelete->getHeight());
83 	}
84 
notifyAdd(MyGUI::Widget * _sender)85 	void PanelControllers::notifyAdd(MyGUI::Widget* _sender)
86 	{
87 		std::string key = mControllerName->getOnlyText();
88 		WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget);
89 
90 		ControllerInfo* controllerInfo = new ControllerInfo();
91 		controllerInfo->mType = key;
92 		widgetContainer->mController.push_back(controllerInfo);
93 
94 		mList->addItem(key, controllerInfo);
95 		UndoManager::getInstance().addValue();
96 	}
97 
notifyDelete(MyGUI::Widget * _sender)98 	void PanelControllers::notifyDelete(MyGUI::Widget* _sender)
99 	{
100 		size_t index = mList->getIndexSelected();
101 		if (MyGUI::ITEM_NONE == index)
102 			return;
103 
104 		WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget);
105 		std::vector<ControllerInfo*>::iterator iter = std::find(widgetContainer->mController.begin(), widgetContainer->mController.end(), *mList->getItemDataAt<ControllerInfo*>(index));
106 		if (iter != widgetContainer->mController.end())
107 		{
108 			delete *iter;
109 			widgetContainer->mController.erase(iter);
110 		}
111 
112 		mList->removeItemAt(index);
113 		UndoManager::getInstance().addValue();
114 
115 		// обновляем текущий индекс
116 		notifySelectItem(mList, mList->getIndexSelected());
117 	}
118 
notifySelectItem(MyGUI::ListBox * _sender,size_t _index)119 	void PanelControllers::notifySelectItem(MyGUI::ListBox* _sender, size_t _index)
120 	{
121 		destroyPropertyFields();
122 
123 		mIndexSelected = mList->getIndexSelected();
124 		if (MyGUI::ITEM_NONE == mIndexSelected)
125 			return;
126 
127 		std::string key = mList->getItemNameAt(mIndexSelected);
128 		mControllerName->setOnlyText(key);
129 
130 		if (mControllersProperties.find(key) != mControllersProperties.end())
131 		{
132 			ControllerInfo* controllerInfo = *mList->getItemDataAt<ControllerInfo*>(mIndexSelected);
133 
134 			for (MyGUI::MapString::iterator iter = mControllersProperties[key].begin(); iter != mControllersProperties[key].end(); ++iter)
135 			{
136 				std::string value = "";
137 				if (controllerInfo->mProperty.find(iter->first) != controllerInfo->mProperty.end())
138 					value = controllerInfo->mProperty[iter->first];
139 
140 				IPropertyField* field = PropertyFieldManager::getInstance().createPropertyField(mWidgetClient, iter->second);
141 				field->setTarget(mCurrentWidget);
142 				field->setName(iter->first);
143 				field->setValue(value);
144 				field->eventAction = MyGUI::newDelegate(this, &PanelControllers::notifyAction);
145 				mFields.push_back(field);
146 			}
147 		}
148 
149 		updateSize();
150 	}
151 
updateSize()152 	void PanelControllers::updateSize()
153 	{
154 		int height = mButtonDelete->getCoord().bottom() + 3;
155 
156 		for (VectorPropertyField::iterator item = mFields.begin(); item != mFields.end(); ++ item)
157 		{
158 			MyGUI::IntSize size = (*item)->getContentSize();
159 			(*item)->setCoord(MyGUI::IntCoord(0, height, mMainWidget->getWidth(), size.height));
160 			height += size.height;
161 		}
162 
163 		mPanelCell->setClientHeight(height);
164 	}
165 
loadControllerTypes(MyGUI::xml::ElementPtr _node,const std::string & _file,MyGUI::Version _version)166 	void PanelControllers::loadControllerTypes(MyGUI::xml::ElementPtr _node, const std::string& _file, MyGUI::Version _version)
167 	{
168 		MyGUI::xml::ElementEnumerator controller = _node->getElementEnumerator();
169 		while (controller.next("Controller"))
170 		{
171 			MyGUI::MapString controllerProperties;
172 			std::string name = controller->findAttribute("name");
173 			mControllerName->addItem(name);
174 			MyGUI::xml::ElementEnumerator prop = controller->getElementEnumerator();
175 			while (prop.next("Property"))
176 				controllerProperties[prop->findAttribute("key")] = prop->findAttribute("type");
177 			mControllersProperties[name] = controllerProperties;
178 		}
179 	}
180 
destroyPropertyFields()181 	void PanelControllers::destroyPropertyFields()
182 	{
183 		for (VectorPropertyField::iterator item = mFields.begin(); item != mFields.end(); ++ item)
184 			delete (*item);
185 		mFields.clear();
186 	}
187 
notifyAction(const std::string & _name,const std::string & _value,bool _final)188 	void PanelControllers::notifyAction(const std::string& _name, const std::string& _value, bool _final)
189 	{
190 		if (_final)
191 		{
192 			if (mIndexSelected != MyGUI::ITEM_NONE)
193 			{
194 				WidgetContainer* widgetContainer = EditorWidgets::getInstance().find(mCurrentWidget);
195 				widgetContainer->mController[mIndexSelected]->mProperty[_name] = _value;
196 
197 				UndoManager::getInstance().addValue(PR_PROPERTIES);
198 			}
199 		}
200 	}
201 
202 }
203