| 1 | //************************************ bs::framework - Copyright 2018 Marko Pintera **************************************// | 
|---|
| 2 | //*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********// | 
|---|
| 3 | #pragma once | 
|---|
| 4 |  | 
|---|
| 5 | #include "BsCorePrerequisites.h" | 
|---|
| 6 | #include "Utility/BsEvent.h" | 
|---|
| 7 | #include "Math/BsRect2I.h" | 
|---|
| 8 |  | 
|---|
| 9 | namespace bs | 
|---|
| 10 | { | 
|---|
| 11 | /** @addtogroup Platform-Internal | 
|---|
| 12 | *  @{ | 
|---|
| 13 | */ | 
|---|
| 14 |  | 
|---|
| 15 | /** Type of drop event type. This is used when dragging items over drop targets. */ | 
|---|
| 16 | enum class DropTargetType | 
|---|
| 17 | { | 
|---|
| 18 | FileList, | 
|---|
| 19 | None | 
|---|
| 20 | }; | 
|---|
| 21 |  | 
|---|
| 22 | /** | 
|---|
| 23 | * Drop targets allow you to register a certain portion of a window as a drop target that accepts certain drop types | 
|---|
| 24 | * from the OS (platform) specific drag and drop system. Accepted drop types are provided by the OS and include things | 
|---|
| 25 | * like file and item dragging. | 
|---|
| 26 | * | 
|---|
| 27 | * You will receive events with the specified drop area as long as it is active. | 
|---|
| 28 | */ | 
|---|
| 29 | class BS_CORE_EXPORT DropTarget | 
|---|
| 30 | { | 
|---|
| 31 | public: | 
|---|
| 32 | ~DropTarget(); | 
|---|
| 33 |  | 
|---|
| 34 | /**	Sets the drop target area, in local window coordinates. */ | 
|---|
| 35 | void setArea(const Rect2I& area); | 
|---|
| 36 |  | 
|---|
| 37 | /** Returns the drop target area, in local window coordinates. */ | 
|---|
| 38 | const Rect2I& getArea() const { return mArea;} | 
|---|
| 39 |  | 
|---|
| 40 | /**	Gets the type of drop that this drop target is looking for. Only valid after a drop has been triggered. */ | 
|---|
| 41 | DropTargetType getDropType() const { return mDropType; } | 
|---|
| 42 |  | 
|---|
| 43 | /** | 
|---|
| 44 | * Returns a list of files received by the drop target. Only valid after a drop of FileList type has been triggered. | 
|---|
| 45 | */ | 
|---|
| 46 | const Vector<Path>& getFileList() const { return mFileList; } | 
|---|
| 47 |  | 
|---|
| 48 | /** | 
|---|
| 49 | * Creates a new drop target. Any drop events that happen on the specified window's drop area will be reported | 
|---|
| 50 | * through the target's events. | 
|---|
| 51 | * | 
|---|
| 52 | * @param[in]	window		Window to which the drop target will be attached to. | 
|---|
| 53 | * @param[in]	area		Area, relative to the window, in which the drop events are allowed. | 
|---|
| 54 | * @return					Newly created drop target. | 
|---|
| 55 | */ | 
|---|
| 56 | static SPtr<DropTarget> create(const RenderWindow* window, const Rect2I& area); | 
|---|
| 57 |  | 
|---|
| 58 | /** | 
|---|
| 59 | * Triggered when a pointer is being dragged over the drop area. Provides window coordinates of the pointer position. | 
|---|
| 60 | */ | 
|---|
| 61 | Event<void(INT32, INT32)> onDragOver; | 
|---|
| 62 |  | 
|---|
| 63 | /** | 
|---|
| 64 | * Triggered when the user completes a drop while pointer is over the drop area. Provides window coordinates of the | 
|---|
| 65 | * pointer position. | 
|---|
| 66 | */ | 
|---|
| 67 | Event<void(INT32, INT32)> onDrop; | 
|---|
| 68 |  | 
|---|
| 69 | /** | 
|---|
| 70 | * Triggered when a pointer enters the drop area. Provides window coordinates of the pointer position. | 
|---|
| 71 | */ | 
|---|
| 72 | Event<void(INT32, INT32)> onEnter; | 
|---|
| 73 |  | 
|---|
| 74 | /** Triggered when a pointer leaves the drop area. */ | 
|---|
| 75 | Event<void()> onLeave; | 
|---|
| 76 |  | 
|---|
| 77 | /** @name Internal | 
|---|
| 78 | *  @{ | 
|---|
| 79 | */ | 
|---|
| 80 |  | 
|---|
| 81 | /** Clears all internal values. */ | 
|---|
| 82 | void _clear(); | 
|---|
| 83 |  | 
|---|
| 84 | /** Sets the file list and marks the drop event as FileList. */ | 
|---|
| 85 | void _setFileList(const Vector<Path>& fileList); | 
|---|
| 86 |  | 
|---|
| 87 | /** Marks the drop area as inactive or active. */ | 
|---|
| 88 | void _setActive(bool active) { mActive = active; } | 
|---|
| 89 |  | 
|---|
| 90 | /**	Checks is the specified position within the current drop area. Position should be in window local coordinates. */ | 
|---|
| 91 | bool _isInside(const Vector2I& pos) const; | 
|---|
| 92 |  | 
|---|
| 93 | /** Returns true if the drop target is active. */ | 
|---|
| 94 | bool _isActive() const { return mActive; } | 
|---|
| 95 |  | 
|---|
| 96 | /**	Returns a render window this drop target is attached to. */ | 
|---|
| 97 | const RenderWindow* _getOwnerWindow() const { return mOwnerWindow; } | 
|---|
| 98 |  | 
|---|
| 99 | /** @} */ | 
|---|
| 100 | private: | 
|---|
| 101 | friend class Platform; | 
|---|
| 102 |  | 
|---|
| 103 | DropTarget(const RenderWindow* ownerWindow, const Rect2I& area); | 
|---|
| 104 |  | 
|---|
| 105 | Rect2I mArea; | 
|---|
| 106 | bool mActive; | 
|---|
| 107 | const RenderWindow* mOwnerWindow; | 
|---|
| 108 |  | 
|---|
| 109 | DropTargetType mDropType; | 
|---|
| 110 | Vector<Path> mFileList; | 
|---|
| 111 | }; | 
|---|
| 112 |  | 
|---|
| 113 | /** @} */ | 
|---|
| 114 | } | 
|---|
| 115 |  | 
|---|
| 116 |  | 
|---|