41 ImGuiColorEditFlags flags,
42 const ImVec2& size_arg) {
47 bool pressed = ImGui::ColorButton(
id.data(), displayColor, flags, size_arg);
49 if (ImGui::IsItemHovered()) {
50 ImGui::BeginTooltip();
51 ImGui::Text(
"SNES: $%04X", color.
snes());
82 int* selected_index) {
83 bool selection_made =
false;
84 int colors_to_show = std::min(num_colors,
static_cast<int>(palette.
size()));
87 for (
int n = 0; n < colors_to_show; n++) {
89 if (n > 0 && (n % 8) != 0) {
90 ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y);
93 bool is_selected = selected_index && (*selected_index == n);
95 ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(1.0f, 1.0f, 0.0f, 1.0f));
96 ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 2.0f);
100 "##palettesel", palette[n],
101 ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker,
103 if (selected_index) {
105 selection_made =
true;
110 ImGui::PopStyleVar();
111 ImGui::PopStyleColor();
118 return selection_made;
122 const std::string& title,
123 ImGuiColorEditFlags flags) {
124 if (!title.empty()) {
125 ImGui::Text(
"%s", title.c_str());
128 static int selected_color = 0;
129 static ImVec4 current_color = ImVec4(0, 0, 0, 1.0f);
133 if (ImGui::ColorPicker4(
"##colorpicker", (
float*)¤t_color,
134 ImGuiColorEditFlags_NoSidePreview |
135 ImGuiColorEditFlags_NoSmallPreview)) {
144 for (
int n = 0; n < palette.
size(); n++) {
147 ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y);
151 flags = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker;
154 if (
SnesColorButton(
"##palettedit", palette[n], flags, ImVec2(20, 20))) {
160 if (ImGui::BeginPopupContextItem()) {
161 if (ImGui::MenuItem(
"Copy as SNES")) {
162 std::string clipboard = absl::StrFormat(
"$%04X", palette[n].snes());
163 ImGui::SetClipboardText(clipboard.c_str());
165 if (ImGui::MenuItem(
"Copy as RGB")) {
166 auto rgb = palette[n].rgb();
167 std::string clipboard =
168 absl::StrFormat(
"(%d,%d,%d)", (
int)rgb.x, (
int)rgb.y, (
int)rgb.z);
169 ImGui::SetClipboardText(clipboard.c_str());
171 if (ImGui::MenuItem(
"Copy as Hex")) {
172 auto rgb = palette[n].rgb();
173 std::string clipboard = absl::StrFormat(
"#%02X%02X%02X", (
int)rgb.x,
174 (
int)rgb.y, (
int)rgb.z);
175 ImGui::SetClipboardText(clipboard.c_str());
184 return absl::OkStatus();
189 ImGuiColorEditFlags flags) {
190 bool modified =
false;
192 if (ImGui::BeginPopup(popup_id)) {
193 static int selected_color = 0;
194 static ImVec4 current_color = ImVec4(0, 0, 0, 1.0f);
197 if (ImGui::ColorPicker4(
"##popuppicker", (
float*)¤t_color,
198 ImGuiColorEditFlags_NoSidePreview |
199 ImGuiColorEditFlags_NoSmallPreview)) {
209 for (
int n = 0; n < palette.
size() && n < 64;
213 ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y);
217 "##popuppal", palette[n],
218 ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker,
239 static ImVec4 color = ImVec4(0, 0, 0, 1.0f);
240 ImGuiColorEditFlags misc_flags = ImGuiColorEditFlags_AlphaPreview |
241 ImGuiColorEditFlags_NoDragDrop |
242 ImGuiColorEditFlags_NoOptions;
245 static ImVec4 saved_palette[32] = {};
246 const int max_colors = std::min<int>(
247 static_cast<int>(palette.
size()),
static_cast<int>(IM_ARRAYSIZE(saved_palette)));
249 for (
int n = 0; n < max_colors; n++) {
250 auto color = palette[n];
251 saved_palette[n].x = color.rgb().x / 255.0f;
252 saved_palette[n].y = color.rgb().y / 255.0f;
253 saved_palette[n].z = color.rgb().z / 255.0f;
254 saved_palette[n].w = 1.0f;
258 static ImVec4 backup_color;
259 ImGui::Text(
"Current ==>");
261 ImGui::Text(
"Previous");
265 ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf,
269 if (ImGui::ColorButton(
270 "##previous", backup_color,
271 ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf,
273 color = backup_color;
277 ImGui::Text(
"Palette");
278 for (
int n = 0; n < max_colors; n++) {
281 ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y);
283 ImGuiColorEditFlags palette_button_flags = ImGuiColorEditFlags_NoAlpha |
284 ImGuiColorEditFlags_NoPicker |
285 ImGuiColorEditFlags_NoTooltip;
286 if (ImGui::ColorButton(
"##palette", saved_palette[n], palette_button_flags,
288 color = ImVec4(saved_palette[n].x, saved_palette[n].y, saved_palette[n].z,
291 if (ImGui::BeginDragDropTarget()) {
292 if (
const ImGuiPayload* payload =
293 ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F))
294 memcpy((
float*)&saved_palette[n], payload->Data,
sizeof(
float) * 3);
295 if (
const ImGuiPayload* payload =
296 ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F))
297 memcpy((
float*)&saved_palette[n], payload->Data,
sizeof(
float) * 4);
298 ImGui::EndDragDropTarget();
306 ImGui::ColorPicker4(
"##picker", (
float*)&color,
307 misc_flags | ImGuiColorEditFlags_NoSidePreview |
308 ImGuiColorEditFlags_NoSmallPreview);
314 const auto palette_row_size = 7;
315 if (ImGuiID child_id = ImGui::GetID((
void*)(intptr_t)100);
316 ImGui::BeginChild(child_id, ImGui::GetContentRegionAvail(),
true,
317 ImGuiWindowFlags_AlwaysVerticalScrollbar)) {
319 ImGui::Text(
"Palette");
320 for (
int n = 0; n < palette.
size(); n++) {
322 if ((n % palette_row_size) != 0)
323 ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y);
326 bool is_selected = (palette_id == n / palette_row_size);
330 ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(1.0f, 1.0f, 0.0f, 1.0f));
331 ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 2.0f);
335 ImGuiColorEditFlags_NoAlpha |
336 ImGuiColorEditFlags_NoPicker |
337 ImGuiColorEditFlags_NoTooltip,
339 palette_id = n / palette_row_size;
340 refresh_graphics =
true;
344 ImGui::PopStyleColor();
345 ImGui::PopStyleVar();
356 const std::string& title,
357 bool show_color_picker,
int colors_per_row,
358 ImGuiColorEditFlags flags) {
361 flags = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker |
362 ImGuiColorEditFlags_NoTooltip;
366 if (!title.empty()) {
367 ImGui::Text(
"%s", title.c_str());
369 static int selected_color = 0;
371 if (show_color_picker) {
373 static ImVec4 current_color = ImVec4(0, 0, 0, 1.0f);
375 if (ImGui::ColorPicker4(
"Color Picker", (
float*)¤t_color,
376 ImGuiColorEditFlags_NoSidePreview |
377 ImGuiColorEditFlags_NoSmallPreview)) {
386 for (
int n = 0; n < palette.
size(); n++) {
388 if ((n % colors_per_row) != 0) {
389 ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y);
393 std::string button_id =
"##palette_" + std::to_string(n);
401 if (ImGui::BeginPopupContextItem()) {
402 if (ImGui::MenuItem(
"Edit Color")) {
404 ImGui::OpenPopup((
"Edit Color##" + std::to_string(n)).c_str());
407 if (ImGui::MenuItem(
"Copy as SNES Value")) {
408 std::string clipboard = absl::StrFormat(
"$%04X", palette[n].snes());
409 ImGui::SetClipboardText(clipboard.c_str());
412 if (ImGui::MenuItem(
"Copy as RGB")) {
413 auto rgb = palette[n].rgb();
415 std::string clipboard =
416 absl::StrFormat(
"(%d,%d,%d)", (
int)rgb.x, (
int)rgb.y, (
int)rgb.z);
417 ImGui::SetClipboardText(clipboard.c_str());
420 if (ImGui::MenuItem(
"Copy as Hex")) {
421 auto rgb = palette[n].rgb();
423 std::string clipboard = absl::StrFormat(
"#%02X%02X%02X", (
int)rgb.x,
424 (
int)rgb.y, (
int)rgb.z);
425 ImGui::SetClipboardText(clipboard.c_str());
432 if (ImGui::BeginPopup((
"Edit Color##" + std::to_string(n)).c_str())) {
433 ImGuiColorEditFlags picker_flags = ImGuiColorEditFlags_NoSidePreview |
434 ImGuiColorEditFlags_NoSmallPreview;
437 if (ImGui::ColorPicker4(
"##picker", (
float*)&color, picker_flags)) {
449 return absl::OkStatus();
453 bool is_selected,
bool is_modified,
455 ImGuiColorEditFlags flags) {
463 ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(1.0f, 0.8f, 0.0f, 1.0f));
464 ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 2.0f);
467 bool clicked = ImGui::ColorButton(
id, display_color, flags, size);
470 ImGui::PopStyleVar();
471 ImGui::PopStyleColor();
476 ImVec2 pos = ImGui::GetItemRectMin();
477 ImVec2 dot_pos = ImVec2(pos.x + size.x - 6, pos.y + 2);
478 ImGui::GetWindowDrawList()->AddCircleFilled(dot_pos, 3.0f,
479 IM_COL32(255, 128, 0, 255));
483 if (ImGui::IsItemHovered()) {
484 ImGui::BeginTooltip();
485 ImGui::Text(
"SNES: $%04X", color.
snes());
486 auto rgb = color.
rgb();
487 ImGui::Text(
"RGB: (%d, %d, %d)",
static_cast<int>(rgb.x),
488 static_cast<int>(rgb.y),
static_cast<int>(rgb.z));
490 ImGui::TextColored(ImVec4(1.0f, 0.6f, 0.0f, 1.0f),
"Modified");
IMGUI_API bool InlinePaletteSelector(gfx::SnesPalette &palette, int num_colors, int *selected_index)
Small inline palette selector - just color buttons for selection.
IMGUI_API bool PopupPaletteEditor(const char *popup_id, gfx::SnesPalette &palette, ImGuiColorEditFlags flags)
Popup palette editor - same as inline but in a popup.
IMGUI_API absl::Status InlinePaletteEditor(gfx::SnesPalette &palette, const std::string &title, ImGuiColorEditFlags flags)
Full inline palette editor with color picker and copy options.
IMGUI_API bool PaletteColorButton(const char *id, const gfx::SnesColor &color, bool is_selected, bool is_modified, const ImVec2 &size, ImGuiColorEditFlags flags)