MyGUI  3.2.1
MyGUI_DDContainer.cpp
Go to the documentation of this file.
1 /*
2  * This source file is part of MyGUI. For the latest info, see http://mygui.info/
3  * Distributed under the MIT License
4  * (See accompanying file COPYING.MIT or copy at http://opensource.org/licenses/MIT)
5  */
6 
7 #include "MyGUI_Precompiled.h"
8 #include "MyGUI_DDContainer.h"
9 #include "MyGUI_InputManager.h"
10 #include "MyGUI_LayerManager.h"
11 
12 namespace MyGUI
13 {
14 
16  mDropResult(false),
17  mNeedDrop(false),
18  mStartDrop(false),
19  mOldDrop(nullptr),
20  mCurrentSender(nullptr),
21  mDropSenderIndex(ITEM_NONE),
22  mDropItem(nullptr),
23  mNeedDragDrop(false),
24  mReseiverContainer(nullptr)
25  {
26  }
27 
28  void DDContainer::onMouseButtonPressed(int _left, int _top, MouseButton _id)
29  {
30  // смещение внутри виджета, куда кликнули мышкой
32 
33  mouseButtonPressed(_id);
34 
35  Base::onMouseButtonPressed(_left, _top, _id);
36  }
37 
38  void DDContainer::onMouseButtonReleased(int _left, int _top, MouseButton _id)
39  {
41 
42  Base::onMouseButtonReleased(_left, _top, _id);
43  }
44 
45  void DDContainer::onMouseDrag(int _left, int _top, MouseButton _id)
46  {
47  mouseDrag(_id);
48 
49  Base::onMouseDrag(_left, _top, _id);
50  }
51 
53  {
54  if (MouseButton::Left == _id)
55  {
56  // сбрасываем инфу для дропа
57  mDropResult = false;
58  mOldDrop = nullptr;
59  mDropInfo.reset();
60  mReseiverContainer = nullptr;
61 
62  // сбрасываем, чтобы обновился дропный виджет
63  mCurrentSender = nullptr;
64  mStartDrop = false;
65 
66  }
67  // если нажата другая клавиша и был дроп то сбрасываем
68  else
69  {
70  endDrop(true);
71  }
72  }
73 
75  {
76  if (MouseButton::Left == _id)
77  {
78  endDrop(false);
79  }
80  }
81 
83  {
84  if (MouseButton::Left != _id)
85  return;
86 
87  // нужно ли обновить данные
88  bool update = false;
89 
90  // первый раз дропаем елемент
92  {
93  mStartDrop = true;
94  mNeedDrop = false;
95  update = true;
96  // запрос на нужность дропа по индексу
97  mDropInfo.set(this, mDropSenderIndex, nullptr, ITEM_NONE);
98  mReseiverContainer = nullptr;
99 
101 
102  if (mNeedDrop)
103  {
105  }
106  else
107  {
108  // сбрасываем фокус мыши (не обязательно)
110  }
111  }
112 
113  // дроп не нужен
114  if (!mNeedDrop)
115  {
116  return;
117  }
118 
119  // делаем запрос, над кем наша мыша
122 
123  updateDropItems();
124 
125  // если равно, значит уже спрашивали
126  if (mOldDrop == item) return;
127  mOldDrop = item;
128 
129  // сбрасываем старую подсветку
131 
132  mDropResult = false;
133  mReseiverContainer = nullptr;
134  Widget* receiver = nullptr;
135  size_t receiver_index = ITEM_NONE;
136  // есть виджет под нами
137  if (item)
138  {
139  // делаем запрос на индекс по произвольному виджету
140  receiver = item->_getContainer();
141  // работаем только с контейнерами
142  if (receiver && receiver->isType<DDContainer>())
143  {
144  receiver_index = receiver->_getItemIndex(item);
145 
146  // подписываемся на информацию о валидности дропа
147  mReseiverContainer = static_cast<DDContainer*>(receiver);
150 
151  // делаем запрос на возможность дропа
152  mDropInfo.set(this, mDropSenderIndex, mReseiverContainer, receiver_index);
153 
155 
156  // устанавливаем новую подсветку
158  }
159  else
160  {
161  mDropInfo.set(this, mDropSenderIndex, nullptr, ITEM_NONE);
162  }
163  }
164  // нет виджета под нами
165  else
166  {
167  mDropInfo.set(this, mDropSenderIndex, nullptr, ITEM_NONE);
168  }
169 
170  DDItemState state;
171 
173  data.update = update;
174 
175  if (receiver == nullptr)
176  {
177  data.accept = false;
178  data.refuse = false;
179  state = DDItemState::Miss;
180  }
181  else if (mDropResult)
182  {
183  data.accept = true;
184  data.refuse = false;
185  state = DDItemState::Accept;
186  }
187  else
188  {
189  data.accept = false;
190  data.refuse = true;
191  state = DDItemState::Refuse;
192  }
193 
194  updateDropItemsState(data);
195 
196  eventChangeDDState(this, state);
197  }
198 
199  void DDContainer::endDrop(bool _reset)
200  {
201  if (mStartDrop)
202  {
203  removeDropItems();
204 
205  // сбрасываем старую подсветку
207 
208  if (_reset) mDropResult = false;
211 
212  // сбрасываем инфу для дропа
213  mStartDrop = false;
214  mDropResult = false;
215  mNeedDrop = false;
216  mOldDrop = nullptr;
217  mDropInfo.reset();
218  mReseiverContainer = nullptr;
220  }
221  }
222 
224  {
225  mDropItem = nullptr;
226  }
227 
229  {
230 
231  if (mDropItem == nullptr)
232  {
234  }
235 
237 
238  if (mDropItem)
239  {
241  mDropItem->setVisible(true);
242  }
243  }
244 
246  {
247  eventUpdateDropState(this, mDropItem, _state);
248  }
249 
251  {
253  }
254 
255  void DDContainer::setPropertyOverride(const std::string& _key, const std::string& _value)
256  {
258  if (_key == "NeedDragDrop")
259  setNeedDragDrop(utility::parseValue<bool>(_value));
260 
261  else
262  {
263  Base::setPropertyOverride(_key, _value);
264  return;
265  }
266 
267  eventChangeProperty(this, _key, _value);
268  }
269 
271  {
272  mNeedDragDrop = _value;
273  }
274 
276  {
277  return mNeedDragDrop;
278  }
279 
280  void DDContainer::_setContainerItemInfo(size_t _index, bool _set, bool _accept)
281  {
282  }
283 
285  {
286  _resetContainer(false);
287  }
288 
289 } // namespace MyGUI