MyGUI 3.4.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"
10#include "MyGUI_LayerManager.h"
11
12namespace 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
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;
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
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
195
196 eventChangeDDState(this, state);
197 }
198
199 void DDContainer::endDrop(bool _reset)
200 {
201 if (mStartDrop)
202 {
204
205 // сбрасываем старую подсветку
207
208 if (_reset) mDropResult = false;
211
212 // сбрасываем инфу для дропа
213 mStartDrop = false;
214 mDropResult = false;
215 mNeedDrop = false;
216 mOldDrop = nullptr;
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
widget description should be here.
void onMouseDrag(int _left, int _top, MouseButton _id) override
EventHandle_DDContainerPtrCDDItemInfoRefBoolRef eventRequestDrop
virtual void notifyInvalideDrop(DDContainer *_sender)
EventHandle_DDContainerPtrCDDItemInfoRefBoolRef eventStartDrag
delegates::CMultiDelegate3< DDContainer *, Widget *, const DDWidgetState & > eventUpdateDropState
virtual void _setContainerItemInfo(size_t _index, bool _set, bool _accept)
EventHandle_EventHandle_DDContainerPtrWidgetPtrRefIntCoordRef requestDragWidgetInfo
DDContainer * mReseiverContainer
bool getNeedDragDrop() const
void onMouseButtonPressed(int _left, int _top, MouseButton _id) override
void mouseButtonPressed(MouseButton _id)
virtual void updateDropItems()
EventHandle_EventHandle_DDContainerPtrDDItemState eventChangeDDState
void onMouseButtonReleased(int _left, int _top, MouseButton _id) override
void mouseButtonReleased(MouseButton _id)
void setPropertyOverride(const std::string &_key, const std::string &_value) override
virtual void removeDropItems()
void setNeedDragDrop(bool _value)
virtual void updateDropItemsState(const DDWidgetState &_state)
EventHandle_DDContainerPtrCDDItemInfoRefBool eventDropResult
void mouseDrag(MouseButton _id)
void endDrop(bool _reset)
delegates::CMultiDelegate1< DDContainer * > _eventInvalideContainer
const IntPoint & getAbsolutePosition() const
const IntPoint & getLastPressedPosition(MouseButton _id) const
const IntPoint & getMousePosition() const
static InputManager & getInstance()
IntPoint getMousePositionByLayer() const
static LayerManager & getInstance()
Widget * getWidgetFromPoint(int _left, int _top) const
widget description should be here.
Definition: MyGUI_Widget.h:37
void setCoord(const IntCoord &_value) override
virtual bool isType(const std::type_info &_type) const override
Definition: MyGUI_Widget.h:41
EventHandle_WidgetStringString eventChangeProperty
Definition: MyGUI_Widget.h:267
virtual void setVisible(bool _value)
virtual void _resetContainer(bool _update)
Widget * _getContainer() const
virtual size_t _getItemIndex(Widget *_item) const
const size_t ITEM_NONE
Definition: MyGUI_Macros.h:17
delegates::DelegateFunction< Args... > * newDelegate(void(*_func)(Args... args))
void set(DDContainer *_sender, size_t _sender_index, DDContainer *_receiver, size_t _receiver_index)