9#include "imgui/imgui.h"
15using namespace dungeon_ui;
21 ImGui::Text(tr(
"Invalid room ID: %d"), room_id);
26 ImGui::Text(tr(
"ROM not loaded"));
36 frame_opts.
canvas_size = ImVec2(kDungeonRoomPixelSize, kDungeonRoomPixelSize);
37 const ImVec2 available = ImGui::GetContentRegionAvail();
39 ImVec2(std::max(1.0f, available.x), std::max(1.0f, available.y));
49 const float fit_scale =
50 std::max(0.001f, std::min(viewport_size.x, viewport_size.y) /
51 kDungeonRoomPixelSize);
65 constexpr float kTileSize = 8.0f;
66 const float tile_size = kTileSize * current_scale;
67 const ImVec2 centered(
68 (viewport_size.x - kDungeonRoomPixelSize * current_scale) * 0.5f,
69 (viewport_size.y - kDungeonRoomPixelSize * current_scale) * 0.5f);
70 const ImVec2 target(centered.x + std::clamp(tile_x, 0, 63) * tile_size,
71 centered.y + std::clamp(tile_y, 0, 63) * tile_size);
72 if (target.x < 0 || target.y < 0 ||
73 target.x + tile_size > viewport_size.x ||
74 target.y + tile_size > viewport_size.y) {
84 (viewport_size.y - room_size) * 0.5f));
89 auto& io = ImGui::GetIO();
90 if (canvas_rt.
hovered && (io.MouseWheel != 0 || io.MouseWheelH != 0)) {
95 const bool resize_object =
117 canvas_config.is_draggable =
false;
137 if (room.
rom() && room.
rom()->is_loaded()) {
162 auto& room = *room_ptr;
float room_viewport_last_scale_
void RefreshActiveRoomCanvasState(zelda3::Room &room, int room_id)
std::optional< std::pair< int, int > > pending_scroll_target_
CrumbleFloorView crumble_floor_view_
void set_custom_grid_size(int size)
void SyncCanvasConfigFromViewerState()
bool object_interaction_enabled_
zelda3::Room * PrepareActiveRoomForCanvasFrame(int room_id)
DungeonObjectInteraction object_interaction_
bool room_viewport_auto_fit_
void UpdateRoomCanvasViewport(ImVec2 viewport_size)
uint8_t current_entrance_blockset_
bool ValidateRoomCanvasRequest(int room_id)
gui::CanvasFrameOptions BuildRoomCanvasFrameOptions() const
DungeonRoomStore * rooms_
void DrawRoomHeader(zelda3::Room &room, int room_id)
void SyncViewerStateFromCanvasConfig()
MinecartTrackEditorPanel * minecart_track_panel_
void HandleRoomCanvasNavigation(gui::CanvasRuntime &canvas_rt)
std::vector< size_t > GetSelectedObjectIndices() const
InteractionCoordinator & entity_coordinator()
Get the interaction coordinator for entity handling.
void HandleScrollWheelResize()
zelda3::Room * TryEnsureRoom(int room_id)
bool IsPlacementActive() const
Check if any placement mode is active.
bool collision_stamping() const
bool canvas_editing() const
void set_scrolling(ImVec2 scroll)
auto global_scale() const
void ApplyConfigSnapshot(const CanvasConfig &snapshot)
void set_global_scale(float scale)
void SetShowBuiltinContextMenu(bool show)
CanvasConfig & GetConfig()
void ReloadGraphics(std::optional< uint8_t > entrance_blockset=std::nullopt)
uint8_t spriteset() const
uint8_t layout_id() const
Editors are the view controllers for the application.
constexpr int kNumberOfRooms
std::optional< ImVec2 > viewport_size
std::optional< float > grid_step