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
9namespace 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