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;
18struct DungeonSelectionEditPlan;
19
28 public:
32 enum class Mode {
33 Select, // Normal selection mode (no placement)
34 PlaceDoor, // Door placement mode
35 PlaceSprite, // Sprite placement mode
36 PlaceItem // Item placement mode
37 };
38
40
47
51 Mode GetCurrentMode() const { return current_mode_; }
52
58 void SetMode(Mode mode);
59
63 void CancelCurrentMode();
64
68 bool IsPlacementActive() const;
69
70 // ========================================================================
71 // Handler Access
72 // ========================================================================
73
76
81
84
86 const TileObjectHandler& tile_handler() const { return tile_handler_; }
87
88 // ========================================================================
89 // Unified Interaction Methods
90 // ========================================================================
91
98 bool HandleClick(int canvas_x, int canvas_y);
99 bool HandleMouseWheel(float delta);
100
101 void SelectEntity(EntityType type, size_t index);
102 void SetSelectedEntities(std::vector<SelectedEntity> entities);
104 bool HasEntitySelection() const;
105 bool NudgeSelected(int delta_x, int delta_y);
106 absl::Status CommitSelectionEdit(const DungeonSelectionEditRequest& request,
107 bool continuous = false);
108 absl::Status CompleteDoorTrim(size_t door_index);
109 std::vector<SelectedEntity> SelectedEntitiesForEdit() const;
110 int SelectionMoveStepPixels() const;
112 const absl::Status& selection_edit_status() const {
114 }
115 absl::Status ReportSelectionEditStatus(absl::Status status);
116 void CancelPlacement();
117 const std::vector<SelectedEntity>& GetSelectedEntities() const {
118 return selected_entities_;
119 }
120 void SelectEntitiesInRect(const std::tuple<int, int, int, int>& bounds,
121 bool additive, bool toggle);
122 void BeginSelectionDrag(ImVec2 start_pos);
123
124 // Doors/sprites/items only (tile objects are handled by ObjectSelection).
125 std::optional<SelectedEntity> GetEntityAtPosition(int canvas_x,
126 int canvas_y) const;
127 std::vector<SelectedEntity> GetEntitiesAtPosition(int canvas_x,
128 int canvas_y) const;
129
130 // Current selection (doors/sprites/items only). Returns {None,0} if none.
132
136 void HandleDrag(ImVec2 current_pos, ImVec2 delta);
137
141 void HandleRelease();
142
146 void DrawGhostPreviews();
147
152
160
161 // ========================================================================
162 // Entity Selection
163 // ========================================================================
164
171 bool TrySelectEntityAtCursor(int canvas_x, int canvas_y);
172
177
181 absl::Status DeleteSelectedEntity();
182
188
189 private:
191 bool continuous);
195
200 std::vector<SelectedEntity> selected_entities_;
205 ImVec2 cycle_hud_screen_pos_{0.0f, 0.0f};
207 std::vector<SelectedEntity> cycle_last_hits_;
209 ImVec2 entity_group_drag_start_{0.0f, 0.0f};
210 ImVec2 entity_group_drag_current_{0.0f, 0.0f};
213
219 bool ApplySelection(SelectedEntity entity);
220 bool UpdateEntitySelection(SelectedEntity entity, bool additive, bool toggle);
221 bool IsSelectionHitSelected(SelectedEntity entity) const;
222 bool HasGroupDragSelection() const;
225 void HandleEntityGroupDrag(ImVec2 current_pos);
226 bool SameCycleTarget(int canvas_x, int canvas_y,
227 const std::vector<SelectedEntity>& hits) const;
229 std::optional<size_t> FindSelectedCycleIndex(
230 const std::vector<SelectedEntity>& hits) const;
233 std::string DescribeEntity(SelectedEntity entity) const;
234 std::string DescribeCycleHudEntity(SelectedEntity entity) const;
235};
236
237} // namespace editor
238} // namespace yaze
239
240#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.
absl::Status CompleteDoorTrim(size_t door_index)
Mode GetSelectedEntityType() const
Get the type of currently selected entity.
absl::Status CommitPlannedSelectionEdit(const DungeonSelectionEditPlan &plan, bool continuous)
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.