MyGUI 3.4.3
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
15 void DDContainer::onMouseButtonPressed(int _left, int _top, MouseButton _id)
16 {
17 // смещение внутри виджета, куда кликнули мышкой
19
21
22 Base::onMouseButtonPressed(_left, _top, _id);
23 }
24
25 void DDContainer::onMouseButtonReleased(int _left, int _top, MouseButton _id)
26 {
28
29 Base::onMouseButtonReleased(_left, _top, _id);
30 }
31
32 void DDContainer::onMouseDrag(int _left, int _top, MouseButton _id)
33 {
34 mouseDrag(_id);
35
36 Base::onMouseDrag(_left, _top, _id);
37 }
38
40 {
41 if (MouseButton::Left == _id)
42 {
43 // сбрасываем инфу для дропа
44 mDropResult = false;
45 mOldDrop = nullptr;
46 mDropInfo.reset();
47 mReseiverContainer = nullptr;
48
49 // сбрасываем, чтобы обновился дропный виджет
50 mStartDrop = false;
51 }
52 // если нажата другая клавиша и был дроп то сбрасываем
53 else
54 {
55 endDrop(true);
56 }
57 }
58
60 {
61 if (MouseButton::Left == _id)
62 {
63 endDrop(false);
64 }
65 }
66
68 {
69 if (MouseButton::Left != _id)
70 return;
71
72 // нужно ли обновить данные
73 bool update = false;
74
75 // первый раз дропаем елемент
77 {
78 mStartDrop = true;
79 mNeedDrop = false;
80 update = true;
81 // запрос на нужность дропа по индексу
82 mDropInfo.set(this, mDropSenderIndex, nullptr, ITEM_NONE);
83 mReseiverContainer = nullptr;
84
86
87 if (mNeedDrop)
88 {
90 }
91 else
92 {
93 // сбрасываем фокус мыши (не обязательно)
95 }
96 }
97
98 // дроп не нужен
99 if (!mNeedDrop)
100 {
101 return;
102 }
103
104 // делаем запрос, над кем наша мыша
107
109
110 // если равно, значит уже спрашивали
111 if (mOldDrop == item)
112 return;
113 mOldDrop = item;
114
115 // сбрасываем старую подсветку
117 mReseiverContainer->_setContainerItemInfo(mDropInfo.receiver_index, false, false);
118
119 mDropResult = false;
120 mReseiverContainer = nullptr;
121 Widget* receiver = nullptr;
122 // есть виджет под нами
123 if (item)
124 {
125 // делаем запрос на индекс по произвольному виджету
126 receiver = item->_getContainer();
127 // работаем только с контейнерами
128 if (receiver && receiver->isType<DDContainer>())
129 {
130 // подписываемся на информацию о валидности дропа
131 mReseiverContainer = static_cast<DDContainer*>(receiver);
132 mReseiverContainer->_eventInvalideContainer.clear();
133 mReseiverContainer->_eventInvalideContainer += newDelegate(this, &DDContainer::notifyInvalideDrop);
134
135 // делаем запрос на возможность дропа
136 size_t receiver_index = receiver->_getItemIndex(item);
137 mDropInfo.set(this, mDropSenderIndex, mReseiverContainer, receiver_index);
138
140
141 // устанавливаем новую подсветку
142 mReseiverContainer->_setContainerItemInfo(mDropInfo.receiver_index, true, mDropResult);
143 }
144 else
145 {
146 mDropInfo.set(this, mDropSenderIndex, nullptr, ITEM_NONE);
147 }
148 }
149 // нет виджета под нами
150 else
151 {
152 mDropInfo.set(this, mDropSenderIndex, nullptr, ITEM_NONE);
153 }
154
155 DDItemState state;
156
158 data.update = update;
159
160 if (receiver == nullptr)
161 {
162 data.accept = false;
163 data.refuse = false;
164 state = DDItemState::Miss;
165 }
166 else if (mDropResult)
167 {
168 data.accept = true;
169 data.refuse = false;
170 state = DDItemState::Accept;
171 }
172 else
173 {
174 data.accept = false;
175 data.refuse = true;
176 state = DDItemState::Refuse;
177 }
178
180
181 eventChangeDDState(this, state);
182 }
183
184 void DDContainer::endDrop(bool _reset)
185 {
186 if (mStartDrop)
187 {
189
190 // сбрасываем старую подсветку
192 mReseiverContainer->_setContainerItemInfo(mDropInfo.receiver_index, false, false);
193
194 if (_reset)
195 mDropResult = false;
198
199 // сбрасываем инфу для дропа
200 mStartDrop = false;
201 mDropResult = false;
202 mNeedDrop = false;
203 mOldDrop = nullptr;
204 mDropInfo.reset();
205 mReseiverContainer = nullptr;
207 }
208 }
209
211 {
212 mDropItem = nullptr;
213 }
214
216 {
217 if (mDropItem == nullptr)
218 {
220 }
221
223
224 if (mDropItem)
225 {
226 mDropItem->setCoord(
227 point.left - mClickInWidget.left + mDropDimension.left,
228 point.top - mClickInWidget.top + mDropDimension.top,
229 mDropDimension.width,
230 mDropDimension.height);
231 mDropItem->setVisible(true);
232 }
233 }
234
236 {
237 eventUpdateDropState(this, mDropItem, _state);
238 }
239
244
245 void DDContainer::setPropertyOverride(std::string_view _key, std::string_view _value)
246 {
248 if (_key == "NeedDragDrop")
250
251 else
252 {
253 Base::setPropertyOverride(_key, _value);
254 return;
255 }
256
257 eventChangeProperty(this, _key, _value);
258 }
259
261 {
262 mNeedDragDrop = _value;
263 }
264
266 {
267 return mNeedDragDrop;
268 }
269
270 void DDContainer::_setContainerItemInfo(size_t _index, bool _set, bool _accept)
271 {
272 }
273
275 {
276 _resetContainer(false);
277 }
278
279} // 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
virtual void _setContainerItemInfo(size_t _index, bool _set, bool _accept)
EventHandle_EventHandle_DDContainerPtrWidgetPtrRefIntCoordRef requestDragWidgetInfo
DDContainer * mReseiverContainer
void onMouseButtonPressed(int _left, int _top, MouseButton _id) override
void setPropertyOverride(std::string_view _key, std::string_view _value) 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)
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::MultiDelegate< DDContainer *, Widget *, const DDWidgetState & > eventUpdateDropState
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.
virtual bool isType(const std::type_info &_type) const override
EventHandle_WidgetStringString eventChangeProperty
virtual void _resetContainer(bool _update)
Widget * _getContainer() const
virtual size_t _getItemIndex(Widget *_item) const
T parseValue(std::string_view _value)
types::TPoint< int > IntPoint
Definition MyGUI_Types.h:27
constexpr size_t ITEM_NONE
delegates::DelegateFunction< Args... > * newDelegate(void(*_func)(Args... args))