8#include "absl/status/status.h"
9#include "absl/strings/str_format.h"
24#include "imgui/imgui.h"
44 std::array<uint8_t, 0x200>& all_tiles_types) {
52 current_gfx_bmp, all_tiles_types));
84 return absl::OkStatus();
89 ImVector<std::string> labels;
90 labels.reserve(
static_cast<int>(types.size()));
91 for (
size_t i = 0; i < types.size(); ++i) {
100 ImVector<std::string> labels;
101 labels.reserve(0x200);
104 labels.push_back(label);
120 return absl::InvalidArgumentError(
"Blockset not initialized, open a ROM.");
125 TextDisabled(
"Collision labels unavailable for this map/layout.");
129 TextDisabled(
"Collision labels: static full-load sheet preview.");
133 if (Button(
"Edit Graphics")) {
139 ImGui::TextWrapped(
"Graphics edit unavailable: %s",
148 ImGui::TextWrapped(
"Tile16 edit failed: %s",
status_.message().data());
153 return absl::OkStatus();
183 return absl::FailedPreconditionError(
184 "Tile16 blockset bitmap not initialized");
191 if (result.selection_changed) {
194 util::logf(
"Selected Tile16 from blockset: %d", result.selected_tile);
200 return absl::OkStatus();
207 if (ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows) &&
208 !ImGui::IsAnyItemActive()) {
209 const ImGuiIO& io = ImGui::GetIO();
210#if defined(__APPLE__)
211 const bool platform_primary_held = io.KeyCtrl || io.KeySuper;
213 const bool platform_primary_held = io.KeyCtrl;
215 const bool ctrl_held = platform_primary_held ||
216 ImGui::IsKeyDown(ImGuiKey_LeftCtrl) ||
217 ImGui::IsKeyDown(ImGuiKey_RightCtrl);
220 if (ImGui::IsKeyPressed(ImGuiKey_Delete)) {
223 if (ImGui::IsKeyPressed(ImGuiKey_H) && !ctrl_held) {
226 if (ImGui::IsKeyPressed(ImGuiKey_V) && !ctrl_held) {
229 if (ImGui::IsKeyPressed(ImGuiKey_R) && !ctrl_held) {
232 if (ImGui::IsKeyPressed(ImGuiKey_F) && !ctrl_held) {
242 if (ImGui::IsKeyPressed(ImGuiKey_P)) {
245 if (ImGui::IsKeyPressed(ImGuiKey_I)) {
248 if (ImGui::IsKeyPressed(ImGuiKey_U)) {
254 if (ImGui::IsKeyPressed(ImGuiKey_Q)) {
257 if (ImGui::IsKeyPressed(ImGuiKey_E)) {
264 for (
int i = 0; i < 8; ++i) {
265 if (!ImGui::IsKeyPressed(
static_cast<ImGuiKey
>(ImGuiKey_1 + i))) {
287 if (ImGui::IsKeyPressed(ImGuiKey_C)) {
290 if (ImGui::IsKeyPressed(ImGuiKey_V)) {
306 left_click, right_click);
310 const ImVec2& display_position) {
313 {display_position.x, display_position.y});
314 return ImVec2(local.
x, local.
y);
326 for (
int y = 0; y < 8; ++y) {
327 for (
int x = 0; x < 8; ++x) {
335 return absl::OkStatus();
int current_tile8() const
gfx::Bitmap * tile16_blockset_bmp()
absl::Status HandleTile16CanvasClick(Tile16LocalPos tile_position, bool left_click, bool right_click)
int current_tile16() const
bool has_shared_history() const
void SetCollisionTypes(const std::array< uint8_t, 0x200 > &types)
absl::Status InitializeBitmaps(gfx::Bitmap &tile16_blockset_bmp, gfx::Bitmap ¤t_gfx_bmp, std::array< uint8_t, 0x200 > &all_tiles_types)
absl::Status PickTile8FromTile16(Tile16LocalPos position)
bool * mutable_show_tile_collision_ids()
void set_current_palette(int palette)
absl::Status DrawToCurrentTile16(Tile16LocalPos pos, const gfx::Bitmap *source_tile=nullptr)
bool collision_types_valid() const
void set_on_tile_selection_changed(std::function< void(int)> callback)
Optional: UI can sync blockset selector when current tile changes.
absl::Status LoadLayoutFromScratch(int slot)
void ClearCollisionTypes()
int active_quadrant() const
Tile16LayoutScratch & layout_scratch(int i)
bool * mutable_priority_tile()
std::vector< zelda3::Tile8PixelData > & mutable_current_gfx_individual()
bool show_tile_collision_ids() const
static Tile16LocalPos Tile16PreviewDisplayPixelToTilePosition(Tile16LocalPos display_position)
bool map_blockset_loaded() const
void set_active_quadrant(int quadrant)
void set_on_tile8_sheet_resized(std::function< void(float width, float height)> callback)
Optional: UI updates Tile8 source canvas size after LoadTile8.
void set_edit_mode(Tile16EditMode mode)
absl::Status LoadLayoutFromScratch(int slot)
static ImVec2 Tile16PreviewDisplayPixelToTilePosition(const ImVec2 &display_position)
absl::Status CyclePalette(bool forward=true)
absl::Status HandleTile16CanvasClick(const ImVec2 &tile_position, bool left_click, bool right_click)
absl::Status ClearTile16()
void HandleKeyboardShortcuts()
absl::Status FillTile16WithTile8(int tile8_id)
absl::Status PasteTile16FromClipboard()
gui::TileSelectorWidget blockset_selector_
absl::Status FlipTile16Horizontal()
absl::Status OpenGraphicsForActiveQuadrant()
absl::Status UpdateTile16Edit()
absl::Status UpdateBlockset()
std::array< std::string, 0x200 > collision_label_storage_
void SetCollisionTypes(const std::array< uint8_t, 0x200 > &types)
absl::Status UpdateAsPanel()
absl::Status graphics_open_status_
absl::Status RefreshAllPalettes()
void DrawPaletteSettings()
absl::Status RotateTile16()
gui::Canvas tile16_edit_canvas_
gui::Canvas blockset_canvas_
void ClearCollisionTypes()
gui::Canvas tile8_source_canvas_
void RequestTileSwitch(int target_tile_id)
absl::Status DrawToCurrentTile16(ImVec2 pos, const gfx::Bitmap *source_tile=nullptr)
absl::Status UpdateLivePreview()
absl::Status Initialize(gfx::Bitmap &tile16_blockset_bmp, gfx::Bitmap ¤t_gfx_bmp, std::array< uint8_t, 0x200 > &all_tiles_types)
absl::Status CopyTile16ToClipboard(int tile_id)
int selection_start_tile_
gui::Table tile_edit_table_
absl::Status FlipTile16Vertical()
Tile16EditSession session_
absl::Status PickTile8FromTile16(const ImVec2 &position)
std::vector< int > selected_tiles_
Represents a bitmap image optimized for SNES ROM hacking.
auto custom_labels_enabled()
void SetCanvasSize(ImVec2 canvas_size)
auto mutable_labels(int i)
void InitializePaletteEditor(Rom *rom)
void InitializeDefaults()
void SetAutoResize(bool auto_resize)
Tile16NumericShortcutResult ResolveTile16NumericShortcut(bool ctrl_held, int number_index)
void EndCanvas(Canvas &canvas)
void BeginCanvas(Canvas &canvas, ImVec2 child_size)
void AddTableColumn(Table &table, const std::string &label, GuiElement element)
void BeginChildWithScrollbar(const char *str_id)
std::string HexByte(uint8_t byte, HexStringParams params)
void logf(const absl::FormatSpec< Args... > &format, Args &&... args)
LayoutDialect DetectLayout(const Rom &rom)
constexpr int kNumTile16Individual
#define RETURN_IF_ERROR(expr)
std::array< std::array< int, 8 >, 8 > tile_layout
std::optional< int > quadrant_focus
std::optional< uint8_t > palette_id