yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
drag_drop.h
Go to the documentation of this file.
1#ifndef YAZE_APP_GUI_CORE_DRAG_DROP_H_
2#define YAZE_APP_GUI_CORE_DRAG_DROP_H_
3
4#include <cstdint>
5
6#include "imgui/imgui.h"
7
8namespace yaze {
9
10namespace gui {
11
12// ============================================================================
13// Payload type identifiers for ImGui drag-drop
14// ============================================================================
15
16constexpr const char* kDragPayloadTile16 = "YAZE_TILE16";
17constexpr const char* kDragPayloadSprite = "YAZE_SPRITE";
18constexpr const char* kDragPayloadPalette = "YAZE_PALETTE";
19constexpr const char* kDragPayloadRoomObject = "YAZE_ROOM_OBJ";
20
21// ============================================================================
22// Payload structs
23// ============================================================================
24
29
34
40
42 uint16_t object_id;
44 int x;
45 int y;
46};
47
48// ============================================================================
49// Drag source helpers (call inside an ImGui widget loop)
50// ============================================================================
51
54inline bool BeginTileDragSource(int tile_id, int map_id) {
55 if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_SourceAllowNullID)) {
56 TileDragPayload payload{tile_id, map_id};
57 ImGui::SetDragDropPayload(kDragPayloadTile16, &payload, sizeof(payload));
58 ImGui::Text("Tile #%d", tile_id);
59 ImGui::EndDragDropSource();
60 return true;
61 }
62 return false;
63}
64
65inline bool BeginSpriteDragSource(int sprite_id, int room_id) {
66 if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_SourceAllowNullID)) {
67 SpriteDragPayload payload{sprite_id, room_id};
68 ImGui::SetDragDropPayload(kDragPayloadSprite, &payload, sizeof(payload));
69 ImGui::Text("Sprite #%d", sprite_id);
70 ImGui::EndDragDropSource();
71 return true;
72 }
73 return false;
74}
75
76inline bool BeginPaletteDragSource(int group_idx, int palette_idx,
77 int color_idx) {
78 if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_SourceAllowNullID)) {
79 PaletteDragPayload payload{group_idx, palette_idx, color_idx};
80 ImGui::SetDragDropPayload(kDragPayloadPalette, &payload, sizeof(payload));
81 ImGui::Text("Color [%d:%d:%d]", group_idx, palette_idx, color_idx);
82 ImGui::EndDragDropSource();
83 return true;
84 }
85 return false;
86}
87
88inline bool BeginRoomObjectDragSource(uint16_t object_id, int room_id,
89 int pos_x, int pos_y) {
90 if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_SourceAllowNullID)) {
91 RoomObjectDragPayload payload{object_id, room_id, pos_x, pos_y};
92 ImGui::SetDragDropPayload(kDragPayloadRoomObject, &payload,
93 sizeof(payload));
94 ImGui::Text("Object 0x%04X", object_id);
95 ImGui::EndDragDropSource();
96 return true;
97 }
98 return false;
99}
100
101// ============================================================================
102// Drop target helpers (call inside a widget that should accept drops)
103// ============================================================================
104
107 if (ImGui::BeginDragDropTarget()) {
108 if (const ImGuiPayload* payload =
109 ImGui::AcceptDragDropPayload(kDragPayloadTile16)) {
110 *out = *static_cast<const TileDragPayload*>(payload->Data);
111 ImGui::EndDragDropTarget();
112 return true;
113 }
114 ImGui::EndDragDropTarget();
115 }
116 return false;
117}
118
120 if (ImGui::BeginDragDropTarget()) {
121 if (const ImGuiPayload* payload =
122 ImGui::AcceptDragDropPayload(kDragPayloadSprite)) {
123 *out = *static_cast<const SpriteDragPayload*>(payload->Data);
124 ImGui::EndDragDropTarget();
125 return true;
126 }
127 ImGui::EndDragDropTarget();
128 }
129 return false;
130}
131
133 if (ImGui::BeginDragDropTarget()) {
134 if (const ImGuiPayload* payload =
135 ImGui::AcceptDragDropPayload(kDragPayloadPalette)) {
136 *out = *static_cast<const PaletteDragPayload*>(payload->Data);
137 ImGui::EndDragDropTarget();
138 return true;
139 }
140 ImGui::EndDragDropTarget();
141 }
142 return false;
143}
144
146 if (ImGui::BeginDragDropTarget()) {
147 if (const ImGuiPayload* payload =
148 ImGui::AcceptDragDropPayload(kDragPayloadRoomObject)) {
149 *out = *static_cast<const RoomObjectDragPayload*>(payload->Data);
150 ImGui::EndDragDropTarget();
151 return true;
152 }
153 ImGui::EndDragDropTarget();
154 }
155 return false;
156}
157
158} // namespace gui
159} // namespace yaze
160
161#endif // YAZE_APP_GUI_CORE_DRAG_DROP_H_
constexpr const char * kDragPayloadRoomObject
Definition drag_drop.h:19
bool BeginRoomObjectDragSource(uint16_t object_id, int room_id, int pos_x, int pos_y)
Definition drag_drop.h:88
bool BeginSpriteDragSource(int sprite_id, int room_id)
Definition drag_drop.h:65
constexpr const char * kDragPayloadTile16
Definition drag_drop.h:16
bool AcceptTileDrop(TileDragPayload *out)
Accept a tile16 drop. Returns true if a payload was accepted.
Definition drag_drop.h:106
constexpr const char * kDragPayloadPalette
Definition drag_drop.h:18
bool BeginTileDragSource(int tile_id, int map_id)
Definition drag_drop.h:54
bool AcceptRoomObjectDrop(RoomObjectDragPayload *out)
Definition drag_drop.h:145
bool AcceptSpriteDrop(SpriteDragPayload *out)
Definition drag_drop.h:119
bool AcceptPaletteDrop(PaletteDragPayload *out)
Definition drag_drop.h:132
bool BeginPaletteDragSource(int group_idx, int palette_idx, int color_idx)
Definition drag_drop.h:76
constexpr const char * kDragPayloadSprite
Definition drag_drop.h:17