Add color conversion utility and editable palette display functionality; implement color picker and context menu options for palette colors in the GUI.
This commit is contained in:
@@ -16,6 +16,10 @@ ImVec4 ConvertSnesColorToImVec4(const gfx::SnesColor& color) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gfx::SnesColor ConvertImVec4ToSnesColor(const ImVec4& color) {
|
||||||
|
return gfx::SnesColor(color.x, color.y, color.z);
|
||||||
|
}
|
||||||
|
|
||||||
IMGUI_API bool SnesColorButton(absl::string_view id, gfx::SnesColor& color,
|
IMGUI_API bool SnesColorButton(absl::string_view id, gfx::SnesColor& color,
|
||||||
ImGuiColorEditFlags flags,
|
ImGuiColorEditFlags flags,
|
||||||
const ImVec2& size_arg) {
|
const ImVec2& size_arg) {
|
||||||
@@ -58,7 +62,7 @@ absl::Status DisplayPalette(gfx::SnesPalette& palette, bool loaded) {
|
|||||||
static ImVec4 saved_palette[32] = {};
|
static ImVec4 saved_palette[32] = {};
|
||||||
if (loaded && !init) {
|
if (loaded && !init) {
|
||||||
for (int n = 0; n < palette.size(); n++) {
|
for (int n = 0; n < palette.size(); n++) {
|
||||||
ASSIGN_OR_RETURN(auto color, palette.GetColor(n));
|
auto color = palette[n];
|
||||||
saved_palette[n].x = color.rgb().x / 255;
|
saved_palette[n].x = color.rgb().x / 255;
|
||||||
saved_palette[n].y = color.rgb().y / 255;
|
saved_palette[n].y = color.rgb().y / 255;
|
||||||
saved_palette[n].z = color.rgb().z / 255;
|
saved_palette[n].z = color.rgb().z / 255;
|
||||||
@@ -163,5 +167,102 @@ void SelectablePalettePipeline(uint64_t& palette_id, bool& refresh_graphics,
|
|||||||
ImGui::EndChild();
|
ImGui::EndChild();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
absl::Status DisplayEditablePalette(gfx::SnesPalette& palette,
|
||||||
|
const std::string& title,
|
||||||
|
bool show_color_picker, int colors_per_row,
|
||||||
|
ImGuiColorEditFlags flags) {
|
||||||
|
// Default flags if none provided
|
||||||
|
if (flags == 0) {
|
||||||
|
flags = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker |
|
||||||
|
ImGuiColorEditFlags_NoTooltip;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display title if provided
|
||||||
|
if (!title.empty()) {
|
||||||
|
ImGui::Text("%s", title.c_str());
|
||||||
|
}
|
||||||
|
static int selected_color = 0;
|
||||||
|
|
||||||
|
if (show_color_picker) {
|
||||||
|
ImGui::Separator();
|
||||||
|
static ImVec4 current_color = ImVec4(0, 0, 0, 1.0f);
|
||||||
|
|
||||||
|
if (ImGui::ColorPicker4("Color Picker", (float*)¤t_color,
|
||||||
|
ImGuiColorEditFlags_NoSidePreview |
|
||||||
|
ImGuiColorEditFlags_NoSmallPreview)) {
|
||||||
|
// Convert the selected color to SNES format and add it to the palette
|
||||||
|
gfx::SnesColor snes_color(current_color);
|
||||||
|
palette.UpdateColor(selected_color, snes_color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display the palette colors in a grid
|
||||||
|
ImGui::BeginGroup(); // Lock X position
|
||||||
|
for (int n = 0; n < palette.size(); n++) {
|
||||||
|
ImGui::PushID(n);
|
||||||
|
if ((n % colors_per_row) != 0) {
|
||||||
|
ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a unique ID for this color button
|
||||||
|
std::string button_id = "##palette_" + std::to_string(n);
|
||||||
|
|
||||||
|
// Display the color button
|
||||||
|
if (SnesColorButton(button_id, palette[n], flags, ImVec2(20, 20))) {
|
||||||
|
// Color was clicked, could be used to select this color
|
||||||
|
selected_color = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::BeginPopupContextItem()) {
|
||||||
|
if (ImGui::MenuItem("Edit Color")) {
|
||||||
|
// Open color picker for this color
|
||||||
|
ImGui::OpenPopup(("Edit Color##" + std::to_string(n)).c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::MenuItem("Copy as SNES Value")) {
|
||||||
|
std::string clipboard = absl::StrFormat("$%04X", palette[n].snes());
|
||||||
|
ImGui::SetClipboardText(clipboard.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::MenuItem("Copy as RGB")) {
|
||||||
|
auto rgb = palette[n].rgb();
|
||||||
|
std::string clipboard =
|
||||||
|
absl::StrFormat("(%d,%d,%d)", (int)(rgb.x * 255),
|
||||||
|
(int)(rgb.y * 255), (int)(rgb.z * 255));
|
||||||
|
ImGui::SetClipboardText(clipboard.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::MenuItem("Copy as Hex")) {
|
||||||
|
auto rgb = palette[n].rgb();
|
||||||
|
std::string clipboard =
|
||||||
|
absl::StrFormat("#%02X%02X%02X", (int)(rgb.x * 255),
|
||||||
|
(int)(rgb.y * 255), (int)(rgb.z * 255));
|
||||||
|
ImGui::SetClipboardText(clipboard.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::EndPopup();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Color picker popup
|
||||||
|
if (ImGui::BeginPopup(("Edit Color##" + std::to_string(n)).c_str())) {
|
||||||
|
ImGuiColorEditFlags picker_flags = ImGuiColorEditFlags_NoSidePreview |
|
||||||
|
ImGuiColorEditFlags_NoSmallPreview;
|
||||||
|
|
||||||
|
ImVec4 color = ConvertSnesColorToImVec4(palette[n]);
|
||||||
|
if (ImGui::ColorPicker4("##picker", (float*)&color, picker_flags)) {
|
||||||
|
// Update the SNES color when the picker changes
|
||||||
|
palette[n] = ConvertImVec4ToSnesColor(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::EndPopup();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::PopID();
|
||||||
|
}
|
||||||
|
ImGui::EndGroup();
|
||||||
|
|
||||||
|
return absl::OkStatus();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace gui
|
} // namespace gui
|
||||||
} // namespace yaze
|
} // namespace yaze
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "absl/status/status.h"
|
#include "absl/status/status.h"
|
||||||
#include "absl/strings/str_format.h"
|
|
||||||
#include "app/gfx/snes_palette.h"
|
#include "app/gfx/snes_palette.h"
|
||||||
#include "imgui/imgui.h"
|
#include "imgui/imgui.h"
|
||||||
|
|
||||||
@@ -43,6 +42,9 @@ inline std::string ColorToHexString(const Color &color) {
|
|||||||
// normalized color values
|
// normalized color values
|
||||||
ImVec4 ConvertSnesColorToImVec4(const gfx::SnesColor &color);
|
ImVec4 ConvertSnesColorToImVec4(const gfx::SnesColor &color);
|
||||||
|
|
||||||
|
// A utility function to convert an ImVec4 to an SnesColor object
|
||||||
|
gfx::SnesColor ConvertImVec4ToSnesColor(const ImVec4 &color);
|
||||||
|
|
||||||
// The wrapper function for ImGui::ColorButton that takes a SnesColor reference
|
// The wrapper function for ImGui::ColorButton that takes a SnesColor reference
|
||||||
IMGUI_API bool SnesColorButton(absl::string_view id, gfx::SnesColor &color,
|
IMGUI_API bool SnesColorButton(absl::string_view id, gfx::SnesColor &color,
|
||||||
ImGuiColorEditFlags flags = 0,
|
ImGuiColorEditFlags flags = 0,
|
||||||
@@ -53,6 +55,12 @@ IMGUI_API bool SnesColorEdit4(absl::string_view label, gfx::SnesColor *color,
|
|||||||
|
|
||||||
absl::Status DisplayPalette(gfx::SnesPalette &palette, bool loaded);
|
absl::Status DisplayPalette(gfx::SnesPalette &palette, bool loaded);
|
||||||
|
|
||||||
|
absl::Status DisplayEditablePalette(gfx::SnesPalette &palette,
|
||||||
|
const std::string &title = "",
|
||||||
|
bool show_color_picker = false,
|
||||||
|
int colors_per_row = 8,
|
||||||
|
ImGuiColorEditFlags flags = 0);
|
||||||
|
|
||||||
void SelectablePalettePipeline(uint64_t &palette_id, bool &refresh_graphics,
|
void SelectablePalettePipeline(uint64_t &palette_id, bool &refresh_graphics,
|
||||||
gfx::SnesPalette &palette);
|
gfx::SnesPalette &palette);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user