12#include "imgui/imgui.h"
38 std::string modal_id = canvas_id +
"_advanced_properties";
40 auto render_func = [=]()
mutable {
54 std::string modal_id = canvas_id +
"_scaling_controls";
56 auto render_func = [=]()
mutable {
69 std::string modal_id = canvas_id +
"_bpp_conversion";
71 auto render_func = [=]() {
81 std::string modal_id = canvas_id +
"_palette_editor";
83 auto render_func = [=]() {
93 std::string modal_id = canvas_id +
"_color_analysis";
95 auto render_func = [=]() {
105 std::string modal_id = canvas_id +
"_performance";
107 auto render_func = [=]() {
124 [](
const ModalState& modal) { return !modal.is_open; }),
130 [](
const ModalState& modal) { return modal.is_open; });
137 std::string modal_title =
"Advanced Canvas Properties";
138 ImGui::SetNextWindowSize(ImVec2(600, 500), ImGuiCond_FirstUseEver);
140 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
141 ImGuiWindowFlags_AlwaysAutoResize)) {
148 if (ImGui::CollapsingHeader(
ICON_MD_ANALYTICS " Canvas Information", ImGuiTreeNodeFlags_DefaultOpen)) {
149 ImGui::Columns(2,
"CanvasInfo");
152 std::to_string(
static_cast<int>(config.
canvas_size.x)) +
" x " +
153 std::to_string(
static_cast<int>(config.
canvas_size.y)),
157 std::to_string(
static_cast<int>(config.
content_size.x)) +
" x " +
158 std::to_string(
static_cast<int>(config.
content_size.y)),
164 std::to_string(
static_cast<int>(config.
global_scale * 100)) +
"%",
168 std::to_string(
static_cast<int>(config.
grid_step)) +
"px",
175 if (ImGui::CollapsingHeader(
"👁️ View Settings", ImGuiTreeNodeFlags_DefaultOpen)) {
192 ImGui::Checkbox(
"Draggable Canvas", &config.
is_draggable);
196 ImGui::Checkbox(
"Auto Resize for Tables", &config.
auto_resize);
202 if (ImGui::CollapsingHeader(
ICON_MD_BUILD " Scale Controls", ImGuiTreeNodeFlags_DefaultOpen)) {
207 ImGui::Text(
"Preset Scales:");
210 const char* preset_labels[] = {
"0.25x",
"0.5x",
"1x",
"2x",
"4x",
"8x"};
211 const float preset_values[] = {0.25f, 0.5f, 1.0f, 2.0f, 4.0f, 8.0f};
213 for (
int i = 0; i < 6; ++i) {
214 if (i > 0) ImGui::SameLine();
215 if (ImGui::Button(preset_labels[i])) {
223 if (ImGui::CollapsingHeader(
"📜 Scrolling Controls")) {
226 if (ImGui::Button(
"Reset Scroll")) {
232 if (ImGui::Button(
"Center View") && bitmap) {
244 auto canvas_stats = profiler.GetStats(
"canvas_operations");
245 auto draw_stats = profiler.GetStats(
"canvas_draw");
248 std::to_string(canvas_stats.sample_count) +
" ops",
249 "speed", ImVec4(0.2F, 1.0F, 0.2F, 1.0F));
252 std::to_string(draw_stats.avg_time_us / 1000.0) +
" ms",
253 "timer", ImVec4(1.0F, 0.8F, 0.2F, 1.0F));
255 if (ImGui::Button(
"Open Performance Dashboard")) {
264 if (ImGui::Button(
"Apply Changes", ImVec2(120, 0))) {
266 ImGui::CloseCurrentPopup();
270 if (ImGui::Button(
"Cancel", ImVec2(120, 0))) {
271 ImGui::CloseCurrentPopup();
275 if (ImGui::Button(
"Reset to Defaults", ImVec2(150, 0))) {
296 std::string modal_title =
"Canvas Scaling Controls";
297 ImGui::SetNextWindowSize(ImVec2(500, 400), ImGuiCond_FirstUseEver);
299 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
300 ImGuiWindowFlags_AlwaysAutoResize)) {
311 ImGui::Text(
"Preset Scales:");
312 const char* preset_labels[] = {
"0.25x",
"0.5x",
"1x",
"2x",
"4x",
"8x"};
313 const float preset_values[] = {0.25f, 0.5f, 1.0f, 2.0f, 4.0f, 8.0f};
315 for (
int i = 0; i < 6; ++i) {
316 if (i > 0) ImGui::SameLine();
317 if (ImGui::Button(preset_labels[i])) {
326 ImGui::Text(
"Grid Step: %.1f", config.
grid_step);
330 ImGui::Text(
"Grid Presets:");
331 const char* grid_labels[] = {
"8x8",
"16x16",
"32x32",
"64x64"};
332 const float grid_values[] = {8.0f, 16.0f, 32.0f, 64.0f};
334 for (
int i = 0; i < 4; ++i) {
335 if (i > 0) ImGui::SameLine();
336 if (ImGui::Button(grid_labels[i])) {
345 ImGui::Text(
"Canvas Information");
347 ImGui::Text(
"Scaled Size: %.0f x %.0f",
352 ImGui::Text(
"Bitmap Size: %d x %d", bitmap->
width(), bitmap->
height());
353 ImGui::Text(
"Effective Scale: %.3f x %.3f",
362 if (ImGui::Button(
"Apply", ImVec2(120, 0))) {
364 ImGui::CloseCurrentPopup();
368 if (ImGui::Button(
"Cancel", ImVec2(120, 0))) {
369 ImGui::CloseCurrentPopup();
379 std::string modal_title =
"BPP Format Conversion";
380 ImGui::SetNextWindowSize(ImVec2(600, 500), ImGuiCond_FirstUseEver);
382 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
383 ImGuiWindowFlags_AlwaysAutoResize)) {
390 static std::unique_ptr<gui::BppFormatUI> bpp_ui =
391 std::make_unique<gui::BppFormatUI>(canvas_id +
"_bpp_ui");
403 if (ImGui::Button(
"Close", ImVec2(120, 0))) {
404 ImGui::CloseCurrentPopup();
414 std::string modal_title = options.
title.empty() ?
"Palette Editor" : options.
title;
415 ImGui::SetNextWindowSize(ImVec2(800, 600), ImGuiCond_FirstUseEver);
417 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
418 ImGuiWindowFlags_AlwaysAutoResize)) {
425 static std::unique_ptr<gui::PaletteWidget> palette_editor =
426 std::make_unique<gui::PaletteWidget>();
429 palette_editor->ShowPaletteEditor(*options.
palette, modal_title);
436 if (ImGui::Button(
"Close", ImVec2(120, 0))) {
437 ImGui::CloseCurrentPopup();
447 std::string modal_title =
"Color Analysis";
448 ImGui::SetNextWindowSize(ImVec2(700, 500), ImGuiCond_FirstUseEver);
450 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
451 ImGuiWindowFlags_AlwaysAutoResize)) {
458 static std::unique_ptr<gui::PaletteWidget> palette_editor =
459 std::make_unique<gui::PaletteWidget>();
462 palette_editor->ShowColorAnalysis(*options.
bitmap, modal_title);
469 if (ImGui::Button(
"Close", ImVec2(120, 0))) {
470 ImGui::CloseCurrentPopup();
480 std::string modal_title =
"Canvas Performance";
481 ImGui::SetNextWindowSize(ImVec2(500, 300), ImGuiCond_FirstUseEver);
483 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
484 ImGuiWindowFlags_AlwaysAutoResize)) {
496 auto canvas_stats = profiler.GetStats(
"canvas_operations");
497 auto draw_stats = profiler.GetStats(
"canvas_draw");
499 RenderMetricCard(
"Total Operations", std::to_string(canvas_stats.sample_count),
"functions", ImVec4(0.2F, 0.8F, 1.0F, 1.0F));
500 RenderMetricCard(
"Average Time", std::to_string(draw_stats.avg_time_us / 1000.0) +
" ms",
"schedule", ImVec4(0.8F, 0.2F, 1.0F, 1.0F));
506 if (ImGui::Button(
"Open Dashboard", ImVec2(150, 0))) {
511 if (ImGui::Button(
"Close", ImVec2(120, 0))) {
512 ImGui::CloseCurrentPopup();
522 [&
id](
const ModalState& modal) { return modal.id == id; });
526 it->render_func = render_func;
532 ImGui::OpenPopup(
id.c_str());
537 [&
id](
const ModalState& modal) { return modal.id == id; });
546 [&
id](
const ModalState& modal) { return modal.id == id; });
554 static std::unordered_map<std::string, const char*> icon_map = {
561 auto it = icon_map.find(icon_name);
562 if (it != icon_map.end()) {
563 ImGui::TextColored(color,
"%s", it->second);
568 const std::string& icon,
const ImVec4& color) {
572 ImGui::Text(
"%s %s", icon.c_str(), title.c_str());
575 ImGui::TextColored(color,
"%s", value.c_str());
581 float* value,
float min_val,
float max_val,
582 const char* format) {
583 ImGui::Text(
"%s %s", icon.c_str(), label.c_str());
585 ImGui::SetNextItemWidth(200);
586 ImGui::SliderFloat((
"##" + label).c_str(), value, min_val, max_val, format);
Represents a bitmap image optimized for SNES ROM hacking.
std::vector< ModalState > active_modals_
bool IsAnyModalOpen() const
Check if any modal is open.
void RenderPerformanceModal(const std::string &canvas_id, const PerformanceOptions &options)
void OpenModal(const std::string &id, std::function< void()> render_func)
void ShowColorAnalysis(const std::string &canvas_id, const ColorAnalysisOptions &options)
Show color analysis modal.
void RenderColorAnalysisModal(const std::string &canvas_id, const ColorAnalysisOptions &options)
void ShowBppConversionDialog(const std::string &canvas_id, const BppConversionOptions &options)
Show BPP format conversion dialog.
void RenderPaletteEditorModal(const std::string &canvas_id, const PaletteEditorOptions &options)
void ShowPerformanceIntegration(const std::string &canvas_id, const PerformanceOptions &options)
Show performance dashboard integration.
void ShowPaletteEditor(const std::string &canvas_id, const PaletteEditorOptions &options)
Show palette editor modal.
void RenderMetricCard(const std::string &title, const std::string &value, const std::string &icon, const ImVec4 &color=ImVec4(1, 1, 1, 1))
bool IsModalOpen(const std::string &id) const
void ShowScalingControls(const std::string &canvas_id, const CanvasConfig &config, const gfx::Bitmap *bitmap=nullptr)
Show scaling controls modal.
void RenderSliderWithIcon(const std::string &label, const std::string &icon, float *value, float min_val, float max_val, const char *format="%.2f")
void RenderAdvancedPropertiesModal(const std::string &canvas_id, CanvasConfig &config, const gfx::Bitmap *bitmap)
void RenderMaterialIcon(const std::string &icon_name, const ImVec4 &color=ImVec4(1, 1, 1, 1))
void RenderBppConversionModal(const std::string &canvas_id, const BppConversionOptions &options)
void Render()
Render all active modals.
void ShowAdvancedProperties(const std::string &canvas_id, const CanvasConfig &config, const gfx::Bitmap *bitmap=nullptr)
Show advanced canvas properties modal.
void CloseModal(const std::string &id)
void RenderScalingControlsModal(const std::string &canvas_id, CanvasConfig &config, const gfx::Bitmap *bitmap)
#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 DispatchConfigCallback(const std::function< void(const CanvasConfig &)> &callback, const CanvasConfig &config)
void DispatchScaleCallback(const std::function< void(const CanvasConfig &)> &callback, const CanvasConfig &config)
Main namespace for the application.
std::function< void(gfx::BppFormat)> on_convert
const gfx::Bitmap * bitmap
const gfx::SnesPalette * palette
Canvas configuration options for modals.
bool enable_custom_labels
std::function< void(const CanvasConfig &)> on_config_changed
std::function< void(const CanvasConfig &)> on_scale_changed
const gfx::Bitmap * bitmap
gfx::SnesPalette * palette