1 /*!
2 	@file
3 	@author		Georgiy Evmenov
4 	@date		09/2008
5 */
6 
7 #include "Precompiled.h"
8 #include "Common.h"
9 #include "WidgetsWindow.h"
10 #include "EditorWidgets.h"
11 #include "WidgetTypes.h"
12 #include "UndoManager.h"
13 #include "SettingsManager.h"
14 #include "WidgetCreatorManager.h"
15 
16 namespace tools
17 {
18 
WidgetsWindow(MyGUI::Widget * _parent)19 	WidgetsWindow::WidgetsWindow(MyGUI::Widget* _parent) :
20 		BaseLayout("WidgetsWindow.layout", _parent),
21 		mTabSkins(nullptr),
22 		mPopupMode(nullptr),
23 		mWidgetsButtonWidth(0),
24 		mWidgetsButtonHeight(0),
25 		mWidgetsButtonOffset(0)
26 	{
27 		assignWidget(mTabSkins, "tabSkins");
28 		assignWidget(mPopupMode, "PopupMode");
29 
30 		mPopupMode->eventMouseButtonClick += MyGUI::newDelegate(this, &WidgetsWindow::notifyMouseButtonClickPopupMode);
31 
32 		mWidgetsButtonWidth = SettingsManager::getInstance().getValue<int>("Controls/WidgetsWindow/WidgetsButtonWidth");
33 		mWidgetsButtonHeight = SettingsManager::getInstance().getValue<int>("Controls/WidgetsWindow/WidgetsButtonHeight");
34 		mWidgetsButtonOffset = SettingsManager::getInstance().getValue<int>("Controls/WidgetsWindow/WidgetsButtonOffset");
35 		mSkinSheetName = SettingsManager::getInstance().getValue("Controls/WidgetsWindow/LastSkinGroup");
36 
37 		if (!SettingsManager::getInstance().tryGetValue("Controls/WidgetsWindow/ButtonSkinName", mButtonSkinName))
38 			mButtonSkinName = "Button";
39 
40 		initialise();
41 
42 		WidgetCreatorManager::getInstance().eventChangeCreatorMode += MyGUI::newDelegate(this, &WidgetsWindow::notifyChangeCreatorMode);
43 	}
44 
~WidgetsWindow()45 	WidgetsWindow::~WidgetsWindow()
46 	{
47 		WidgetCreatorManager::getInstance().eventChangeCreatorMode -= MyGUI::newDelegate(this, &WidgetsWindow::notifyChangeCreatorMode);
48 
49 		size_t sheet_index = mTabSkins->getIndexSelected();
50 		if (sheet_index != MyGUI::ITEM_NONE)
51 			mSkinSheetName = mTabSkins->getItemNameAt(sheet_index);
52 		else
53 			mSkinSheetName = "";
54 
55 		SettingsManager::getInstance().setValue("Controls/WidgetsWindow/LastSkinGroup", mSkinSheetName);
56 
57 		mPopupMode->eventMouseButtonClick -= MyGUI::newDelegate(this, &WidgetsWindow::notifyMouseButtonClickPopupMode);
58 	}
59 
initialise()60 	void WidgetsWindow::initialise()
61 	{
62 		const SkinGroups& groups = WidgetTypes::getInstance().getSkinGroups();
63 		for (SkinGroups::const_iterator iter = groups.begin(); iter != groups.end(); ++iter)
64 		{
65 			MyGUI::TabItem* page = mTabSkins->addItem(iter->first);
66 			MyGUI::ItemBox* box = page->createWidget<MyGUI::ItemBox>("ItemBoxEmpty", MyGUI::IntCoord(0, 0, page->getSize().width, page->getSize().height), MyGUI::Align::Stretch);
67 			mItemBoxs.push_back(box);
68 
69 			box->requestCreateWidgetItem = MyGUI::newDelegate(this, &WidgetsWindow::requestCreateWidgetItem);
70 			box->requestCoordItem = MyGUI::newDelegate(this, &WidgetsWindow::requestCoordItem);
71 			box->requestDrawItem = MyGUI::newDelegate(this, &WidgetsWindow::requestDrawItem);
72 
73 			for (VectorSkinInfo::const_iterator iterSkin = iter->second.begin(); iterSkin != iter->second.end(); ++iterSkin)
74 			{
75 				box->addItem(*iterSkin);
76 			}
77 		}
78 	}
79 
getCellSelected(MyGUI::Widget * _widget)80 	bool WidgetsWindow::getCellSelected(MyGUI::Widget* _widget)
81 	{
82 		MyGUI::Widget* container = _widget->getParent()->_getContainer();
83 		MyGUI::ItemBox* box = container->castType<MyGUI::ItemBox>();
84 		return box->getIndexSelected() == box->getIndexByWidget(_widget->getParent());
85 	}
86 
getCellData(MyGUI::Widget * _widget)87 	SkinInfo WidgetsWindow::getCellData(MyGUI::Widget* _widget)
88 	{
89 		MyGUI::Widget* container = _widget->getParent()->_getContainer();
90 		MyGUI::ItemBox* box = container->castType<MyGUI::ItemBox>();
91 		size_t index = box->getIndexByWidget(_widget->getParent());
92 		return *box->getItemDataAt<SkinInfo>(index);
93 	}
94 
notifySelectWidgetType(MyGUI::Widget * _sender)95 	void WidgetsWindow::notifySelectWidgetType(MyGUI::Widget* _sender)
96 	{
97 		SkinInfo data = getCellData(_sender);
98 
99 		if (getCellSelected(_sender))
100 			WidgetCreatorManager::getInstance().resetCreatorInfo();
101 		else
102 			WidgetCreatorManager::getInstance().setCreatorInfo(data.widget_type, data.widget_skin);
103 	}
104 
notifyToolTip(MyGUI::Widget * _sender,const MyGUI::ToolTipInfo & _info)105 	void WidgetsWindow::notifyToolTip(MyGUI::Widget* _sender, const MyGUI::ToolTipInfo& _info)
106 	{
107 		if (_info.type == MyGUI::ToolTipInfo::Show)
108 		{
109 			SkinInfo data = getCellData(_sender);
110 			EditorToolTip::getInstancePtr()->show(data);
111 			EditorToolTip::getInstancePtr()->move(_info.point);
112 		}
113 		else if (_info.type == MyGUI::ToolTipInfo::Hide)
114 		{
115 			EditorToolTip::getInstancePtr()->hide();
116 		}
117 		else if (_info.type == MyGUI::ToolTipInfo::Move)
118 		{
119 			EditorToolTip::getInstancePtr()->move(_info.point);
120 		}
121 	}
122 
notifyChangeCreatorMode(bool _modeCreate)123 	void WidgetsWindow::notifyChangeCreatorMode(bool _modeCreate)
124 	{
125 		const std::string& widgetType = WidgetCreatorManager::getInstance().getWidgetType();
126 		const std::string& widgetSkin = WidgetCreatorManager::getInstance().getWidgetSkin();
127 
128 		for (VectorItemBox::iterator item = mItemBoxs.begin(); item != mItemBoxs.end(); ++item)
129 		{
130 			MyGUI::ItemBox* box = (*item);
131 			box->setIndexSelected(MyGUI::ITEM_NONE);
132 			for (size_t index = 0; index < box->getItemCount(); ++index)
133 			{
134 				SkinInfo* info = box->getItemDataAt<SkinInfo>(index);
135 				if (info->widget_skin == widgetSkin && info->widget_type == widgetType)
136 				{
137 					box->setIndexSelected(index);
138 					break;
139 				}
140 			}
141 		}
142 
143 		mPopupMode->setStateSelected(WidgetCreatorManager::getInstance().getPopupMode());
144 	}
145 
requestCreateWidgetItem(MyGUI::ItemBox * _sender,MyGUI::Widget * _item)146 	void WidgetsWindow::requestCreateWidgetItem(MyGUI::ItemBox* _sender, MyGUI::Widget* _item)
147 	{
148 		MyGUI::Button* button = _item->createWidget<MyGUI::Button>(mButtonSkinName, MyGUI::IntCoord(
149 			mWidgetsButtonOffset,
150 			mWidgetsButtonOffset,
151 			_item->getWidth() - mWidgetsButtonOffset - mWidgetsButtonOffset,
152 			_item->getHeight() - mWidgetsButtonOffset - mWidgetsButtonOffset),
153 			MyGUI::Align::Stretch);
154 
155 		button->setTextAlign(MyGUI::Align::Center);
156 		button->eventMouseButtonClick += MyGUI::newDelegate(this, &WidgetsWindow::notifySelectWidgetType);
157 		button->setNeedToolTip(true);
158 		button->eventToolTip += MyGUI::newDelegate(this, &WidgetsWindow::notifyToolTip);
159 
160 		_item->setUserData(button);
161 	}
162 
requestCoordItem(MyGUI::ItemBox * _sender,MyGUI::IntCoord & _coord,bool _drag)163 	void WidgetsWindow::requestCoordItem(MyGUI::ItemBox* _sender, MyGUI::IntCoord& _coord, bool _drag)
164 	{
165 		_coord.set(0, 0, mWidgetsButtonWidth + mWidgetsButtonOffset + mWidgetsButtonOffset, mWidgetsButtonHeight + mWidgetsButtonOffset + mWidgetsButtonOffset);
166 	}
167 
requestDrawItem(MyGUI::ItemBox * _sender,MyGUI::Widget * _item,const MyGUI::IBDrawItemInfo & _info)168 	void WidgetsWindow::requestDrawItem(MyGUI::ItemBox* _sender, MyGUI::Widget* _item, const MyGUI::IBDrawItemInfo& _info)
169 	{
170 		MyGUI::Button* button = *_item->getUserData<MyGUI::Button*>();
171 		SkinInfo data = *_sender->getItemDataAt<SkinInfo>(_info.index);
172 		if (_info.update)
173 		{
174 			button->setCaption(data.widget_button_name);
175 		}
176 
177 		button->setStateSelected(_info.select);
178 	}
179 
notifyMouseButtonClickPopupMode(MyGUI::Widget * _sender)180 	void WidgetsWindow::notifyMouseButtonClickPopupMode(MyGUI::Widget* _sender)
181 	{
182 		if (mPopupMode->getStateSelected())
183 			WidgetCreatorManager::getInstance().setPopupMode(false);
184 		else
185 			WidgetCreatorManager::getInstance().setPopupMode(true);
186 	}
187 
188 }
189