12#include "imgui/imgui.h"
20 const std::function<
void(
const CanvasConfig&)>& callback,
27 const std::function<
void(
const CanvasConfig&)>& callback,
37 std::string modal_id = canvas_id +
"_advanced_properties";
39 auto render_func = [=]()
mutable {
52 std::string modal_id = canvas_id +
"_scaling_controls";
54 auto render_func = [=]()
mutable {
66 std::string modal_id = canvas_id +
"_bpp_conversion";
68 auto render_func = [=]() {
77 std::string modal_id = canvas_id +
"_palette_editor";
79 auto render_func = [=]() {
88 std::string modal_id = canvas_id +
"_color_analysis";
90 auto render_func = [=]() {
99 std::string modal_id = canvas_id +
"_performance";
101 auto render_func = [=]() {
118 [](
const ModalState& modal) { return !modal.is_open; }),
124 [](
const ModalState& modal) { return modal.is_open; });
130 std::string modal_title =
"Advanced Canvas Properties";
131 ImGui::SetNextWindowSize(ImVec2(600, 500), ImGuiCond_FirstUseEver);
133 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
134 ImGuiWindowFlags_AlwaysAutoResize)) {
141 ImGuiTreeNodeFlags_DefaultOpen)) {
142 ImGui::Columns(2,
"CanvasInfo");
146 std::to_string(
static_cast<int>(config.
canvas_size.x)) +
" x " +
147 std::to_string(
static_cast<int>(config.
canvas_size.y)),
152 std::to_string(
static_cast<int>(config.
content_size.x)) +
" x " +
153 std::to_string(
static_cast<int>(config.
content_size.y)),
160 std::to_string(
static_cast<int>(config.
global_scale * 100)) +
"%",
165 std::to_string(
static_cast<int>(config.
grid_step)) +
"px",
172 if (ImGui::CollapsingHeader(
"👁️ View Settings",
173 ImGuiTreeNodeFlags_DefaultOpen)) {
190 ImGui::Checkbox(
"Draggable Canvas", &config.
is_draggable);
194 ImGui::Checkbox(
"Auto Resize for Tables", &config.
auto_resize);
201 ImGuiTreeNodeFlags_DefaultOpen)) {
203 0.1f, 10.0f,
"%.2f");
208 ImGui::Text(
"Preset Scales:");
211 const char* preset_labels[] = {
"0.25x",
"0.5x",
"1x",
"2x",
"4x",
"8x"};
212 const float preset_values[] = {0.25f, 0.5f, 1.0f, 2.0f, 4.0f, 8.0f};
214 for (
int i = 0; i < 6; ++i) {
217 if (ImGui::Button(preset_labels[i])) {
225 if (ImGui::CollapsingHeader(
"📜 Scrolling Controls")) {
226 ImGui::Text(
"Current Scroll: %.1f, %.1f", config.
scrolling.x,
229 if (ImGui::Button(
"Reset Scroll")) {
235 if (ImGui::Button(
"Center View") && bitmap) {
250 auto canvas_stats = profiler.GetStats(
"canvas_operations");
251 auto draw_stats = profiler.GetStats(
"canvas_draw");
254 std::to_string(canvas_stats.sample_count) +
" ops",
255 "speed", ImVec4(0.2F, 1.0F, 0.2F, 1.0F));
258 std::to_string(draw_stats.avg_time_us / 1000.0) +
" ms",
259 "timer", ImVec4(1.0F, 0.8F, 0.2F, 1.0F));
261 if (ImGui::Button(
"Open Performance Dashboard")) {
270 if (ImGui::Button(
"Apply Changes", ImVec2(120, 0))) {
272 ImGui::CloseCurrentPopup();
276 if (ImGui::Button(
"Cancel", ImVec2(120, 0))) {
277 ImGui::CloseCurrentPopup();
281 if (ImGui::Button(
"Reset to Defaults", ImVec2(150, 0))) {
301 std::string modal_title =
"Canvas Scaling Controls";
302 ImGui::SetNextWindowSize(ImVec2(500, 400), ImGuiCond_FirstUseEver);
304 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
305 ImGuiWindowFlags_AlwaysAutoResize)) {
316 ImGui::Text(
"Preset Scales:");
317 const char* preset_labels[] = {
"0.25x",
"0.5x",
"1x",
"2x",
"4x",
"8x"};
318 const float preset_values[] = {0.25f, 0.5f, 1.0f, 2.0f, 4.0f, 8.0f};
320 for (
int i = 0; i < 6; ++i) {
323 if (ImGui::Button(preset_labels[i])) {
332 ImGui::Text(
"Grid Step: %.1f", config.
grid_step);
337 ImGui::Text(
"Grid Presets:");
338 const char* grid_labels[] = {
"8x8",
"16x16",
"32x32",
"64x64"};
339 const float grid_values[] = {8.0f, 16.0f, 32.0f, 64.0f};
341 for (
int i = 0; i < 4; ++i) {
344 if (ImGui::Button(grid_labels[i])) {
353 ImGui::Text(
"Canvas Information");
354 ImGui::Text(
"Canvas Size: %.0f x %.0f", config.
canvas_size.x,
356 ImGui::Text(
"Scaled Size: %.0f x %.0f",
361 ImGui::Text(
"Bitmap Size: %d x %d", bitmap->
width(), bitmap->
height());
363 "Effective Scale: %.3f x %.3f",
372 if (ImGui::Button(
"Apply", ImVec2(120, 0))) {
374 ImGui::CloseCurrentPopup();
378 if (ImGui::Button(
"Cancel", ImVec2(120, 0))) {
379 ImGui::CloseCurrentPopup();
388 std::string modal_title =
"BPP Format Conversion";
389 ImGui::SetNextWindowSize(ImVec2(600, 500), ImGuiCond_FirstUseEver);
391 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
392 ImGuiWindowFlags_AlwaysAutoResize)) {
398 static std::unique_ptr<gui::BppFormatUI> bpp_ui =
399 std::make_unique<gui::BppFormatUI>(canvas_id +
"_bpp_ui");
411 if (ImGui::Button(
"Close", ImVec2(120, 0))) {
412 ImGui::CloseCurrentPopup();
421 std::string modal_title =
422 options.
title.empty() ?
"Palette Editor" : options.
title;
423 ImGui::SetNextWindowSize(ImVec2(800, 600), ImGuiCond_FirstUseEver);
425 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
426 ImGuiWindowFlags_AlwaysAutoResize)) {
432 static std::unique_ptr<gui::PaletteEditorWidget> palette_editor =
433 std::make_unique<gui::PaletteEditorWidget>();
436 palette_editor->ShowPaletteEditor(*options.
palette, modal_title);
443 if (ImGui::Button(
"Close", ImVec2(120, 0))) {
444 ImGui::CloseCurrentPopup();
453 std::string modal_title =
"Color Analysis";
454 ImGui::SetNextWindowSize(ImVec2(700, 500), ImGuiCond_FirstUseEver);
456 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
457 ImGuiWindowFlags_AlwaysAutoResize)) {
463 static std::unique_ptr<gui::PaletteEditorWidget> palette_editor =
464 std::make_unique<gui::PaletteEditorWidget>();
467 palette_editor->ShowColorAnalysis(*options.
bitmap, modal_title);
474 if (ImGui::Button(
"Close", ImVec2(120, 0))) {
475 ImGui::CloseCurrentPopup();
484 std::string modal_title =
"Canvas Performance";
485 ImGui::SetNextWindowSize(ImVec2(500, 300), ImGuiCond_FirstUseEver);
487 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
488 ImGuiWindowFlags_AlwaysAutoResize)) {
495 ImVec4(0.2f, 1.0f, 0.2f, 1.0f));
497 "timer", ImVec4(1.0f, 0.8f, 0.2f, 1.0f));
501 auto canvas_stats = profiler.GetStats(
"canvas_operations");
502 auto draw_stats = profiler.GetStats(
"canvas_draw");
505 std::to_string(canvas_stats.sample_count),
"functions",
506 ImVec4(0.2F, 0.8F, 1.0F, 1.0F));
508 std::to_string(draw_stats.avg_time_us / 1000.0) +
" ms",
509 "schedule", ImVec4(0.8F, 0.2F, 1.0F, 1.0F));
515 if (ImGui::Button(
"Open Dashboard", ImVec2(150, 0))) {
520 if (ImGui::Button(
"Close", ImVec2(120, 0))) {
521 ImGui::CloseCurrentPopup();
529 std::function<
void()> render_func) {
533 [&
id](
const ModalState& modal) { return modal.id == id; });
537 it->render_func = render_func;
543 ImGui::OpenPopup(
id.c_str());
549 [&
id](
const ModalState& modal) { return modal.id == id; });
559 [&
id](
const ModalState& modal) { return modal.id == id; });
565 const ImVec4& color) {
568 static std::unordered_map<std::string, const char*> icon_map = {
584 auto it = icon_map.find(icon_name);
585 if (it != icon_map.end()) {
586 ImGui::TextColored(color,
"%s", it->second);
591 const std::string& value,
592 const std::string& icon,
593 const ImVec4& color) {
597 ImGui::Text(
"%s %s", icon.c_str(), title.c_str());
600 ImGui::TextColored(color,
"%s", value.c_str());
606 const std::string& icon,
float* value,
607 float min_val,
float max_val,
608 const char* format) {
609 ImGui::Text(
"%s %s", icon.c_str(), label.c_str());
611 ImGui::SetNextItemWidth(200);
612 ImGui::SliderFloat((
"##" + label).c_str(), value, min_val, max_val, format);
Represents a bitmap image optimized for SNES ROM hacking.
void ShowAdvancedProperties(const std::string &canvas_id, const CanvasConfig &config, const gfx::Bitmap *bitmap=nullptr)
Show advanced canvas properties modal.
void ShowPaletteEditor(const std::string &canvas_id, const PaletteEditorOptions &options)
Show palette editor modal.
void RenderSliderWithIcon(const std::string &label, const std::string &icon, float *value, float min_val, float max_val, const char *format="%.2f")
void ShowPerformanceIntegration(const std::string &canvas_id, const PerformanceOptions &options)
Show performance dashboard integration.
std::vector< ModalState > active_modals_
void RenderMetricPanel(const std::string &title, const std::string &value, const std::string &icon, const ImVec4 &color=ImVec4(1, 1, 1, 1))
void RenderMaterialIcon(const std::string &icon_name, const ImVec4 &color=ImVec4(1, 1, 1, 1))
void RenderScalingControlsModal(const std::string &canvas_id, CanvasConfig &config, const gfx::Bitmap *bitmap)
void CloseModal(const std::string &id)
void Render()
Render all active modals.
void RenderPerformanceModal(const std::string &canvas_id, const PerformanceOptions &options)
void OpenModal(const std::string &id, std::function< void()> render_func)
void RenderAdvancedPropertiesModal(const std::string &canvas_id, CanvasConfig &config, const gfx::Bitmap *bitmap)
void RenderBppConversionModal(const std::string &canvas_id, const BppConversionOptions &options)
void RenderPaletteEditorModal(const std::string &canvas_id, const PaletteEditorOptions &options)
void ShowColorAnalysis(const std::string &canvas_id, const ColorAnalysisOptions &options)
Show color analysis modal.
void ShowBppConversionDialog(const std::string &canvas_id, const BppConversionOptions &options)
Show BPP format conversion dialog.
void RenderColorAnalysisModal(const std::string &canvas_id, const ColorAnalysisOptions &options)
void ShowScalingControls(const std::string &canvas_id, const CanvasConfig &config, const gfx::Bitmap *bitmap=nullptr)
Show scaling controls modal.
bool IsAnyModalOpen() const
Check if any modal is open.
bool IsModalOpen(const std::string &id) const
#define ICON_MD_FUNCTIONS
#define ICON_MD_FIT_SCREEN
#define ICON_MD_TRENDING_UP
#define ICON_MD_SWAP_HORIZ
#define ICON_MD_DRAG_INDICATOR
#define ICON_MD_STRAIGHTEN
#define ICON_MD_ANALYTICS
void DispatchConfig(const std::function< void(const CanvasConfig &)> &callback, const CanvasConfig &config)
void DispatchScale(const std::function< void(const CanvasConfig &)> &callback, const CanvasConfig &config)
std::function< void(gfx::BppFormat)> on_convert
const gfx::Bitmap * bitmap
const gfx::SnesPalette * palette
Unified configuration for canvas display and interaction.
std::function< void(const CanvasConfig &) on_config_changed)
std::function< void(const CanvasConfig &) on_scale_changed)
bool enable_custom_labels
const gfx::Bitmap * bitmap
gfx::SnesPalette * palette