yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
interaction_coordinator.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_DUNGEON_INTERACTION_INTERACTION_COORDINATOR_H_
2#define YAZE_APP_EDITOR_DUNGEON_INTERACTION_INTERACTION_COORDINATOR_H_
3
4#include <string>
5#include <tuple>
6#include <vector>
7
13
14namespace yaze {
15namespace editor {
16
25 public:
29 enum class Mode {
30 Select, // Normal selection mode (no placement)
31 PlaceDoor, // Door placement mode
32 PlaceSprite, // Sprite placement mode
33 PlaceItem // Item placement mode
34 };
35
37
44
48 Mode GetCurrentMode() const { return current_mode_; }
49
55 void SetMode(Mode mode);
56
60 void CancelCurrentMode();
61
65 bool IsPlacementActive() const;
66
67 // ========================================================================
68 // Handler Access
69 // ========================================================================
70
73
78
81
83 const TileObjectHandler& tile_handler() const { return tile_handler_; }
84
85 // ========================================================================
86 // Unified Interaction Methods
87 // ========================================================================
88
95 bool HandleClick(int canvas_x, int canvas_y);
96 bool HandleMouseWheel(float delta);
97
98 void SelectEntity(EntityType type, size_t index);
99 void SetSelectedEntities(std::vector<SelectedEntity> entities);
101 bool HasEntitySelection() const;
102 bool NudgeSelected(int delta_x, int delta_y);
103 void CancelPlacement();
104 const std::vector<SelectedEntity>& GetSelectedEntities() const {
105 return selected_entities_;
106 }
107 void SelectEntitiesInRect(const std::tuple<int, int, int, int>& bounds,
108 bool additive, bool toggle);
109 void BeginSelectionDrag(ImVec2 start_pos);
110
111 // Doors/sprites/items only (tile objects are handled by ObjectSelection).
112 std::optional<SelectedEntity> GetEntityAtPosition(int canvas_x,
113 int canvas_y) const;
114 std::vector<SelectedEntity> GetEntitiesAtPosition(int canvas_x,
115 int canvas_y) const;
116
117 // Current selection (doors/sprites/items only). Returns {None,0} if none.
119
123 void HandleDrag(ImVec2 current_pos, ImVec2 delta);
124
128 void HandleRelease();
129
133 void DrawGhostPreviews();
134
139
147
148 // ========================================================================
149 // Entity Selection
150 // ========================================================================
151
158 bool TrySelectEntityAtCursor(int canvas_x, int canvas_y);
159
164
169
175
176 private:
179
184 std::vector<SelectedEntity> selected_entities_;
189 ImVec2 cycle_hud_screen_pos_{0.0f, 0.0f};
191 std::vector<SelectedEntity> cycle_last_hits_;
193 ImVec2 entity_group_drag_start_{0.0f, 0.0f};
194 ImVec2 entity_group_drag_current_{0.0f, 0.0f};
203
209 bool ApplySelection(SelectedEntity entity);
210 bool UpdateEntitySelection(SelectedEntity entity, bool additive, bool toggle);
211 bool IsSelectionHitSelected(SelectedEntity entity) const;
212 bool HasGroupDragSelection() const;
213 bool NudgeSelectedEntities(int delta_x, int delta_y,
214 bool defer_drag_notifications);
217 void HandleEntityGroupDrag(ImVec2 current_pos);
218 bool SameCycleTarget(int canvas_x, int canvas_y,
219 const std::vector<SelectedEntity>& hits) const;
221 std::optional<size_t> FindSelectedCycleIndex(
222 const std::vector<SelectedEntity>& hits) const;
225 std::string DescribeEntity(SelectedEntity entity) const;
226 std::string DescribeCycleHudEntity(SelectedEntity entity) const;
227};
228
229} // namespace editor
230} // namespace yaze
231
232#endif // YAZE_APP_EDITOR_DUNGEON_INTERACTION_INTERACTION_COORDINATOR_H_
Abstract base class for entity interaction handlers.
Handles door placement and interaction in the dungeon editor.
Coordinates interaction mode switching and dispatches to handlers.
const DoorInteractionHandler & door_handler() const
const std::vector< SelectedEntity > & GetSelectedEntities() const
std::vector< SelectedEntity > GetEntitiesAtPosition(int canvas_x, int canvas_y) const
bool IsSelectionHitSelected(SelectedEntity entity) const
bool TrySelectEntityAtCursor(int canvas_x, int canvas_y)
Try to select entity at cursor position.
Mode GetSelectedEntityType() const
Get the type of currently selected entity.
std::string DescribeCycleHudEntity(SelectedEntity entity) const
const TileObjectHandler & tile_handler() const
void SelectEntitiesInRect(const std::tuple< int, int, int, int > &bounds, bool additive, bool toggle)
void CancelCurrentMode()
Cancel current mode and return to select mode.
Mode GetCurrentMode() const
Get current interaction mode.
SpriteInteractionHandler & sprite_handler()
void SetContext(InteractionContext *ctx)
Set the shared interaction context.
std::vector< SelectedEntity > selected_entities_
bool UpdateEntitySelection(SelectedEntity entity, bool additive, bool toggle)
std::optional< size_t > FindSelectedCycleIndex(const std::vector< SelectedEntity > &hits) const
BaseEntityHandler * GetActiveHandler()
Get active handler based on current mode.
void DeleteSelectedEntity()
Delete currently selected entity.
bool IsPlacementActive() const
Check if any placement mode is active.
bool HandleClick(int canvas_x, int canvas_y)
Handle click at canvas position.
void SetSelectedEntities(std::vector< SelectedEntity > entities)
std::string DescribeEntity(SelectedEntity entity) const
void SelectEntity(EntityType type, size_t index)
void DrawPostPlacementOverlays()
Draw post-placement success toasts for all handlers (unconditional)
const SpriteInteractionHandler & sprite_handler() const
bool NudgeSelected(int delta_x, int delta_y)
void DrawSelectionHighlights()
Draw selection highlights for all entity types.
const ItemInteractionHandler & item_handler() const
void SetMode(Mode mode)
Set interaction mode.
void ClearAllEntitySelections()
Clear all entity selections.
void DrawGhostPreviews()
Draw ghost previews for active placement mode.
bool SameCycleTarget(int canvas_x, int canvas_y, const std::vector< SelectedEntity > &hits) const
bool NudgeSelectedEntities(int delta_x, int delta_y, bool defer_drag_notifications)
std::vector< SelectedEntity > cycle_last_hits_
std::optional< SelectedEntity > GetEntityAtPosition(int canvas_x, int canvas_y) const
void HandleDrag(ImVec2 current_pos, ImVec2 delta)
Handle drag operation.
Handles pot item placement and interaction in the dungeon editor.
Handles sprite placement and interaction in the dungeon editor.
Handles functional mutations and queries for tile objects.
EntityType
Type of entity that can be selected in the dungeon editor.
Shared context for all interaction handlers.
Represents a selected entity in the dungeon editor.