44 if (!ImGui::Begin(
"ImPlot Style", show))
52 ImGui::TextUnformatted(
"Plot style: ");
56 LOG_DEBUG(
"ImPlot config file changed to: {}", path);
60 if (ImGui::Button(
"Save##ImPlotStyleToFile"))
63 if (std::filesystem::path inputPath{ path };
64 inputPath.is_relative())
66 filepath /= inputPath;
72 std::ofstream filestream(filepath);
74 if (!filestream.good())
76 LOG_ERROR(
"Could not save the ImPlot config file: {}", filepath.string());
81 j[
"implot"][
"style"] = ImPlot::GetStyle();
83 filestream << std::setw(4) << j << std::endl;
98 ImPlotStyle& style = ImPlot::GetStyle();
100 if (ImGui::BeginTabBar(
"##StyleEditor"))
102 if (ImGui::BeginTabItem(
"Variables"))
104 if (ImGui::BeginTable(
"ImPlotStyleEditorColors", 2, ImGuiTableFlags_SizingFixedFit, ImVec2(0.0F, 0.0F)))
106 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthStretch);
107 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthFixed, 55.0F);
109 auto revertButton = [](
auto& value,
auto refVal,
const char* id) {
112 ImGui::TableNextColumn();
113 if (ImGui::Button(fmt::format(
"Revert##ImPlotStyle.{}",
id).c_str()))
124 ImGui::TableNextRow();
125 ImGui::TableNextColumn();
126 ImGui::Text(
"Item Styling");
127 ImGui::TableNextRow();
128 ImGui::TableNextColumn();
129 if (ImGui::SliderFloat(
"LineWeight", &style.LineWeight, 0.0F, 5.0F,
"%.1F"))
137 ImGui::TableNextRow();
138 ImGui::TableNextColumn();
139 if (ImGui::SliderFloat(
"MarkerSize", &style.MarkerSize, 2.0F, 10.0F,
"%.1F"))
147 ImGui::TableNextRow();
148 ImGui::TableNextColumn();
149 if (ImGui::SliderFloat(
"MarkerWeight", &style.MarkerWeight, 0.0F, 5.0F,
"%.1F"))
157 ImGui::TableNextRow();
158 ImGui::TableNextColumn();
159 if (ImGui::SliderFloat(
"FillAlpha", &style.FillAlpha, 0.0F, 1.0F,
"%.2F"))
167 ImGui::TableNextRow();
168 ImGui::TableNextColumn();
169 if (ImGui::SliderFloat(
"ErrorBarSize", &style.ErrorBarSize, 0.0F, 10.0F,
"%.1F"))
177 ImGui::TableNextRow();
178 ImGui::TableNextColumn();
179 if (ImGui::SliderFloat(
"ErrorBarWeight", &style.ErrorBarWeight, 0.0F, 5.0F,
"%.1F"))
187 ImGui::TableNextRow();
188 ImGui::TableNextColumn();
189 if (ImGui::SliderFloat(
"DigitalBitHeight", &style.DigitalBitHeight, 0.0F, 20.0F,
"%.1F"))
197 ImGui::TableNextRow();
198 ImGui::TableNextColumn();
199 if (ImGui::SliderFloat(
"DigitalBitGap", &style.DigitalBitGap, 0.0F, 20.0F,
"%.1F"))
207 ImGui::TableNextRow();
208 ImGui::TableNextColumn();
209 ImGui::Text(
"Plot Styling");
210 ImGui::TableNextRow();
211 ImGui::TableNextColumn();
212 if (ImGui::SliderFloat(
"PlotBorderSize", &style.PlotBorderSize, 0.0F, 2.0F,
"%.0F"))
220 ImGui::TableNextRow();
221 ImGui::TableNextColumn();
222 if (ImGui::SliderFloat(
"MinorAlpha", &style.MinorAlpha, 0.0F, 1.0F,
"%.2F"))
230 ImGui::TableNextRow();
231 ImGui::TableNextColumn();
232 if (ImGui::SliderFloat2(
"MajorTickLen",
reinterpret_cast<float*
>(&style.MajorTickLen), 0.0F, 20.0F,
"%.0F"))
240 ImGui::TableNextRow();
241 ImGui::TableNextColumn();
242 if (ImGui::SliderFloat2(
"MinorTickLen",
reinterpret_cast<float*
>(&style.MinorTickLen), 0.0F, 20.0F,
"%.0F"))
250 ImGui::TableNextRow();
251 ImGui::TableNextColumn();
252 if (ImGui::SliderFloat2(
"MajorTickSize",
reinterpret_cast<float*
>(&style.MajorTickSize), 0.0F, 2.0F,
"%.1F"))
260 ImGui::TableNextRow();
261 ImGui::TableNextColumn();
262 if (ImGui::SliderFloat2(
"MinorTickSize",
reinterpret_cast<float*
>(&style.MinorTickSize), 0.0F, 2.0F,
"%.1F"))
270 ImGui::TableNextRow();
271 ImGui::TableNextColumn();
272 if (ImGui::SliderFloat2(
"MajorGridSize",
reinterpret_cast<float*
>(&style.MajorGridSize), 0.0F, 2.0F,
"%.1F"))
280 ImGui::TableNextRow();
281 ImGui::TableNextColumn();
282 if (ImGui::SliderFloat2(
"MinorGridSize",
reinterpret_cast<float*
>(&style.MinorGridSize), 0.0F, 2.0F,
"%.1F"))
290 ImGui::TableNextRow();
291 ImGui::TableNextColumn();
292 if (ImGui::SliderFloat2(
"PlotDefaultSize",
reinterpret_cast<float*
>(&style.PlotDefaultSize), 0.0F, 1000,
"%.0F"))
300 ImGui::TableNextRow();
301 ImGui::TableNextColumn();
302 if (ImGui::SliderFloat2(
"PlotMinSize",
reinterpret_cast<float*
>(&style.PlotMinSize), 0.0F, 300,
"%.0F"))
311 ImGui::TableNextRow();
312 ImGui::TableNextColumn();
313 ImGui::Text(
"Plot Padding");
314 ImGui::TableNextRow();
315 ImGui::TableNextColumn();
316 if (ImGui::SliderFloat2(
"PlotPadding",
reinterpret_cast<float*
>(&style.PlotPadding), 0.0F, 30.0F,
"%.0F"))
324 ImGui::TableNextRow();
325 ImGui::TableNextColumn();
326 if (ImGui::SliderFloat2(
"LabelPadding",
reinterpret_cast<float*
>(&style.LabelPadding), 0.0F, 20.0F,
"%.0F"))
334 ImGui::TableNextRow();
335 ImGui::TableNextColumn();
336 if (ImGui::SliderFloat2(
"LegendPadding",
reinterpret_cast<float*
>(&style.LegendPadding), 0.0F, 20.0F,
"%.0F"))
344 ImGui::TableNextRow();
345 ImGui::TableNextColumn();
346 if (ImGui::SliderFloat2(
"LegendInnerPadding",
reinterpret_cast<float*
>(&style.LegendInnerPadding), 0.0F, 10.0F,
"%.0F"))
354 ImGui::TableNextRow();
355 ImGui::TableNextColumn();
356 if (ImGui::SliderFloat2(
"LegendSpacing",
reinterpret_cast<float*
>(&style.LegendSpacing), 0.0F, 5.0F,
"%.0F"))
364 ImGui::TableNextRow();
365 ImGui::TableNextColumn();
366 if (ImGui::SliderFloat2(
"MousePosPadding",
reinterpret_cast<float*
>(&style.MousePosPadding), 0.0F, 20.0F,
"%.0F"))
374 ImGui::TableNextRow();
375 ImGui::TableNextColumn();
376 if (ImGui::SliderFloat2(
"AnnotationPadding",
reinterpret_cast<float*
>(&style.AnnotationPadding), 0.0F, 5.0F,
"%.0F"))
384 ImGui::TableNextRow();
385 ImGui::TableNextColumn();
386 if (ImGui::SliderFloat2(
"FitPadding",
reinterpret_cast<float*
>(&style.FitPadding), 0, 0.2F,
"%.2F"))
400 if (ImGui::BeginTabItem(
"Colors"))
402 static ImGuiTextFilter filter;
403 filter.Draw(
"Filter colors", ImGui::GetFontSize() * 16);
405 static ImGuiColorEditFlags alpha_flags = ImGuiColorEditFlags_AlphaPreviewHalf;
406 if (ImGui::RadioButton(
"Opaque", alpha_flags == ImGuiColorEditFlags_None))
408 alpha_flags = ImGuiColorEditFlags_None;
411 if (ImGui::RadioButton(
"Alpha", alpha_flags == ImGuiColorEditFlags_AlphaPreview))
413 alpha_flags = ImGuiColorEditFlags_AlphaPreview;
416 if (ImGui::RadioButton(
"Both", alpha_flags == ImGuiColorEditFlags_AlphaPreviewHalf))
418 alpha_flags = ImGuiColorEditFlags_AlphaPreviewHalf;
422 "Left-click on colored square to open color picker,\n"
423 "Right-click to open edit options menu.");
426 if (ImGui::BeginTable(
"ImPlotStyleEditorColors", 3, ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX, ImVec2(0.0F, 0.0F)))
428 for (
int i = 0; i < ImPlotCol_COUNT; i++)
430 const char* name = ImPlot::GetStyleColorName(i);
431 if (!filter.PassFilter(name))
436 ImGui::TableNextRow();
437 ImGui::TableNextColumn();
439 ImVec4 temp = ImPlot::GetStyleColorVec4(i);
440 const bool isColorAuto = ImPlot::IsColorAuto(i);
443 ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.25F);
445 if (ImGui::Button(
"Auto"))
449 style.Colors[i] = temp;
453 style.Colors[i] = IMPLOT_AUTO_COL;
455 ImPlot::BustItemCache();
463 ImGui::PopStyleVar();
465 ImGui::TableNextColumn();
466 if (ImGui::ColorEdit4(name, &temp.x, ImGuiColorEditFlags_NoInputs | alpha_flags))
468 style.Colors[i] = temp;
469 ImPlot::BustItemCache();
477 ImGui::TableNextColumn();
478 if (ImGui::Button(fmt::format(
"Revert##ImPlotStyleColor{}", i).c_str()))
481 ImPlot::BustItemCache();
496 if (ImGui::BeginTabItem(
"Colormaps"))
498 ImPlotContext& gp = *ImPlot::GetCurrentContext();
500 static std::vector<bool> showEditColormap(
static_cast<size_t>(gp.ColormapData.Count));
502 if (ImGui::BeginTable(
"ImPlotStyleEditorColormaps", 2, ImGuiTableFlags_SizingFixedFit))
504 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthFixed);
505 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthStretch);
508 for (
int i = 0; i < gp.ColormapData.Count; ++i)
510 ImGui::TableNextRow();
511 ImGui::TableNextColumn();
513 int size = gp.ColormapData.GetKeyCount(i);
514 bool selected = i == gp.Style.Colormap;
516 const char* name = ImPlot::GetColormapName(i);
519 ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.25F);
523 gp.Style.Colormap = i;
524 ImPlot::BustItemCache();
528 ImGui::PopStyleVar();
530 ImGui::TableNextColumn();
531 if (showEditColormap.at(
static_cast<size_t>(i)))
533 for (
int c = 0; c < size; ++c)
536 ImVec4 col4 = ImGui::ColorConvertU32ToFloat4(gp.ColormapData.GetKeyColor(i, c));
537 if (ImGui::ColorEdit4(
"", &col4.x, ImGuiColorEditFlags_NoInputs))
539 ImU32 col32 = ImGui::ColorConvertFloat4ToU32(col4);
540 gp.ColormapData.SetKeyColor(i, c, col32);
541 ImPlot::BustItemCache();
543 if ((c + 1) % 12 != 0 && c != size - 1)
550 ImGui::Dummy(ImVec2(10.0F, -1.0F));
552 if (ImGui::Button(
"x##ImPlotStyleEditorColormap close edit"))
554 showEditColormap.at(
static_cast<size_t>(i)) =
false;
559 if (ImPlot::ColormapButton(
"##", ImVec2(-1, 0), i))
561 showEditColormap.at(
static_cast<size_t>(i)) =
true;
571 static ImVector<ImVec4> custom;
572 if (custom.Size == 0)
574 custom.push_back(ImVec4(1, 0, 0, 1));
575 custom.push_back(ImVec4(0, 1, 0, 1));
576 custom.push_back(ImVec4(0, 0, 1, 1));
581 static std::string name =
"Custom";
583 if (ImGui::Button(
"+", ImVec2((100 - ImGui::GetStyle().ItemSpacing.x) / 2, 0)))
585 custom.push_back(ImVec4(0, 0, 0, 1));
588 if (ImGui::Button(
"-", ImVec2((100 - ImGui::GetStyle().ItemSpacing.x) / 2, 0)) && custom.Size > 2)
593 ImGui::InputText(
"##Name", &name, ImGuiInputTextFlags_CharsNoBlank);
594 static bool qual =
true;
595 ImGui::Checkbox(
"Qualitative", &qual);
596 if (ImGui::IsItemHovered())
598 ImGui::SetTooltip(
"Means, that the colors are separated into distinct levels.\n"
599 "If unchecked, a color gradient will be applied.");
602 if (ImGui::Button(
"Add", ImVec2(100, 0)) && gp.ColormapData.GetIndex(name.c_str()) == -1)
604 ImPlot::AddColormap(name.c_str(), custom.Data, custom.Size, qual);
605 showEditColormap.push_back(
false);
611 for (
int c = 0; c < custom.Size; ++c)
614 if (ImGui::ColorEdit4(
"##Col1", &custom[c].x, ImGuiColorEditFlags_NoInputs))
617 if ((c + 1) % 12 != 0)