1#ifndef YAZE_APP_EDITOR_DUNGEON_INTERACTION_BASE_ENTITY_HANDLER_H_
2#define YAZE_APP_EDITOR_DUNGEON_INTERACTION_BASE_ENTITY_HANDLER_H_
13#include "imgui/imgui.h"
89 virtual void HandleDrag(ImVec2 current_pos, ImVec2 delta) = 0;
130 int canvas_y)
const = 0;
136 if (ImGui::GetCurrentContext() ==
nullptr)
152 if (ImGui::GetCurrentContext() ==
nullptr)
161 if (ImGui::GetCurrentContext() ==
nullptr)
168 float alpha = std::min(1.0f, remaining / 0.4f);
170 ImU32 base_rgb = color & 0x00FFFFFFu;
171 ImU32 alpha_ch =
static_cast<ImU32
>(alpha * 255.0f) << 24;
172 ImU32 toast_color = base_rgb | alpha_ch;
175 ImDrawList* draw_list = ImGui::GetWindowDrawList();
177 draw_list->AddText(ImVec2(canvas_pos.x + 8.0f, canvas_pos.y + 6.0f),
230 if (ImGui::GetCurrentContext() ==
nullptr || !
ctx_ || !
ctx_->
canvas) {
235 const auto is_within_room = [&transform](ImVec2 screen_pos) {
236 const auto [room_x, room_y] =
242 const ImVec2 mouse_pos = ImGui::GetIO().MousePos;
243 if (is_within_room(mouse_pos)) {
257 if (is_within_room(touch.position)) {
258 return touch.position;
Abstract base class for entity interaction handlers.
virtual void HandleRelease()=0
Handle mouse release.
virtual bool IsPlacementActive() const =0
Check if placement mode is active.
virtual void BeginPlacement()=0
Begin placement mode.
InteractionContext * context() const
Get the interaction context.
std::optional< ImVec2 > GetPointerScreenPosition() const
virtual void HandleDrag(ImVec2 current_pos, ImVec2 delta)=0
Handle mouse drag.
virtual bool HandleClick(int canvas_x, int canvas_y)=0
Handle mouse click at canvas position.
virtual void DrawSelectionHighlight()=0
Draw selection highlight for selected entities.
virtual void DrawGhostPreview()=0
Draw ghost preview during placement.
DungeonCanvasTransform GetCanvasTransform() const
std::pair< int, int > CanvasToRoom(int canvas_x, int canvas_y) const
Convert canvas pixel coordinates to room tile coordinates.
void DrawSuccessToastOverlay(const char *msg, ImU32 color) const
void TriggerSuccessToast()
InteractionContext * ctx_
bool IsWithinBounds(int canvas_x, int canvas_y) const
Check if coordinates are within room bounds.
virtual void CancelPlacement()=0
Cancel current placement.
zelda3::Room * GetCurrentRoom() const
Get current room (convenience method)
void DrawPostPlacementToast()
virtual ~BaseEntityHandler()=default
bool HasValidContext() const
Check if context is valid.
virtual bool HandleMouseWheel(float delta)
std::pair< int, int > RoomToCanvas(int room_x, int room_y) const
Convert room tile coordinates to canvas pixel coordinates.
ImVec2 GetCanvasZeroPoint() const
Get canvas zero point (for screen coordinate conversion)
virtual std::optional< size_t > GetEntityAtPosition(int canvas_x, int canvas_y) const =0
Get entity at canvas position.
void SetContext(InteractionContext *ctx)
Set the interaction context.
static constexpr float kToastDuration
auto global_scale() const
bool IsMouseHovering() const
const AgentUITheme & GetTheme()
std::pair< int, int > RoomToCanvas(int room_x, int room_y)
Convert room tile coordinates to canvas pixel coordinates.
bool IsWithinBounds(int canvas_x, int canvas_y, int margin=0)
Check if coordinates are within room bounds.
std::pair< int, int > CanvasToRoom(int canvas_x, int canvas_y)
Convert canvas pixel coordinates to room tile coordinates.
Shared context for all interaction handlers.
bool IsValid() const
Check if context has required dependencies.
zelda3::Room * GetCurrentRoom() const
Get pointer to current room.