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,
|
||||
ImGuiColorEditFlags flags,
|
||||
const ImVec2& size_arg) {
|
||||
@@ -58,7 +62,7 @@ absl::Status DisplayPalette(gfx::SnesPalette& palette, bool loaded) {
|
||||
static ImVec4 saved_palette[32] = {};
|
||||
if (loaded && !init) {
|
||||
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].y = color.rgb().y / 255;
|
||||
saved_palette[n].z = color.rgb().z / 255;
|
||||
@@ -163,5 +167,102 @@ void SelectablePalettePipeline(uint64_t& palette_id, bool& refresh_graphics,
|
||||
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 yaze
|
||||
|
||||
Reference in New Issue
Block a user