diff --git a/src/app/editor/graphics/palette_editor.cc b/src/app/editor/graphics/palette_editor.cc index 0d42a452..51061aa2 100644 --- a/src/app/editor/graphics/palette_editor.cc +++ b/src/app/editor/graphics/palette_editor.cc @@ -85,6 +85,93 @@ static inline float color_saturate(float f) { 0.5f)) // Saturated, always output 0..255 } // namespace +absl::Status DisplayPalette(gfx::SnesPalette& palette, bool loaded) { + static ImVec4 color = ImVec4(0, 0, 0, 255.f); + static ImVec4 current_palette[256] = {}; + ImGuiColorEditFlags misc_flags = ImGuiColorEditFlags_AlphaPreview | + ImGuiColorEditFlags_NoDragDrop | + ImGuiColorEditFlags_NoOptions; + + // Generate a default palette. The palette will persist and can be edited. + static bool init = false; + if (loaded && !init) { + for (int n = 0; n < palette.size(); n++) { + ASSIGN_OR_RETURN(auto color, palette.GetColor(n)); + current_palette[n].x = color.rgb().x / 255; + current_palette[n].y = color.rgb().y / 255; + current_palette[n].z = color.rgb().z / 255; + current_palette[n].w = 255; // Alpha + } + init = true; + } + + static ImVec4 backup_color; + bool open_popup = ColorButton("MyColor##3b", color, misc_flags); + SameLine(0, GetStyle().ItemInnerSpacing.x); + open_popup |= Button("Palette"); + if (open_popup) { + OpenPopup("mypicker"); + backup_color = color; + } + + if (BeginPopup("mypicker")) { + TEXT_WITH_SEPARATOR("Current Overworld Palette"); + ColorPicker4("##picker", (float*)&color, + misc_flags | ImGuiColorEditFlags_NoSidePreview | + ImGuiColorEditFlags_NoSmallPreview); + SameLine(); + + BeginGroup(); // Lock X position + Text("Current ==>"); + SameLine(); + Text("Previous"); + + if (Button("Update Map Palette")) { + } + + ColorButton( + "##current", color, + ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, + ImVec2(60, 40)); + SameLine(); + + if (ColorButton( + "##previous", backup_color, + ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, + ImVec2(60, 40))) + color = backup_color; + + // List of Colors in Overworld Palette + Separator(); + Text("Palette"); + for (int n = 0; n < IM_ARRAYSIZE(current_palette); n++) { + PushID(n); + if ((n % 8) != 0) SameLine(0.0f, GetStyle().ItemSpacing.y); + + if (ColorButton("##palette", current_palette[n], kPalButtonFlags2, + ImVec2(20, 20))) + color = ImVec4(current_palette[n].x, current_palette[n].y, + current_palette[n].z, color.w); // Preserve alpha! + + if (BeginDragDropTarget()) { + if (const ImGuiPayload* payload = + AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F)) + memcpy((float*)¤t_palette[n], payload->Data, sizeof(float) * 3); + if (const ImGuiPayload* payload = + AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F)) + memcpy((float*)¤t_palette[n], payload->Data, sizeof(float) * 4); + EndDragDropTarget(); + } + + PopID(); + } + EndGroup(); + EndPopup(); + } + + return absl::OkStatus(); +} + absl::Status PaletteEditor::Update() { if (rom()->is_loaded()) { // Initialize the labels @@ -357,84 +444,6 @@ absl::Status PaletteEditor::HandleColorPopup(gfx::SnesPalette& palette, int i, return absl::OkStatus(); } -void PaletteEditor::DisplayPalette(gfx::SnesPalette& palette, bool loaded) { - static ImVec4 color = ImVec4(0, 0, 0, 255.f); - ImGuiColorEditFlags misc_flags = ImGuiColorEditFlags_AlphaPreview | - ImGuiColorEditFlags_NoDragDrop | - ImGuiColorEditFlags_NoOptions; - - // Generate a default palette. The palette will persist and can be edited. - static bool init = false; - if (loaded && !init) { - status_ = InitializeSavedPalette(palette); - init = true; - } - - static ImVec4 backup_color; - bool open_popup = ColorButton("MyColor##3b", color, misc_flags); - SameLine(0, GetStyle().ItemInnerSpacing.x); - open_popup |= Button("Palette"); - if (open_popup) { - OpenPopup("mypicker"); - backup_color = color; - } - - if (BeginPopup("mypicker")) { - TEXT_WITH_SEPARATOR("Current Overworld Palette"); - ColorPicker4("##picker", (float*)&color, - misc_flags | ImGuiColorEditFlags_NoSidePreview | - ImGuiColorEditFlags_NoSmallPreview); - SameLine(); - - BeginGroup(); // Lock X position - Text("Current ==>"); - SameLine(); - Text("Previous"); - - if (Button("Update Map Palette")) { - } - - ColorButton( - "##current", color, - ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, - ImVec2(60, 40)); - SameLine(); - - if (ColorButton( - "##previous", backup_color, - ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, - ImVec2(60, 40))) - color = backup_color; - - // List of Colors in Overworld Palette - Separator(); - Text("Palette"); - for (int n = 0; n < IM_ARRAYSIZE(saved_palette_); n++) { - PushID(n); - if ((n % 8) != 0) SameLine(0.0f, GetStyle().ItemSpacing.y); - - if (ColorButton("##palette", saved_palette_[n], kPalButtonFlags2, - ImVec2(20, 20))) - color = ImVec4(saved_palette_[n].x, saved_palette_[n].y, - saved_palette_[n].z, color.w); // Preserve alpha! - - if (BeginDragDropTarget()) { - if (const ImGuiPayload* payload = - AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F)) - memcpy((float*)&saved_palette_[n], payload->Data, sizeof(float) * 3); - if (const ImGuiPayload* payload = - AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F)) - memcpy((float*)&saved_palette_[n], payload->Data, sizeof(float) * 4); - EndDragDropTarget(); - } - - PopID(); - } - EndGroup(); - EndPopup(); - } -} - absl::Status PaletteEditor::EditColorInPalette(gfx::SnesPalette& palette, int index) { if (index >= palette.size()) { diff --git a/src/app/editor/graphics/palette_editor.h b/src/app/editor/graphics/palette_editor.h index 9ee54cb8..e42ff072 100644 --- a/src/app/editor/graphics/palette_editor.h +++ b/src/app/editor/graphics/palette_editor.h @@ -1,8 +1,6 @@ #ifndef YAZE_APP_EDITOR_PALETTE_EDITOR_H #define YAZE_APP_EDITOR_PALETTE_EDITOR_H -#include "imgui/imgui.h" - #include "absl/status/status.h" #include "app/editor/graphics/gfx_group_editor.h" #include "app/editor/utils/editor.h" @@ -10,6 +8,7 @@ #include "app/gui/canvas.h" #include "app/gui/icons.h" #include "app/rom.h" +#include "imgui/imgui.h" namespace yaze { namespace app { @@ -26,56 +25,51 @@ struct PaletteChange { class PaletteEditorHistory { public: - // Record a change in the palette editor - void RecordChange(const std::string& groupName, size_t paletteIndex, - size_t colorIndex, const gfx::SnesColor& originalColor, - const gfx::SnesColor& newColor) { - // Check size and remove the oldest if necessary - if (recentChanges.size() >= maxHistorySize) { - recentChanges.pop_front(); + void RecordChange(const std::string& group_name, size_t palette_index, + size_t color_index, const gfx::SnesColor& original_color, + const gfx::SnesColor& new_color) { + if (recent_changes_.size() >= kMaxHistorySize) { + recent_changes_.pop_front(); } - // Push the new change - recentChanges.push_back( - {groupName, paletteIndex, colorIndex, originalColor, newColor}); + recent_changes_.push_back( + {group_name, palette_index, color_index, original_color, new_color}); } - // Get recent changes for display in the palette editor - const std::deque& GetRecentChanges() const { - return recentChanges; - } - - // Restore the original color - gfx::SnesColor RestoreOriginalColor(const std::string& groupName, - size_t paletteIndex, - size_t colorIndex) const { - for (const auto& change : recentChanges) { - if (change.group_name == groupName && - change.palette_index == paletteIndex && - change.color_index == colorIndex) { + gfx::SnesColor RestoreOriginalColor(const std::string& group_name, + size_t palette_index, + size_t color_index) const { + for (const auto& change : recent_changes_) { + if (change.group_name == group_name && + change.palette_index == palette_index && + change.color_index == color_index) { return change.original_color; } } - // Handle error or return default (this is just an example, - // handle as appropriate for your application) return gfx::SnesColor(); } - auto size() const { return recentChanges.size(); } + auto size() const { return recent_changes_.size(); } gfx::SnesColor& GetModifiedColor(size_t index) { - return recentChanges[index].new_color; + return recent_changes_[index].new_color; } gfx::SnesColor& GetOriginalColor(size_t index) { - return recentChanges[index].original_color; + return recent_changes_[index].original_color; + } + + const std::deque& GetRecentChanges() const { + return recent_changes_; } private: - std::deque recentChanges; - static const size_t maxHistorySize = 50; // or any other number you deem fit + std::deque recent_changes_; + static const size_t kMaxHistorySize = 50; }; } // namespace palette_internal +absl::Status DisplayPalette(gfx::SnesPalette& palette, bool loaded); + /** * @class PaletteEditor * @brief Allows the user to view and edit in game palettes. @@ -101,7 +95,6 @@ class PaletteEditor : public SharedRom, public Editor { absl::Status EditColorInPalette(gfx::SnesPalette& palette, int index); absl::Status ResetColorToOriginal(gfx::SnesPalette& palette, int index, const gfx::SnesPalette& originalPalette); - void DisplayPalette(gfx::SnesPalette& palette, bool loaded); absl::Status DrawPaletteGroup(int category, bool right_side = false); void DrawCustomPalette(); @@ -110,16 +103,6 @@ class PaletteEditor : public SharedRom, public Editor { private: absl::Status HandleColorPopup(gfx::SnesPalette& palette, int i, int j, int n); - absl::Status InitializeSavedPalette(const gfx::SnesPalette& palette) { - for (int n = 0; n < palette.size(); n++) { - ASSIGN_OR_RETURN(auto color, palette.GetColor(n)); - saved_palette_[n].x = color.rgb().x / 255; - saved_palette_[n].y = color.rgb().y / 255; - saved_palette_[n].z = color.rgb().z / 255; - saved_palette_[n].w = 255; // Alpha - } - return absl::OkStatus(); - } absl::Status status_; gfx::SnesColor current_color_; diff --git a/src/app/editor/overworld/overworld_editor.cc b/src/app/editor/overworld/overworld_editor.cc index e4dcc126..5ce06099 100644 --- a/src/app/editor/overworld/overworld_editor.cc +++ b/src/app/editor/overworld/overworld_editor.cc @@ -205,7 +205,7 @@ void OverworldEditor::DrawToolset() { HOVER_HINT("Copy Map to Clipboard"); TableNextColumn(); // Palette - palette_editor_.DisplayPalette(palette_, overworld_.is_loaded()); + DisplayPalette(palette_, overworld_.is_loaded()); TEXT_COLUMN(ICON_MD_MORE_VERT) // Separator