1 /*!
2 	@file
3 	@author		Albert Semenov
4 	@date		05/2008
5 */
6 #include "Precompiled.h"
7 #include "DemoKeeper.h"
8 #include "CellView.h"
9 #include "Base/Main.h"
10 
11 namespace demo
12 {
13 
DemoKeeper()14 	DemoKeeper::DemoKeeper() :
15 		mToolTip(nullptr),
16 		mItemBoxV(nullptr),
17 		mItemBoxH(nullptr)
18 	{
19 	}
20 
notifyStartDrop(wraps::BaseLayout * _sender,wraps::DDItemInfo _info,bool & _result)21 	void DemoKeeper::notifyStartDrop(wraps::BaseLayout* _sender, wraps::DDItemInfo _info, bool& _result)
22 	{
23 		if (_info.sender_index != MyGUI::ITEM_NONE)
24 		{
25 			ItemData* data = *static_cast<ItemBox*>(_info.sender)->getItemDataAt<ItemData*>(_info.sender_index);
26 			_result = !data->isEmpty();
27 		}
28 	}
29 
notifyRequestDrop(wraps::BaseLayout * _sender,wraps::DDItemInfo _info,bool & _result)30 	void DemoKeeper::notifyRequestDrop(wraps::BaseLayout* _sender, wraps::DDItemInfo _info, bool& _result)
31 	{
32 		// не на айтем кидаем
33 		if (_info.receiver_index == MyGUI::ITEM_NONE)
34 		{
35 			_result = false;
36 			return;
37 		}
38 
39 		// на себя и на тотже айтем
40 		if ((_info.sender == _info.receiver) && (_info.sender_index == _info.receiver_index))
41 		{
42 			_result = false;
43 			return;
44 		}
45 
46 		ItemData* sender_data = *static_cast<ItemBox*>(_info.sender)->getItemDataAt<ItemData*>(_info.sender_index);
47 		ItemData* receiver_data = *static_cast<ItemBox*>(_info.receiver)->getItemDataAt<ItemData*>(_info.receiver_index);
48 
49 		_result = receiver_data->isEmpty() || receiver_data->compare(sender_data);
50 	}
51 
notifyEndDrop(wraps::BaseLayout * _sender,wraps::DDItemInfo _info,bool _result)52 	void DemoKeeper::notifyEndDrop(wraps::BaseLayout* _sender, wraps::DDItemInfo _info, bool _result)
53 	{
54 		if (_result)
55 		{
56 			ItemData* sender_data = *static_cast<ItemBox*>(_info.sender)->getItemDataAt<ItemData*>(_info.sender_index);
57 			ItemData* receiver_data = *static_cast<ItemBox*>(_info.receiver)->getItemDataAt<ItemData*>(_info.receiver_index);
58 
59 			receiver_data->add(sender_data);
60 			sender_data->clear();
61 
62 			static_cast<ItemBox*>(_info.receiver)->setItemData(_info.receiver_index, receiver_data);
63 			static_cast<ItemBox*>(_info.sender)->setItemData(_info.sender_index, sender_data);
64 		}
65 	}
66 
notifyNotifyItem(wraps::BaseLayout * _sender,const MyGUI::IBNotifyItemData & _info)67 	void DemoKeeper::notifyNotifyItem(wraps::BaseLayout* _sender, const MyGUI::IBNotifyItemData& _info)
68 	{
69 		/*if (_info.index != MyGUI::ITEM_NONE)
70 		{
71 			if (_info.notify == MyGUI::NotifyItem::NOTIFY_MOUSE_RELEASED)
72 			{
73 				MyGUI::ItemBox* sender = ((BaseItemBox<CellView>*)_sender)->getItemBox();
74 				//sender->
75 				sender->setPosition(sender->getCoord());
76 			}
77 		}*/
78 	}
79 
notifyDropState(wraps::BaseLayout * _sender,MyGUI::DDItemState _state)80 	void DemoKeeper::notifyDropState(wraps::BaseLayout* _sender, MyGUI::DDItemState _state)
81 	{
82 		/*if (_state == MyGUI::DDItemState::Refuse) MyGUI::PointerManager::getInstance().setPointer("drop_refuse", _sender->mainWidget());
83 		else if (_state == MyGUI::DDItemState::Accept) MyGUI::PointerManager::getInstance().setPointer("drop_accept", _sender->mainWidget());
84 		else if (_state == MyGUI::DDItemState::Miss) MyGUI::PointerManager::getInstance().setPointer("drop", _sender->mainWidget());
85 		else if (_state == MyGUI::DDItemState::Start) MyGUI::PointerManager::getInstance().setPointer("drop", _sender->mainWidget());
86 		else if (_state == MyGUI::DDItemState::End) MyGUI::PointerManager::getInstance().setDefaultPointer();*/
87 	}
88 
setupResources()89 	void DemoKeeper::setupResources()
90 	{
91 		base::BaseManager::setupResources();
92 		addResourceLocation(getRootMedia() + "/Demos/Demo_ItemBox");
93 		addResourceLocation(getRootMedia() + "/Icons");
94 		addResourceLocation(getRootMedia() + "/Common/Demos");
95 	}
96 
createScene()97 	void DemoKeeper::createScene()
98 	{
99 		base::BaseDemoManager::createScene();
100 		MyGUI::LayoutManager::getInstance().loadLayout("Wallpaper.layout");
101 		const MyGUI::VectorWidgetPtr& root = MyGUI::LayoutManager::getInstance().loadLayout("HelpPanel.layout");
102 		if (root.size() == 1)
103 			root.at(0)->findWidget("Text")->castType<MyGUI::TextBox>()->setCaption("You can drag and drop items from one ItemBox to another. Hold mouse over item to see tool tip. Resize windows to see vertical and horizontal ItebBox alignments.");
104 
105 		// регестрируем тип нашего ресурса
106 		std::string resourceCategory = MyGUI::ResourceManager::getInstance().getCategoryName();
107 		MyGUI::FactoryManager::getInstance().registerFactory<ResourceItemInfo>(resourceCategory);
108 
109 		MyGUI::ResourceManager::getInstance().load("Resources.xml");
110 		//MyGUI::ResourceManager::getInstance().load("ItemBox_skin.xml");
111 
112 		mToolTip = new ToolTip();
113 		mToolTip->hide();
114 
115 		mItemBoxV = new ItemBoxWindow("ItemBoxV.layout");
116 		mItemBoxV->getItemBox()->addItem(new ItemData());
117 		mItemBoxV->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item1", 5));
118 		mItemBoxV->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item2", 5));
119 		mItemBoxV->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item3", 5));
120 		mItemBoxV->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item4", 5));
121 		mItemBoxV->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item5", 5));
122 		mItemBoxV->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item6", 5));
123 		mItemBoxV->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item7", 5));
124 		mItemBoxV->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item8", 5));
125 		mItemBoxV->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item9", 5));
126 
127 		mItemBoxV->getItemBox()->eventStartDrag = MyGUI::newDelegate(this, &DemoKeeper::notifyStartDrop);
128 		mItemBoxV->getItemBox()->eventRequestDrop = MyGUI::newDelegate(this, &DemoKeeper::notifyRequestDrop);
129 		mItemBoxV->getItemBox()->eventDropResult = MyGUI::newDelegate(this, &DemoKeeper::notifyEndDrop);
130 		mItemBoxV->getItemBox()->eventChangeDDState = newDelegate(this, &DemoKeeper::notifyDropState);
131 		mItemBoxV->getItemBox()->eventNotifyItem = newDelegate(this, &DemoKeeper::notifyNotifyItem);
132 		mItemBoxV->getItemBox()->eventToolTip = newDelegate(this, &DemoKeeper::notifyToolTip);
133 
134 		mItemBoxH = new ItemBoxWindow("ItemBoxH.layout");
135 		mItemBoxH->getItemBox()->addItem(new ItemData());
136 		mItemBoxH->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item1", 5));
137 		mItemBoxH->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item2", 5));
138 		mItemBoxH->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item3", 5));
139 		mItemBoxH->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item4", 5));
140 		mItemBoxH->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item5", 5));
141 		mItemBoxH->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item6", 5));
142 		mItemBoxH->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item7", 5));
143 		mItemBoxH->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item8", 5));
144 		mItemBoxH->getItemBox()->addItem(new ItemData("info_Crystal_Clear_Item9", 5));
145 
146 		mItemBoxH->getItemBox()->eventStartDrag = MyGUI::newDelegate(this, &DemoKeeper::notifyStartDrop);
147 		mItemBoxH->getItemBox()->eventRequestDrop = MyGUI::newDelegate(this, &DemoKeeper::notifyRequestDrop);
148 		mItemBoxH->getItemBox()->eventDropResult = MyGUI::newDelegate(this, &DemoKeeper::notifyEndDrop);
149 		mItemBoxH->getItemBox()->eventChangeDDState = newDelegate(this, &DemoKeeper::notifyDropState);
150 		mItemBoxH->getItemBox()->eventNotifyItem = newDelegate(this, &DemoKeeper::notifyNotifyItem);
151 		mItemBoxH->getItemBox()->eventToolTip = newDelegate(this, &DemoKeeper::notifyToolTip);
152 	}
153 
destroyScene()154 	void DemoKeeper::destroyScene()
155 	{
156 		// тип нашего ресурса
157 		std::string resourceCategory = MyGUI::ResourceManager::getInstance().getCategoryName();
158 		MyGUI::FactoryManager::getInstance().unregisterFactory<ResourceItemInfo>(resourceCategory);
159 
160 		delete mItemBoxH;
161 		mItemBoxH = nullptr;
162 		delete mItemBoxV;
163 		mItemBoxV = nullptr;
164 		delete mToolTip;
165 		mToolTip = nullptr;
166 	}
167 
notifyToolTip(wraps::BaseLayout * _sender,const MyGUI::ToolTipInfo & _info,ItemData * _data)168 	void DemoKeeper::notifyToolTip(wraps::BaseLayout* _sender, const MyGUI::ToolTipInfo& _info, ItemData* _data)
169 	{
170 		if (_info.type == MyGUI::ToolTipInfo::Show)
171 		{
172 			mToolTip->show(_data);
173 			mToolTip->move(_info.point);
174 		}
175 		else if (_info.type == MyGUI::ToolTipInfo::Hide)
176 		{
177 			mToolTip->hide();
178 		}
179 		else if (_info.type == MyGUI::ToolTipInfo::Move)
180 		{
181 			mToolTip->move(_info.point);
182 		}
183 	}
184 
185 } // namespace demo
186 
187 MYGUI_APP(demo::DemoKeeper)
188