1#ifndef YAZE_APP_EDITOR_DUNGEON_INTERACTION_TILE_OBJECT_HANDLER_H
2#define YAZE_APP_EDITOR_DUNGEON_INTERACTION_TILE_OBJECT_HANDLER_H
9#include "absl/status/status.h"
59 bool HandleClick(
int canvas_x,
int canvas_y)
override;
60 void HandleDrag(ImVec2 current_pos, ImVec2 delta)
override;
67 void InitDrag(
const ImVec2& start_pos);
78 bool mouse_left_released,
bool shift_down,
79 bool toggle_down,
bool alt_down,
80 bool draw_box =
true);
83 int canvas_y)
const override;
89 bool MoveObjects(
int room_id,
const std::vector<size_t>& indices,
int delta_x,
90 int delta_y,
bool notify_mutation =
true);
97 const std::vector<size_t>& indices,
98 int delta_x,
int delta_y);
103 bool DeleteObjects(
int room_id, std::vector<size_t> indices);
113 void SendToFront(
int room_id,
const std::vector<size_t>& indices);
114 void SendToBack(
int room_id,
const std::vector<size_t>& indices);
115 void MoveForward(
int room_id,
const std::vector<size_t>& indices);
116 void MoveBackward(
int room_id,
const std::vector<size_t>& indices);
123 bool ResizeObjects(
int room_id,
const std::vector<size_t>& indices,
int delta,
124 bool horizontal =
false,
bool uniform =
false);
137 std::function<absl::Status(
int,
const std::vector<zelda3::RoomObject>&,
138 const std::vector<chest_data>&)>;
149 std::function<
void(
const absl::Status&)> callback) {
265 int room_id, std::vector<zelda3::RoomObject> candidate,
266 const std::vector<std::optional<size_t>>& sources,
267 const std::vector<std::optional<chest_data>>& chest_overrides = {},
268 std::optional<std::vector<size_t>> selection = std::nullopt);
283 void DrawSmartGuides(
const std::vector<zelda3::RoomObject>& objects)
const;
Abstract base class for entity interaction handlers.
void SetContext(InteractionContext *ctx)
Set the interaction context.
Handles functional mutations and queries for tile objects.
void SetPlacementCallback(std::function< void(const zelda3::RoomObject &)> callback)
absl::Status mutation_status_
bool DeleteObjects(int room_id, std::vector< size_t > indices)
Delete objects by indices.
zelda3::RoomObject preview_object_
void DrawGhostPreview() override
Draw ghost preview during placement.
void DrawSmartGuides(const std::vector< zelda3::RoomObject > &objects) const
void RefreshPreviewGraphics()
Refresh graphics without replacing the current placement geometry.
std::vector< zelda3::RoomObject > clipboard_
void SetObjectMutationPreflight(ObjectMutationPreflight callback)
bool was_placement_blocked() const
True if the most recent PlaceObjectAt was blocked.
bool ghost_preview_bitmap_ready_
void HandleMarqueeSelection(const ImVec2 &mouse_pos, bool mouse_left_down, bool mouse_left_released, bool shift_down, bool toggle_down, bool alt_down, bool draw_box=true)
void BeginPlacement() override
Begin placement mode.
bool HandleMouseWheel(float delta) override
std::unique_ptr< gfx::BackgroundBuffer > ghost_preview_buffer_
void ClearClipboard()
Clear the clipboard.
ObjectMutationPreflight object_mutation_preflight_
absl::Status clipboard_status_
bool HasClipboardData() const
Check if clipboard has data.
void UpdateObjectsSize(int room_id, const std::vector< size_t > &indices, uint8_t new_size)
bool MoveObjects(int room_id, const std::vector< size_t > &indices, int delta_x, int delta_y, bool notify_mutation=true)
Move a set of objects by a tile delta.
int ghost_preview_room_id_
PlacementPolicy GetPlacementPolicy() const
bool SetPreviewLayer(int layer)
void SendToFront(int room_id, const std::vector< size_t > &indices)
Reorder objects.
void RenderGhostPreviewBitmap()
void SetMutationErrorCallback(std::function< void(const absl::Status &)> callback)
const gfx::BackgroundBuffer * ghost_preview_buffer_for_testing() const
void clear_placement_blocked()
std::vector< std::optional< chest_data > > clipboard_chests_
bool SetPreviewSize(uint8_t size)
const zelda3::RoomObject & GetPreviewObject() const
void MoveBackward(int room_id, const std::vector< size_t > &indices)
bool CommitCandidate(int room_id, std::vector< zelda3::RoomObject > candidate, const std::vector< std::optional< size_t > > &sources, const std::vector< std::optional< chest_data > > &chest_overrides={}, std::optional< std::vector< size_t > > selection=std::nullopt)
ImVec2 ApplyDragModifiers(const ImVec2 &delta) const
void HandleRelease() override
Handle mouse release.
void CopyObjectsToClipboard(int room_id, const std::vector< size_t > &indices)
Copy objects to internal clipboard.
bool drag_has_duplicated_
uint64_t ghost_preview_graphics_revision_
void HandleDrag(ImVec2 current_pos, ImVec2 delta) override
Handle mouse drag.
std::vector< size_t > DuplicateObjects(int room_id, const std::vector< size_t > &indices, int delta_x, int delta_y)
Clone a set of objects and move them by a tile delta.
std::vector< size_t > PasteFromClipboardAt(int room_id, int target_x, int target_y)
Paste objects from clipboard at target location. Use first clipboard item as origin.
void SetBeforeObjectCommandCallback(std::function< void()> callback)
std::optional< std::pair< int, int > > drag_rejected_delta_
void DrawSelectionHighlight() override
Draw selection highlight for selected entities.
bool IsPlacementActive() const override
Check if placement mode is active.
bool UpdateObjectsLayer(int room_id, const std::vector< size_t > &indices, int new_layer)
PlacementPolicy placement_policy_
bool PlaceObjectAt(int room_id, const zelda3::RoomObject &object, int x, int y)
Place a new object. Returns false if blocked by ROM limits.
void SendToBack(int room_id, const std::vector< size_t > &indices)
std::vector< size_t > PasteFromClipboard(int room_id, int offset_x, int offset_y)
Paste objects from clipboard with offset.
bool HandleClick(int canvas_x, int canvas_y) override
Handle mouse click at canvas position.
std::function< void()> before_object_command_callback_
bool object_placement_mode_
void SetPreviewObject(const zelda3::RoomObject &object)
Set object for placement.
PlacementBlockReason placement_block_reason() const
void BeginMarqueeSelection(const ImVec2 &start_pos)
void MoveForward(int room_id, const std::vector< size_t > &indices)
bool RejectMutation(absl::Status status)
void CancelPlacement() override
Cancel current placement.
std::function< void(const zelda3::RoomObject &) placement_callback_)
bool ghost_preview_create_queued_
std::function< absl::Status(int, const std::vector< zelda3::RoomObject > &, const std::vector< chest_data > &)> ObjectMutationPreflight
PlacementBlockReason placement_block_reason_
bool DeleteAllObjects(int room_id)
Delete all objects in a room.
bool drag_mutation_started_
TileObjectHandler(InteractionContext *ctx)
static GhostPreviewGeometry CalculateGhostPreviewGeometry(const zelda3::RoomObject &object)
Resolve the render anchor and visual extent used by placement previews.
bool ResizeObjects(int room_id, const std::vector< size_t > &indices, int delta, bool horizontal=false, bool uniform=false)
Resize objects by a delta. Uniform changes both packed axes; otherwise horizontal selects packed-floo...
void UpdateObjectsId(int room_id, const std::vector< size_t > &indices, int16_t new_id)
const absl::Status & mutation_status() const
zelda3::Room * GetRoom(int room_id)
PlacementCapacityState GhostCapacityState
std::function< void(const absl::Status &) mutation_error_callback_)
void SetPlacementPolicy(PlacementPolicy policy)
void NotifyChange(zelda3::Room *room)
GhostCapacityState GetPlacementGhostCapacityState() const
std::optional< size_t > GetEntityAtPosition(int canvas_x, int canvas_y) const override
Get entity at canvas position.
void InitDrag(const ImVec2 &start_pos)
Editors are the view controllers for the application.
Shared context for all interaction handlers.
int render_anchor_x_tiles
int render_anchor_y_tiles