TachyonUI 0.1.0
High-performance UI for building tools.
Loading...
Searching...
No Matches
gui_drag_drop_state.h
Go to the documentation of this file.
1#pragma once
2
3#include <gui_core/gui_id.h>
6
7#include <any>
8#include <functional>
9#include <stdint.h>
10
11namespace tachyon
12{
15
16 struct InputState;
17
20 {
24 bool isDropValid = false;
25 bool leftMouseDown = false;
26
27 uint32_t payloadType = 0;
28 uintptr_t payloadValue = 0;
29 const std::any* payload = nullptr;
30 };
31
33 using DragVisualizer = std::function<void(const DragVisualContext& context)>;
34
39 {
40 ID m_pendingDragSourceID = ID::Invalid();
41 ID m_draggedID = ID::Invalid();
42 ID m_dragOverID = ID::Invalid();
43 int2 m_dragStartScreenPos{ 0, 0 };
44 uint32_t m_dragPayloadType = 0;
45 uintptr_t m_dragPayloadValue = 0;
46 std::any m_dragPayload;
47
48 DragVisualizer m_sourceDragVisualizer;
49 DragVisualizer m_frameVisualizerOverrideCurrent;
50 DragVisualizer m_frameVisualizerOverrideNext;
51
52 ID m_dragEnterTargetID = ID::Invalid();
53 ID m_dragOverTargetID = ID::Invalid();
54 ID m_dragOutTargetID = ID::Invalid();
55 ID m_dragDropTargetID = ID::Invalid();
56 ID m_dragValidatedTargetID = ID::Invalid();
57
58 ID m_dragEventSourceID = ID::Invalid();
59 uint32_t m_dragEventPayloadType = 0;
60 uintptr_t m_dragEventPayloadValue = 0;
61 int32_t m_startDistance = kDragStartDistance;
62
63 ID ResolveDropTarget(ID hoveredID) const;
64 void ClearDrag();
65 void SetEventPayload(ID sourceID, uint32_t payloadType, uintptr_t payloadValue);
66
67 public:
68 // Query
69 bool IsDragging() const { return m_draggedID != ID::Invalid(); }
70 ID GetDraggedID() const { return m_draggedID; }
71 ID GetDragOverID() const { return m_dragOverID; }
72 uintptr_t GetPayloadValue() const { return m_dragPayloadValue; }
73
76 bool IsDropTargetFor(ID id, uint32_t acceptedPayloadType = 0) const;
77
78 ID GetEnterTargetID() const { return m_dragEnterTargetID; }
79 ID GetOverTargetID() const { return m_dragOverTargetID; }
80 ID GetOutTargetID() const { return m_dragOutTargetID; }
81 ID GetDropTargetID() const { return m_dragDropTargetID; }
82 ID GetValidatedTargetID() const { return m_dragValidatedTargetID; }
83
84 ID GetEventSourceID() const { return m_dragEventSourceID; }
85 uint32_t GetEventPayloadType() const { return m_dragEventPayloadType; }
86 uintptr_t GetEventPayloadValue() const { return m_dragEventPayloadValue; }
87 const std::any& GetPayload() const { return m_dragPayload; }
88
89 // Mutation
90
93 void Begin(ID sourceID, uint32_t payloadType, uintptr_t payloadValue, int2 startScreenPos,
94 std::any payload = {}, DragVisualizer sourceVisualizer = {});
95 void SetSourceVisualizer(DragVisualizer sourceVisualizer);
96 void UpdateFromInput(const InputState& in);
98 void SetStartDistance(int32_t pixels) { m_startDistance = pixels; }
99 void Cancel();
100
101 void SetValidatedTargetID(ID id) { m_dragValidatedTargetID = id; }
102
103 void SetFrameVisualizerOverride(DragVisualizer visualizer) { m_frameVisualizerOverrideNext = std::move(visualizer); }
105 bool InvokeActiveVisualizer(const DragVisualContext& context) const;
106
109
110 // Frame hooks
112 void EndFrameUpdate(ID hoveredForDrop, bool leftButtonDown);
113 };
114
115}
Drag-and-drop state, owned by GUIStateManager.
Definition gui_drag_drop_state.h:39
void SetStartDistance(int32_t pixels)
Pointer travel in pixels before a pending drag starts.
Definition gui_drag_drop_state.h:98
ID GetDragOverID() const
Definition gui_drag_drop_state.h:71
void SetFrameVisualizerOverride(DragVisualizer visualizer)
Definition gui_drag_drop_state.h:103
const std::any & GetPayload() const
Definition gui_drag_drop_state.h:87
void UpdateFromInput(const InputState &in)
ID GetEnterTargetID() const
Definition gui_drag_drop_state.h:78
bool IsDragging() const
Definition gui_drag_drop_state.h:69
void Begin(ID sourceID, uint32_t payloadType, uintptr_t payloadValue, int2 startScreenPos, std::any payload={}, DragVisualizer sourceVisualizer={})
Arms a pending drag from sourceID; ignored for an Invalid source or payload type 0.
void EndFrameUpdate(ID hoveredForDrop, bool leftButtonDown)
bool IsDropTargetFor(ID id, uint32_t acceptedPayloadType=0) const
True when an active drag is over id and its payload type is acceptedPayloadType (0 accepts any type).
ID GetOutTargetID() const
Definition gui_drag_drop_state.h:80
uintptr_t GetPayloadValue() const
Definition gui_drag_drop_state.h:72
void SetSourceVisualizer(DragVisualizer sourceVisualizer)
ID GetOverTargetID() const
Definition gui_drag_drop_state.h:79
ID GetDropTargetID() const
Definition gui_drag_drop_state.h:81
ID GetDraggedID() const
Definition gui_drag_drop_state.h:70
ID GetValidatedTargetID() const
Definition gui_drag_drop_state.h:82
bool InvokeActiveVisualizer(const DragVisualContext &context) const
uint32_t GetEventPayloadType() const
Definition gui_drag_drop_state.h:85
void ClearFrameVisualizerOverride()
uintptr_t GetEventPayloadValue() const
Definition gui_drag_drop_state.h:86
void SetValidatedTargetID(ID id)
Definition gui_drag_drop_state.h:101
ID GetEventSourceID() const
Definition gui_drag_drop_state.h:84
void ClearEvents()
Clears per-frame events. GUIStateManager::EndFrame calls it; the input manager may too.
std::function< void(const DragVisualContext &context)> DragVisualizer
Draws the dragged item while a drag is in progress.
Definition gui_drag_drop_state.h:33
constexpr int32_t kDragStartDistance
pointer travel before a press becomes a drag (CSS px)
Definition gui_input_enums.h:13
Definition gui_logging.h:24
What a DragVisualizer draws from: the pointer, the source and target, and the payload.
Definition gui_drag_drop_state.h:20
uintptr_t payloadValue
Definition gui_drag_drop_state.h:28
ID targetID
Definition gui_drag_drop_state.h:23
uint32_t payloadType
Definition gui_drag_drop_state.h:27
const std::any * payload
Definition gui_drag_drop_state.h:29
tachyon::int2 screenPos
Definition gui_drag_drop_state.h:21
bool leftMouseDown
Definition gui_drag_drop_state.h:25
bool isDropValid
Definition gui_drag_drop_state.h:24
ID sourceID
Definition gui_drag_drop_state.h:22
A 64-bit element ID whose bit layout depends on its IDMode.
Definition gui_id.h:23
static constexpr ID Invalid()
The "no element" ID (all bits zero); also the default for optional ID parameters.
Definition gui_id.h:66
Snapshot of input state for a single recorded OS event.
Definition gui_input_state.h:17
Integer 2D vector.
Definition gui_base_types.h:19