8#include "absl/status/status.h"
9#include "absl/strings/str_format.h"
24#include "imgui/imgui.h"
43 std::array<uint8_t, 0x200>& all_tiles_types) {
51 current_gfx_bmp, all_tiles_types));
67 ImVector<std::string> tile16_names;
68 for (
int i = 0; i < 0x200; ++i) {
70 tile16_names.push_back(str);
88 return absl::OkStatus();
102 return absl::InvalidArgumentError(
"Blockset not initialized, open a ROM.");
107 OpenPopup(
"##Tile16EditorContextMenu");
110 TextDisabled(tr(
"Right-click for more options"));
112 if (Button(
"Edit Graphics")) {
118 ImGui::TextWrapped(
"Graphics edit unavailable: %s",
126 if (BeginPopupModal(
"About Tile16 Editor", NULL,
127 ImGuiWindowFlags_AlwaysAutoResize)) {
128 Text(tr(
"Tile16 Editor for Link to the Past"));
129 Text(tr(
"This editor allows you to edit 16x16 tiles used in the game."));
130 Text(tr(
"Features:"));
132 tr(
"Edit Tile16 graphics by placing 8x8 tiles in the quadrants"));
133 BulletText(tr(
"Copy and paste Tile16 graphics"));
134 BulletText(tr(
"Save and load Tile16 graphics to/from scratch space"));
135 BulletText(tr(
"Preview Tile16 graphics at a larger size"));
137 if (Button(tr(
"Close"))) {
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
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)
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)
int active_quadrant() const
Tile16LayoutScratch & layout_scratch(int i)
bool * mutable_priority_tile()
std::vector< zelda3::Tile8PixelData > & mutable_current_gfx_individual()
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()
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_
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)
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
std::optional< float > grid_step