24 ImGuiColorEditFlags flags,
25 const ImVec2& size_arg) {
30 bool pressed = ImGui::ColorButton(
id.data(), displayColor, flags, size_arg);
32 if (ImGui::IsItemHovered()) {
33 ImGui::BeginTooltip();
34 ImGui::Text(
"SNES: $%04X", color.
snes());
55 static ImVec4 color = ImVec4(0, 0, 0, 255.f);
56 ImGuiColorEditFlags misc_flags = ImGuiColorEditFlags_AlphaPreview |
57 ImGuiColorEditFlags_NoDragDrop |
58 ImGuiColorEditFlags_NoOptions;
61 static bool init =
false;
62 static ImVec4 saved_palette[32] = {};
63 if (loaded && !init) {
64 for (
int n = 0; n < palette.
size(); n++) {
65 auto color = palette[n];
66 saved_palette[n].x = color.rgb().x / 255;
67 saved_palette[n].y = color.rgb().y / 255;
68 saved_palette[n].z = color.rgb().z / 255;
69 saved_palette[n].w = 255;
74 static ImVec4 backup_color;
75 ImGui::Text(
"Current ==>");
77 ImGui::Text(
"Previous");
81 ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf,
85 if (ImGui::ColorButton(
86 "##previous", backup_color,
87 ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf,
93 ImGui::Text(
"Palette");
94 for (
int n = 0; n < IM_ARRAYSIZE(saved_palette); n++) {
96 if ((n % 4) != 0) ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y);
98 ImGuiColorEditFlags palette_button_flags = ImGuiColorEditFlags_NoAlpha |
99 ImGuiColorEditFlags_NoPicker |
100 ImGuiColorEditFlags_NoTooltip;
101 if (ImGui::ColorButton(
"##palette", saved_palette[n], palette_button_flags,
103 color = ImVec4(saved_palette[n].x, saved_palette[n].y, saved_palette[n].z,
106 if (ImGui::BeginDragDropTarget()) {
107 if (
const ImGuiPayload* payload =
108 ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F))
109 memcpy((
float*)&saved_palette[n], payload->Data,
sizeof(
float) * 3);
110 if (
const ImGuiPayload* payload =
111 ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F))
112 memcpy((
float*)&saved_palette[n], payload->Data,
sizeof(
float) * 4);
113 ImGui::EndDragDropTarget();
121 ImGui::ColorPicker4(
"##picker", (
float*)&color,
122 misc_flags | ImGuiColorEditFlags_NoSidePreview |
123 ImGuiColorEditFlags_NoSmallPreview);
124 return absl::OkStatus();
129 const auto palette_row_size = 7;
130 if (ImGuiID child_id = ImGui::GetID((
void*)(intptr_t)100);
131 ImGui::BeginChild(child_id, ImGui::GetContentRegionAvail(),
true,
132 ImGuiWindowFlags_AlwaysVerticalScrollbar)) {
134 ImGui::Text(
"Palette");
135 for (
int n = 0; n < palette.
size(); n++) {
137 if ((n % palette_row_size) != 0)
138 ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y);
141 bool is_selected = (palette_id == n / palette_row_size);
145 ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(1.0f, 1.0f, 0.0f, 1.0f));
146 ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 2.0f);
150 ImGuiColorEditFlags_NoAlpha |
151 ImGuiColorEditFlags_NoPicker |
152 ImGuiColorEditFlags_NoTooltip,
154 palette_id = n / palette_row_size;
155 refresh_graphics =
true;
159 ImGui::PopStyleColor();
160 ImGui::PopStyleVar();
171 const std::string& title,
172 bool show_color_picker,
int colors_per_row,
173 ImGuiColorEditFlags flags) {
176 flags = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker |
177 ImGuiColorEditFlags_NoTooltip;
181 if (!title.empty()) {
182 ImGui::Text(
"%s", title.c_str());
184 static int selected_color = 0;
186 if (show_color_picker) {
188 static ImVec4 current_color = ImVec4(0, 0, 0, 1.0f);
190 if (ImGui::ColorPicker4(
"Color Picker", (
float*)¤t_color,
191 ImGuiColorEditFlags_NoSidePreview |
192 ImGuiColorEditFlags_NoSmallPreview)) {
201 for (
int n = 0; n < palette.
size(); n++) {
203 if ((n % colors_per_row) != 0) {
204 ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y);
208 std::string button_id =
"##palette_" + std::to_string(n);
216 if (ImGui::BeginPopupContextItem()) {
217 if (ImGui::MenuItem(
"Edit Color")) {
219 ImGui::OpenPopup((
"Edit Color##" + std::to_string(n)).c_str());
222 if (ImGui::MenuItem(
"Copy as SNES Value")) {
223 std::string clipboard = absl::StrFormat(
"$%04X", palette[n].snes());
224 ImGui::SetClipboardText(clipboard.c_str());
227 if (ImGui::MenuItem(
"Copy as RGB")) {
228 auto rgb = palette[n].rgb();
229 std::string clipboard =
230 absl::StrFormat(
"(%d,%d,%d)", (
int)(rgb.x * 255),
231 (
int)(rgb.y * 255), (
int)(rgb.z * 255));
232 ImGui::SetClipboardText(clipboard.c_str());
235 if (ImGui::MenuItem(
"Copy as Hex")) {
236 auto rgb = palette[n].rgb();
237 std::string clipboard =
238 absl::StrFormat(
"#%02X%02X%02X", (
int)(rgb.x * 255),
239 (
int)(rgb.y * 255), (
int)(rgb.z * 255));
240 ImGui::SetClipboardText(clipboard.c_str());
247 if (ImGui::BeginPopup((
"Edit Color##" + std::to_string(n)).c_str())) {
248 ImGuiColorEditFlags picker_flags = ImGuiColorEditFlags_NoSidePreview |
249 ImGuiColorEditFlags_NoSmallPreview;
252 if (ImGui::ColorPicker4(
"##picker", (
float*)&color, picker_flags)) {
264 return absl::OkStatus();