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