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 #ifndef MYGUI_DDCONTAINER_H_
8 #define MYGUI_DDCONTAINER_H_
9 
10 #include "MyGUI_Prerequest.h"
11 #include "MyGUI_Widget.h"
12 #include "MyGUI_DDItemInfo.h"
13 #include "MyGUI_EventPair.h"
14 
15 namespace MyGUI
16 {
17 
18 	typedef delegates::CMultiDelegate3<DDContainer*, const DDItemInfo&, bool&> EventHandle_DDContainerPtrCDDItemInfoRefBoolRef;
19 	typedef delegates::CMultiDelegate3<DDContainer*, const DDItemInfo&, bool> EventHandle_DDContainerPtrCDDItemInfoRefBool;
20 	typedef delegates::CMultiDelegate2<DDContainer*, DDItemState> EventHandle_EventHandle_DDContainerPtrDDItemState;
21 	typedef delegates::CDelegate3<DDContainer*, Widget*&, IntCoord&> EventHandle_EventHandle_DDContainerPtrWidgetPtrRefIntCoordRef;
22 
23 
24 	/** \brief @wpage{DDContainer}
25 		DDContainer widget description should be here.
26 	*/
27 	class MYGUI_EXPORT DDContainer :
28 		public Widget
29 	{
30 		MYGUI_RTTI_DERIVED( DDContainer )
31 
32 	public:
33 		DDContainer();
34 
35 		/** Set drag'n'drop mode flag.
36 			Disabled (false) by default.
37 		*/
38 		void setNeedDragDrop(bool _value);
39 		/** Get drag'n'drop mode flag */
40 		bool getNeedDragDrop() const;
41 
42 		void resetDrag();
43 
44 		/*events:*/
45 		/** Event : Request for start drag.\n
46 			signature : void method(MyGUI::DDContainer* _sender, const MyGUI::DDItemInfo& _info, bool& _result)
47 			@param _sender widget that called this event
48 			@param _info information about DDContainers
49 			@param _result write here true if container can be draggedor false if it can't
50 		*/
51 		EventHandle_DDContainerPtrCDDItemInfoRefBoolRef eventStartDrag;
52 
53 		/** Event : Request for start drop (moving mouse over container, but not dropped yet).\n
54 			signature : void method(MyGUI::DDContainer* _sender, const MyGUI::DDItemInfo& _info, bool& _result)
55 			@param _sender widget that called this event
56 			@param _info information about DDContainers
57 			@param _result write here true if container accept dragged widget or false if it isn't
58 		*/
59 		EventHandle_DDContainerPtrCDDItemInfoRefBoolRef eventRequestDrop;
60 
61 		/** Event : End drag (drop).\n
62 			signature : void method(MyGUI::DDContainer* _sender, const MyGUI::DDItemInfo& _info, bool _result)
63 			@param _sender widget that called this event
64 			@param _info information about DDContainers
65 			@param _result if true then drop was successfull
66 		*/
67 		EventHandle_DDContainerPtrCDDItemInfoRefBool eventDropResult;
68 
69 		/** Event : Drag'n'drop state changed.\n
70 			signature : void method(MyGUI::DDContainer* _sender, MyGUI::DDItemState _state)
71 			@param _sender widget that called this event
72 			@param _state new state
73 		*/
74 		EventHandle_EventHandle_DDContainerPtrDDItemState eventChangeDDState;
75 
76 		/** Event : [not used] Request widget for dragging.\n
77 			signature : void method(MyGUI::DDContainer* _sender, MyGUI::Widget*& _item, MyGUI::IntCoord& _dimension)
78 			@param _sender widget that called this event
79 			@param _item write widget pointer here
80 			@param _dimension write widget coordinate here
81 		*/
82 		EventHandle_EventHandle_DDContainerPtrWidgetPtrRefIntCoordRef requestDragWidgetInfo;
83 
84 
85 		/*internal:*/
86 		// метод для установления стейта айтема
87 		virtual void _setContainerItemInfo(size_t _index, bool _set, bool _accept);
88 
89 		/** Event : [Internal event] невалидна информация для контейнера.\n
90 			signature : void method(MyGUI::DDContainer* _sender)
91 			@param _sender widget that called this event
92 		*/
93 		delegates::CMultiDelegate1<DDContainer*> _eventInvalideContainer;
94 
95 		/** Event : [Internal event] !!обновить виджеты дропа DD_FIXME наверное internal.\n
96 			signature : void method(MyGUI::DDContainer* _sender, MyGUI::Widget* _item, const MyGUI::DDWidgetState& _state)
97 			@param _sender widget that called this event
98 			@param _items
99 			@param _state
100 		*/
101 		delegates::CMultiDelegate3<DDContainer*, Widget*, const DDWidgetState&> eventUpdateDropState;
102 
103 	protected:
104 		void onMouseButtonPressed(int _left, int _top, MouseButton _id) override;
105 		void onMouseButtonReleased(int _left, int _top, MouseButton _id) override;
106 		void onMouseDrag(int _left, int _top, MouseButton _id) override;
107 
108         virtual void notifyInvalideDrop(DDContainer* _sender);
109 
110 		virtual void removeDropItems();
111 		virtual void updateDropItems();
112 		virtual void updateDropItemsState(const DDWidgetState& _state);
113 
114 		void mouseDrag(MouseButton _id);
115 		void mouseButtonReleased(MouseButton _id);
116 		void mouseButtonPressed(MouseButton _id);
117 
118 		void endDrop(bool _reset);
119 
120 		void setPropertyOverride(const std::string& _key, const std::string& _value) override;
121 
122 	protected:
123 		bool mDropResult;
124 		bool mNeedDrop;
125 		bool mStartDrop;
126 
127 		Widget* mOldDrop;
128 		Widget* mCurrentSender;
129 
130 		DDItemInfo mDropInfo;
131 
132 		size_t mDropSenderIndex;
133 
134 		// список виджетов для дропа
135 		Widget* mDropItem;
136 		IntCoord mDropDimension;
137 
138 		IntPoint mClickInWidget;
139 
140 		// нужно и виджету поддержка драг энд дропа
141 		bool mNeedDragDrop;
142 
143 		DDContainer* mReseiverContainer;
144 	};
145 
146 } // namespace MyGUI
147 
148 #endif // MYGUI_DDCONTAINER_H_
149