13#include "imgui/imgui.h"
21 const std::function<
void(
const CanvasConfig&)>& callback,
28 const std::function<
void(
const CanvasConfig&)>& callback,
38 std::string modal_id = canvas_id +
"_advanced_properties";
40 auto render_func = [=]()
mutable {
53 std::string modal_id = canvas_id +
"_scaling_controls";
55 auto render_func = [=]()
mutable {
67 std::string modal_id = canvas_id +
"_bpp_conversion";
69 auto render_func = [=]() {
78 std::string modal_id = canvas_id +
"_palette_editor";
80 auto render_func = [=]() {
89 std::string modal_id = canvas_id +
"_color_analysis";
91 auto render_func = [=]() {
100 std::string modal_id = canvas_id +
"_performance";
102 auto render_func = [=]() {
119 [](
const ModalState& modal) { return !modal.is_open; }),
125 [](
const ModalState& modal) { return modal.is_open; });
131 std::string modal_title =
"Advanced Canvas Properties";
132 ImGui::SetNextWindowSize(ImVec2(600, 500), ImGuiCond_FirstUseEver);
134 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
135 ImGuiWindowFlags_AlwaysAutoResize)) {
142 ImGuiTreeNodeFlags_DefaultOpen)) {
143 ImGui::Columns(2,
"CanvasInfo");
147 std::to_string(
static_cast<int>(config.
canvas_size.x)) +
" x " +
148 std::to_string(
static_cast<int>(config.
canvas_size.y)),
153 std::to_string(
static_cast<int>(config.
content_size.x)) +
" x " +
154 std::to_string(
static_cast<int>(config.
content_size.y)),
161 std::to_string(
static_cast<int>(config.
global_scale * 100)) +
"%",
166 std::to_string(
static_cast<int>(config.
grid_step)) +
"px",
173 if (ImGui::CollapsingHeader(tr(
"👁️ View Settings"),
174 ImGuiTreeNodeFlags_DefaultOpen)) {
175 ImGui::Checkbox(tr(
"Show Grid"), &config.
enable_grid);
191 ImGui::Checkbox(tr(
"Draggable Canvas"), &config.
is_draggable);
195 ImGui::Checkbox(tr(
"Auto Resize for Tables"), &config.
auto_resize);
202 ImGuiTreeNodeFlags_DefaultOpen)) {
204 0.1f, 10.0f,
"%.2f");
209 ImGui::Text(tr(
"Preset Scales:"));
212 const char* preset_labels[] = {
"0.25x",
"0.5x",
"1x",
"2x",
"4x",
"8x"};
213 const float preset_values[] = {0.25f, 0.5f, 1.0f, 2.0f, 4.0f, 8.0f};
215 for (
int i = 0; i < 6; ++i) {
218 if (ImGui::Button(preset_labels[i])) {
226 if (ImGui::CollapsingHeader(tr(
"📜 Scrolling Controls"))) {
227 ImGui::Text(tr(
"Current Scroll: %.1f, %.1f"), config.
scrolling.x,
230 if (ImGui::Button(tr(
"Reset Scroll"))) {
236 if (ImGui::Button(tr(
"Center View")) && bitmap) {
251 auto canvas_stats = profiler.GetStats(
"canvas_operations");
252 auto draw_stats = profiler.GetStats(
"canvas_draw");
255 std::to_string(canvas_stats.sample_count) +
" ops",
256 "speed", ImVec4(0.2F, 1.0F, 0.2F, 1.0F));
259 std::to_string(draw_stats.avg_time_us / 1000.0) +
" ms",
260 "timer", ImVec4(1.0F, 0.8F, 0.2F, 1.0F));
262 if (ImGui::Button(tr(
"Open Performance Dashboard"))) {
271 if (ImGui::Button(tr(
"Apply Changes"), ImVec2(120, 0))) {
273 ImGui::CloseCurrentPopup();
277 if (ImGui::Button(tr(
"Cancel"), ImVec2(120, 0))) {
278 ImGui::CloseCurrentPopup();
282 if (ImGui::Button(tr(
"Reset to Defaults"), ImVec2(150, 0))) {
302 std::string modal_title =
"Canvas Scaling Controls";
303 ImGui::SetNextWindowSize(ImVec2(500, 400), ImGuiCond_FirstUseEver);
305 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
306 ImGuiWindowFlags_AlwaysAutoResize)) {
312 ImGui::Text(tr(
"Global Scale: %.3f"), config.
global_scale);
317 ImGui::Text(tr(
"Preset Scales:"));
318 const char* preset_labels[] = {
"0.25x",
"0.5x",
"1x",
"2x",
"4x",
"8x"};
319 const float preset_values[] = {0.25f, 0.5f, 1.0f, 2.0f, 4.0f, 8.0f};
321 for (
int i = 0; i < 6; ++i) {
324 if (ImGui::Button(preset_labels[i])) {
333 ImGui::Text(tr(
"Grid Step: %.1f"), config.
grid_step);
338 ImGui::Text(tr(
"Grid Presets:"));
339 const char* grid_labels[] = {
"8x8",
"16x16",
"32x32",
"64x64"};
340 const float grid_values[] = {8.0f, 16.0f, 32.0f, 64.0f};
342 for (
int i = 0; i < 4; ++i) {
345 if (ImGui::Button(grid_labels[i])) {
354 ImGui::Text(tr(
"Canvas Information"));
355 ImGui::Text(tr(
"Canvas Size: %.0f x %.0f"), config.
canvas_size.x,
357 ImGui::Text(tr(
"Scaled Size: %.0f x %.0f"),
362 ImGui::Text(tr(
"Bitmap Size: %d x %d"), bitmap->
width(),
365 tr(
"Effective Scale: %.3f x %.3f"),
374 if (ImGui::Button(tr(
"Apply"), ImVec2(120, 0))) {
376 ImGui::CloseCurrentPopup();
380 if (ImGui::Button(tr(
"Cancel"), ImVec2(120, 0))) {
381 ImGui::CloseCurrentPopup();
390 std::string modal_title =
"BPP Format Conversion";
391 ImGui::SetNextWindowSize(ImVec2(600, 500), ImGuiCond_FirstUseEver);
393 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
394 ImGuiWindowFlags_AlwaysAutoResize)) {
400 static std::unique_ptr<gui::BppFormatUI> bpp_ui =
401 std::make_unique<gui::BppFormatUI>(canvas_id +
"_bpp_ui");
413 if (ImGui::Button(tr(
"Close"), ImVec2(120, 0))) {
414 ImGui::CloseCurrentPopup();
423 std::string modal_title =
424 options.
title.empty() ?
"Palette Editor" : options.
title;
425 ImGui::SetNextWindowSize(ImVec2(800, 600), ImGuiCond_FirstUseEver);
427 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
428 ImGuiWindowFlags_AlwaysAutoResize)) {
434 static std::unique_ptr<gui::PaletteEditorWidget> palette_editor =
435 std::make_unique<gui::PaletteEditorWidget>();
438 palette_editor->ShowPaletteEditor(*options.
palette, modal_title);
445 if (ImGui::Button(tr(
"Close"), ImVec2(120, 0))) {
446 ImGui::CloseCurrentPopup();
455 std::string modal_title =
"Color Analysis";
456 ImGui::SetNextWindowSize(ImVec2(700, 500), ImGuiCond_FirstUseEver);
458 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
459 ImGuiWindowFlags_AlwaysAutoResize)) {
465 static std::unique_ptr<gui::PaletteEditorWidget> palette_editor =
466 std::make_unique<gui::PaletteEditorWidget>();
469 palette_editor->ShowColorAnalysis(*options.
bitmap, modal_title);
476 if (ImGui::Button(tr(
"Close"), ImVec2(120, 0))) {
477 ImGui::CloseCurrentPopup();
486 std::string modal_title =
"Canvas Performance";
487 ImGui::SetNextWindowSize(ImVec2(500, 300), ImGuiCond_FirstUseEver);
489 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
490 ImGuiWindowFlags_AlwaysAutoResize)) {
497 ImVec4(0.2f, 1.0f, 0.2f, 1.0f));
499 "timer", ImVec4(1.0f, 0.8f, 0.2f, 1.0f));
503 auto canvas_stats = profiler.GetStats(
"canvas_operations");
504 auto draw_stats = profiler.GetStats(
"canvas_draw");
507 std::to_string(canvas_stats.sample_count),
"functions",
508 ImVec4(0.2F, 0.8F, 1.0F, 1.0F));
510 std::to_string(draw_stats.avg_time_us / 1000.0) +
" ms",
511 "schedule", ImVec4(0.8F, 0.2F, 1.0F, 1.0F));
517 if (ImGui::Button(tr(
"Open Dashboard"), ImVec2(150, 0))) {
522 if (ImGui::Button(tr(
"Close"), ImVec2(120, 0))) {
523 ImGui::CloseCurrentPopup();
531 std::function<
void()> render_func) {
535 [&
id](
const ModalState& modal) { return modal.id == id; });
539 it->render_func = render_func;
545 ImGui::OpenPopup(
id.c_str());
551 [&
id](
const ModalState& modal) { return modal.id == id; });
561 [&
id](
const ModalState& modal) { return modal.id == id; });
567 const ImVec4& color) {
570 static std::unordered_map<std::string, const char*> icon_map = {
586 auto it = icon_map.find(icon_name);
587 if (it != icon_map.end()) {
588 ImGui::TextColored(color,
"%s", it->second);
593 const std::string& value,
594 const std::string& icon,
595 const ImVec4& color) {
599 ImGui::Text(
"%s %s", icon.c_str(), title.c_str());
602 ImGui::TextColored(color,
"%s", value.c_str());
608 const std::string& icon,
float* value,
609 float min_val,
float max_val,
610 const char* format) {
611 ImGui::Text(
"%s %s", icon.c_str(), label.c_str());
613 ImGui::SetNextItemWidth(200);
614 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