MyGUI
3.2.1
Main Page
Related Pages
Namespaces
Data Structures
Files
Examples
File List
Globals
mygui
MyGUIEngine
src
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
15
DDContainer::DDContainer
() :
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
// смещение внутри виджета, куда кликнули мышкой
31
mClickInWidget
=
InputManager::getInstance
().
getLastPressedPosition
(
MouseButton::Left
) -
getAbsolutePosition
();
32
33
mouseButtonPressed
(_id);
34
35
Base::onMouseButtonPressed
(_left, _top, _id);
36
}
37
38
void
DDContainer::onMouseButtonReleased
(
int
_left,
int
_top,
MouseButton
_id)
39
{
40
mouseButtonReleased
(_id);
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
52
void
DDContainer::mouseButtonPressed
(
MouseButton
_id)
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
74
void
DDContainer::mouseButtonReleased
(
MouseButton
_id)
75
{
76
if
(
MouseButton::Left
== _id)
77
{
78
endDrop
(
false
);
79
}
80
}
81
82
void
DDContainer::mouseDrag
(
MouseButton
_id)
83
{
84
if
(
MouseButton::Left
!= _id)
85
return
;
86
87
// нужно ли обновить данные
88
bool
update =
false
;
89
90
// первый раз дропаем елемент
91
if
(!
mStartDrop
&&
mDropSenderIndex
!=
ITEM_NONE
)
92
{
93
mStartDrop
=
true
;
94
mNeedDrop
=
false
;
95
update =
true
;
96
// запрос на нужность дропа по индексу
97
mDropInfo
.
set
(
this
,
mDropSenderIndex
,
nullptr
,
ITEM_NONE
);
98
mReseiverContainer
=
nullptr
;
99
100
eventStartDrag
(
this
,
mDropInfo
,
mNeedDrop
);
101
102
if
(
mNeedDrop
)
103
{
104
eventChangeDDState
(
this
,
DDItemState::Start
);
105
}
106
else
107
{
108
// сбрасываем фокус мыши (не обязательно)
109
InputManager::getInstance
().
resetMouseCaptureWidget
();
110
}
111
}
112
113
// дроп не нужен
114
if
(!
mNeedDrop
)
115
{
116
return
;
117
}
118
119
// делаем запрос, над кем наша мыша
120
const
IntPoint
& point =
InputManager::getInstance
().
getMousePosition
();
121
Widget
* item =
LayerManager::getInstance
().
getWidgetFromPoint
(point.
left
, point.
top
);
122
123
updateDropItems
();
124
125
// если равно, значит уже спрашивали
126
if
(
mOldDrop
== item)
return
;
127
mOldDrop
= item;
128
129
// сбрасываем старую подсветку
130
if
(
mReseiverContainer
)
mReseiverContainer
->
_setContainerItemInfo
(
mDropInfo
.
receiver_index
,
false
,
false
);
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);
148
mReseiverContainer
->
_eventInvalideContainer
.clear();
149
mReseiverContainer
->
_eventInvalideContainer
+=
newDelegate
(
this
, &
DDContainer::notifyInvalideDrop
);
150
151
// делаем запрос на возможность дропа
152
mDropInfo
.
set
(
this
,
mDropSenderIndex
,
mReseiverContainer
, receiver_index);
153
154
eventRequestDrop
(
this
,
mDropInfo
,
mDropResult
);
155
156
// устанавливаем новую подсветку
157
mReseiverContainer
->
_setContainerItemInfo
(
mDropInfo
.
receiver_index
,
true
,
mDropResult
);
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
172
DDWidgetState
data(
mDropSenderIndex
);
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
// сбрасываем старую подсветку
206
if
(
mReseiverContainer
)
mReseiverContainer
->
_setContainerItemInfo
(
mDropInfo
.
receiver_index
,
false
,
false
);
207
208
if
(_reset)
mDropResult
=
false
;
209
eventDropResult
(
this
,
mDropInfo
,
mDropResult
);
210
eventChangeDDState
(
this
,
DDItemState::End
);
211
212
// сбрасываем инфу для дропа
213
mStartDrop
=
false
;
214
mDropResult
=
false
;
215
mNeedDrop
=
false
;
216
mOldDrop
=
nullptr
;
217
mDropInfo
.
reset
();
218
mReseiverContainer
=
nullptr
;
219
mDropSenderIndex
=
ITEM_NONE
;
220
}
221
}
222
223
void
DDContainer::removeDropItems
()
224
{
225
mDropItem
=
nullptr
;
226
}
227
228
void
DDContainer::updateDropItems
()
229
{
230
231
if
(
mDropItem
==
nullptr
)
232
{
233
requestDragWidgetInfo
(
this
,
mDropItem
,
mDropDimension
);
234
}
235
236
const
IntPoint
& point =
InputManager::getInstance
().
getMousePositionByLayer
();
237
238
if
(
mDropItem
)
239
{
240
mDropItem
->
setCoord
(point.
left
-
mClickInWidget
.
left
+
mDropDimension
.
left
, point.
top
-
mClickInWidget
.
top
+
mDropDimension
.
top
,
mDropDimension
.
width
,
mDropDimension
.
height
);
241
mDropItem
->
setVisible
(
true
);
242
}
243
}
244
245
void
DDContainer::updateDropItemsState
(
const
DDWidgetState
& _state)
246
{
247
eventUpdateDropState
(
this
,
mDropItem
, _state);
248
}
249
250
void
DDContainer::notifyInvalideDrop
(
DDContainer
* _sender)
251
{
252
mouseDrag
(
MouseButton::Left
);
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
270
void
DDContainer::setNeedDragDrop
(
bool
_value)
271
{
272
mNeedDragDrop
= _value;
273
}
274
275
bool
DDContainer::getNeedDragDrop
()
const
276
{
277
return
mNeedDragDrop
;
278
}
279
280
void
DDContainer::_setContainerItemInfo
(
size_t
_index,
bool
_set,
bool
_accept)
281
{
282
}
283
284
void
DDContainer::resetDrag
()
285
{
286
_resetContainer
(
false
);
287
}
288
289
}
// namespace MyGUI
Generated on Wed Aug 20 2014 00:03:32 for MyGUI by
1.8.3.1