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
17struct DungeonSelectionEditRequest;
18
27 public:
31 enum class Mode {
32 Select, // Normal selection mode (no placement)
33 PlaceDoor, // Door placement mode
34 PlaceSprite, // Sprite placement mode
35 PlaceItem // Item placement mode
36 };
37
39
46
50 Mode GetCurrentMode() const { return current_mode_; }
51
57 void SetMode(Mode mode);
58
62 void CancelCurrentMode();
63
67 bool IsPlacementActive() const;
68
69 // ========================================================================
70 // Handler Access
71 // ========================================================================
72
75
80
83
85 const TileObjectHandler& tile_handler() const { return tile_handler_; }
86
87 // ========================================================================
88 // Unified Interaction Methods
89 // ========================================================================
90
97 bool HandleClick(int canvas_x, int canvas_y);
98 bool HandleMouseWheel(float delta);
99
100 void SelectEntity(EntityType type, size_t index);
101 void SetSelectedEntities(std::vector<SelectedEntity> entities);
103 bool HasEntitySelection() const;
104 bool NudgeSelected(int delta_x, int delta_y);
105 absl::Status CommitSelectionEdit(const DungeonSelectionEditRequest& request,
106 bool continuous = false);
107 std::vector<SelectedEntity> SelectedEntitiesForEdit() const;
108 int SelectionMoveStepPixels() const;
110 const absl::Status& selection_edit_status() const {
112 }
113 absl::Status ReportSelectionEditStatus(absl::Status status);
114 void CancelPlacement();
115 const std::vector<SelectedEntity>& GetSelectedEntities() const {
116 return selected_entities_;
117 }
118 void SelectEntitiesInRect(const std::tuple<int, int, int, int>& bounds,
119 bool additive, bool toggle);
120 void BeginSelectionDrag(ImVec2 start_pos);
121
122 // Doors/sprites/items only (tile objects are handled by ObjectSelection).
123 std::optional<SelectedEntity> GetEntityAtPosition(int canvas_x,
124 int canvas_y) const;
125 std::vector<SelectedEntity> GetEntitiesAtPosition(int canvas_x,
126 int canvas_y) const;
127
128 // Current selection (doors/sprites/items only). Returns {None,0} if none.
130
134 void HandleDrag(ImVec2 current_pos, ImVec2 delta);
135
139 void HandleRelease();
140
144 void DrawGhostPreviews();
145
150
158
159 // ========================================================================
160 // Entity Selection
161 // ========================================================================
162
169 bool TrySelectEntityAtCursor(int canvas_x, int canvas_y);
170
175
179 absl::Status DeleteSelectedEntity();
180
186
187 private:
191
196 std::vector<SelectedEntity> selected_entities_;
201 ImVec2 cycle_hud_screen_pos_{0.0f, 0.0f};
203 std::vector<SelectedEntity> cycle_last_hits_;
205 ImVec2 entity_group_drag_start_{0.0f, 0.0f};
206 ImVec2 entity_group_drag_current_{0.0f, 0.0f};
209
215 bool ApplySelection(SelectedEntity entity);
216 bool UpdateEntitySelection(SelectedEntity entity, bool additive, bool toggle);
217 bool IsSelectionHitSelected(SelectedEntity entity) const;
218 bool HasGroupDragSelection() const;
221 void HandleEntityGroupDrag(ImVec2 current_pos);
222 bool SameCycleTarget(int canvas_x, int canvas_y,
223 const std::vector<SelectedEntity>& hits) const;
225 std::optional<size_t> FindSelectedCycleIndex(
226 const std::vector<SelectedEntity>& hits) const;
229 std::string DescribeEntity(SelectedEntity entity) const;
230 std::string DescribeCycleHudEntity(SelectedEntity entity) const;
231};
232
233} // namespace editor
234} // namespace yaze
235
236#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
std::vector< SelectedEntity > SelectedEntitiesForEdit() const
absl::Status ReportSelectionEditStatus(absl::Status status)
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.
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
const absl::Status & selection_edit_status() const
absl::Status DeleteSelectedEntity()
Delete currently selected entity.
void SetMode(Mode mode)
Set interaction mode.
void ClearAllEntitySelections()
Clear all entity selections.
absl::Status CommitSelectionEdit(const DungeonSelectionEditRequest &request, bool continuous=false)
void DrawGhostPreviews()
Draw ghost previews for active placement mode.
bool SameCycleTarget(int canvas_x, int canvas_y, const std::vector< SelectedEntity > &hits) const
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.