Refactor palette_editor.cc and palette_editor.h for improved code organization and readability
This commit is contained in:
@@ -85,6 +85,93 @@ static inline float color_saturate(float f) {
|
|||||||
0.5f)) // Saturated, always output 0..255
|
0.5f)) // Saturated, always output 0..255
|
||||||
} // namespace
|
} // 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() {
|
absl::Status PaletteEditor::Update() {
|
||||||
if (rom()->is_loaded()) {
|
if (rom()->is_loaded()) {
|
||||||
// Initialize the labels
|
// Initialize the labels
|
||||||
@@ -357,84 +444,6 @@ absl::Status PaletteEditor::HandleColorPopup(gfx::SnesPalette& palette, int i,
|
|||||||
return absl::OkStatus();
|
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,
|
absl::Status PaletteEditor::EditColorInPalette(gfx::SnesPalette& palette,
|
||||||
int index) {
|
int index) {
|
||||||
if (index >= palette.size()) {
|
if (index >= palette.size()) {
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
#ifndef YAZE_APP_EDITOR_PALETTE_EDITOR_H
|
#ifndef YAZE_APP_EDITOR_PALETTE_EDITOR_H
|
||||||
#define YAZE_APP_EDITOR_PALETTE_EDITOR_H
|
#define YAZE_APP_EDITOR_PALETTE_EDITOR_H
|
||||||
|
|
||||||
#include "imgui/imgui.h"
|
|
||||||
|
|
||||||
#include "absl/status/status.h"
|
#include "absl/status/status.h"
|
||||||
#include "app/editor/graphics/gfx_group_editor.h"
|
#include "app/editor/graphics/gfx_group_editor.h"
|
||||||
#include "app/editor/utils/editor.h"
|
#include "app/editor/utils/editor.h"
|
||||||
@@ -10,6 +8,7 @@
|
|||||||
#include "app/gui/canvas.h"
|
#include "app/gui/canvas.h"
|
||||||
#include "app/gui/icons.h"
|
#include "app/gui/icons.h"
|
||||||
#include "app/rom.h"
|
#include "app/rom.h"
|
||||||
|
#include "imgui/imgui.h"
|
||||||
|
|
||||||
namespace yaze {
|
namespace yaze {
|
||||||
namespace app {
|
namespace app {
|
||||||
@@ -26,56 +25,51 @@ struct PaletteChange {
|
|||||||
|
|
||||||
class PaletteEditorHistory {
|
class PaletteEditorHistory {
|
||||||
public:
|
public:
|
||||||
// Record a change in the palette editor
|
void RecordChange(const std::string& group_name, size_t palette_index,
|
||||||
void RecordChange(const std::string& groupName, size_t paletteIndex,
|
size_t color_index, const gfx::SnesColor& original_color,
|
||||||
size_t colorIndex, const gfx::SnesColor& originalColor,
|
const gfx::SnesColor& new_color) {
|
||||||
const gfx::SnesColor& newColor) {
|
if (recent_changes_.size() >= kMaxHistorySize) {
|
||||||
// Check size and remove the oldest if necessary
|
recent_changes_.pop_front();
|
||||||
if (recentChanges.size() >= maxHistorySize) {
|
|
||||||
recentChanges.pop_front();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Push the new change
|
recent_changes_.push_back(
|
||||||
recentChanges.push_back(
|
{group_name, palette_index, color_index, original_color, new_color});
|
||||||
{groupName, paletteIndex, colorIndex, originalColor, newColor});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get recent changes for display in the palette editor
|
gfx::SnesColor RestoreOriginalColor(const std::string& group_name,
|
||||||
const std::deque<PaletteChange>& GetRecentChanges() const {
|
size_t palette_index,
|
||||||
return recentChanges;
|
size_t color_index) const {
|
||||||
}
|
for (const auto& change : recent_changes_) {
|
||||||
|
if (change.group_name == group_name &&
|
||||||
// Restore the original color
|
change.palette_index == palette_index &&
|
||||||
gfx::SnesColor RestoreOriginalColor(const std::string& groupName,
|
change.color_index == color_index) {
|
||||||
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) {
|
|
||||||
return change.original_color;
|
return change.original_color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Handle error or return default (this is just an example,
|
|
||||||
// handle as appropriate for your application)
|
|
||||||
return gfx::SnesColor();
|
return gfx::SnesColor();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto size() const { return recentChanges.size(); }
|
auto size() const { return recent_changes_.size(); }
|
||||||
|
|
||||||
gfx::SnesColor& GetModifiedColor(size_t index) {
|
gfx::SnesColor& GetModifiedColor(size_t index) {
|
||||||
return recentChanges[index].new_color;
|
return recent_changes_[index].new_color;
|
||||||
}
|
}
|
||||||
gfx::SnesColor& GetOriginalColor(size_t index) {
|
gfx::SnesColor& GetOriginalColor(size_t index) {
|
||||||
return recentChanges[index].original_color;
|
return recent_changes_[index].original_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::deque<PaletteChange>& GetRecentChanges() const {
|
||||||
|
return recent_changes_;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::deque<PaletteChange> recentChanges;
|
std::deque<PaletteChange> recent_changes_;
|
||||||
static const size_t maxHistorySize = 50; // or any other number you deem fit
|
static const size_t kMaxHistorySize = 50;
|
||||||
};
|
};
|
||||||
} // namespace palette_internal
|
} // namespace palette_internal
|
||||||
|
|
||||||
|
absl::Status DisplayPalette(gfx::SnesPalette& palette, bool loaded);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @class PaletteEditor
|
* @class PaletteEditor
|
||||||
* @brief Allows the user to view and edit in game palettes.
|
* @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 EditColorInPalette(gfx::SnesPalette& palette, int index);
|
||||||
absl::Status ResetColorToOriginal(gfx::SnesPalette& palette, int index,
|
absl::Status ResetColorToOriginal(gfx::SnesPalette& palette, int index,
|
||||||
const gfx::SnesPalette& originalPalette);
|
const gfx::SnesPalette& originalPalette);
|
||||||
void DisplayPalette(gfx::SnesPalette& palette, bool loaded);
|
|
||||||
absl::Status DrawPaletteGroup(int category, bool right_side = false);
|
absl::Status DrawPaletteGroup(int category, bool right_side = false);
|
||||||
|
|
||||||
void DrawCustomPalette();
|
void DrawCustomPalette();
|
||||||
@@ -110,16 +103,6 @@ class PaletteEditor : public SharedRom, public Editor {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
absl::Status HandleColorPopup(gfx::SnesPalette& palette, int i, int j, int n);
|
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_;
|
absl::Status status_;
|
||||||
gfx::SnesColor current_color_;
|
gfx::SnesColor current_color_;
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ void OverworldEditor::DrawToolset() {
|
|||||||
HOVER_HINT("Copy Map to Clipboard");
|
HOVER_HINT("Copy Map to Clipboard");
|
||||||
|
|
||||||
TableNextColumn(); // Palette
|
TableNextColumn(); // Palette
|
||||||
palette_editor_.DisplayPalette(palette_, overworld_.is_loaded());
|
DisplayPalette(palette_, overworld_.is_loaded());
|
||||||
|
|
||||||
TEXT_COLUMN(ICON_MD_MORE_VERT) // Separator
|
TEXT_COLUMN(ICON_MD_MORE_VERT) // Separator
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user