12#include "imgui/imgui.h"
21 if (callback) callback(config);
26 if (callback) callback(config);
34 std::string modal_id = canvas_id +
"_advanced_properties";
36 auto render_func = [=]()
mutable {
50 std::string modal_id = canvas_id +
"_scaling_controls";
52 auto render_func = [=]()
mutable {
65 std::string modal_id = canvas_id +
"_bpp_conversion";
67 auto render_func = [=]() {
77 std::string modal_id = canvas_id +
"_palette_editor";
79 auto render_func = [=]() {
89 std::string modal_id = canvas_id +
"_color_analysis";
91 auto render_func = [=]() {
101 std::string modal_id = canvas_id +
"_performance";
103 auto render_func = [=]() {
120 [](
const ModalState& modal) { return !modal.is_open; }),
126 [](
const ModalState& modal) { return modal.is_open; });
133 std::string modal_title =
"Advanced Canvas Properties";
134 ImGui::SetNextWindowSize(ImVec2(600, 500), ImGuiCond_FirstUseEver);
136 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
137 ImGuiWindowFlags_AlwaysAutoResize)) {
144 if (ImGui::CollapsingHeader(
ICON_MD_ANALYTICS " Canvas Information", ImGuiTreeNodeFlags_DefaultOpen)) {
145 ImGui::Columns(2,
"CanvasInfo");
148 std::to_string(
static_cast<int>(config.
canvas_size.x)) +
" x " +
149 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)),
160 std::to_string(
static_cast<int>(config.
global_scale * 100)) +
"%",
164 std::to_string(
static_cast<int>(config.
grid_step)) +
"px",
171 if (ImGui::CollapsingHeader(
"👁️ View Settings", ImGuiTreeNodeFlags_DefaultOpen)) {
188 ImGui::Checkbox(
"Draggable Canvas", &config.
is_draggable);
192 ImGui::Checkbox(
"Auto Resize for Tables", &config.
auto_resize);
198 if (ImGui::CollapsingHeader(
ICON_MD_BUILD " Scale Controls", ImGuiTreeNodeFlags_DefaultOpen)) {
203 ImGui::Text(
"Preset Scales:");
206 const char* preset_labels[] = {
"0.25x",
"0.5x",
"1x",
"2x",
"4x",
"8x"};
207 const float preset_values[] = {0.25f, 0.5f, 1.0f, 2.0f, 4.0f, 8.0f};
209 for (
int i = 0; i < 6; ++i) {
210 if (i > 0) ImGui::SameLine();
211 if (ImGui::Button(preset_labels[i])) {
219 if (ImGui::CollapsingHeader(
"📜 Scrolling Controls")) {
222 if (ImGui::Button(
"Reset Scroll")) {
228 if (ImGui::Button(
"Center View") && bitmap) {
240 auto canvas_stats = profiler.GetStats(
"canvas_operations");
241 auto draw_stats = profiler.GetStats(
"canvas_draw");
244 std::to_string(canvas_stats.sample_count) +
" ops",
245 "speed", ImVec4(0.2F, 1.0F, 0.2F, 1.0F));
248 std::to_string(draw_stats.avg_time_us / 1000.0) +
" ms",
249 "timer", ImVec4(1.0F, 0.8F, 0.2F, 1.0F));
251 if (ImGui::Button(
"Open Performance Dashboard")) {
260 if (ImGui::Button(
"Apply Changes", ImVec2(120, 0))) {
262 ImGui::CloseCurrentPopup();
266 if (ImGui::Button(
"Cancel", ImVec2(120, 0))) {
267 ImGui::CloseCurrentPopup();
271 if (ImGui::Button(
"Reset to Defaults", ImVec2(150, 0))) {
292 std::string modal_title =
"Canvas Scaling Controls";
293 ImGui::SetNextWindowSize(ImVec2(500, 400), ImGuiCond_FirstUseEver);
295 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
296 ImGuiWindowFlags_AlwaysAutoResize)) {
307 ImGui::Text(
"Preset Scales:");
308 const char* preset_labels[] = {
"0.25x",
"0.5x",
"1x",
"2x",
"4x",
"8x"};
309 const float preset_values[] = {0.25f, 0.5f, 1.0f, 2.0f, 4.0f, 8.0f};
311 for (
int i = 0; i < 6; ++i) {
312 if (i > 0) ImGui::SameLine();
313 if (ImGui::Button(preset_labels[i])) {
322 ImGui::Text(
"Grid Step: %.1f", config.
grid_step);
326 ImGui::Text(
"Grid Presets:");
327 const char* grid_labels[] = {
"8x8",
"16x16",
"32x32",
"64x64"};
328 const float grid_values[] = {8.0f, 16.0f, 32.0f, 64.0f};
330 for (
int i = 0; i < 4; ++i) {
331 if (i > 0) ImGui::SameLine();
332 if (ImGui::Button(grid_labels[i])) {
341 ImGui::Text(
"Canvas Information");
343 ImGui::Text(
"Scaled Size: %.0f x %.0f",
348 ImGui::Text(
"Bitmap Size: %d x %d", bitmap->
width(), bitmap->
height());
349 ImGui::Text(
"Effective Scale: %.3f x %.3f",
358 if (ImGui::Button(
"Apply", ImVec2(120, 0))) {
360 ImGui::CloseCurrentPopup();
364 if (ImGui::Button(
"Cancel", ImVec2(120, 0))) {
365 ImGui::CloseCurrentPopup();
375 std::string modal_title =
"BPP Format Conversion";
376 ImGui::SetNextWindowSize(ImVec2(600, 500), ImGuiCond_FirstUseEver);
378 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
379 ImGuiWindowFlags_AlwaysAutoResize)) {
386 static std::unique_ptr<gui::BppFormatUI> bpp_ui =
387 std::make_unique<gui::BppFormatUI>(canvas_id +
"_bpp_ui");
399 if (ImGui::Button(
"Close", ImVec2(120, 0))) {
400 ImGui::CloseCurrentPopup();
410 std::string modal_title = options.
title.empty() ?
"Palette Editor" : options.
title;
411 ImGui::SetNextWindowSize(ImVec2(800, 600), ImGuiCond_FirstUseEver);
413 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
414 ImGuiWindowFlags_AlwaysAutoResize)) {
421 static std::unique_ptr<gui::PaletteEditorWidget> palette_editor =
422 std::make_unique<gui::PaletteEditorWidget>();
425 palette_editor->ShowPaletteEditor(*options.
palette, modal_title);
432 if (ImGui::Button(
"Close", ImVec2(120, 0))) {
433 ImGui::CloseCurrentPopup();
443 std::string modal_title =
"Color Analysis";
444 ImGui::SetNextWindowSize(ImVec2(700, 500), ImGuiCond_FirstUseEver);
446 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
447 ImGuiWindowFlags_AlwaysAutoResize)) {
454 static std::unique_ptr<gui::PaletteEditorWidget> palette_editor =
455 std::make_unique<gui::PaletteEditorWidget>();
458 palette_editor->ShowColorAnalysis(*options.
bitmap, modal_title);
465 if (ImGui::Button(
"Close", ImVec2(120, 0))) {
466 ImGui::CloseCurrentPopup();
476 std::string modal_title =
"Canvas Performance";
477 ImGui::SetNextWindowSize(ImVec2(500, 300), ImGuiCond_FirstUseEver);
479 if (ImGui::BeginPopupModal(modal_title.c_str(),
nullptr,
480 ImGuiWindowFlags_AlwaysAutoResize)) {
492 auto canvas_stats = profiler.GetStats(
"canvas_operations");
493 auto draw_stats = profiler.GetStats(
"canvas_draw");
495 RenderMetricCard(
"Total Operations", std::to_string(canvas_stats.sample_count),
"functions", ImVec4(0.2F, 0.8F, 1.0F, 1.0F));
496 RenderMetricCard(
"Average Time", std::to_string(draw_stats.avg_time_us / 1000.0) +
" ms",
"schedule", ImVec4(0.8F, 0.2F, 1.0F, 1.0F));
502 if (ImGui::Button(
"Open Dashboard", ImVec2(150, 0))) {
507 if (ImGui::Button(
"Close", ImVec2(120, 0))) {
508 ImGui::CloseCurrentPopup();
518 [&
id](
const ModalState& modal) { return modal.id == id; });
522 it->render_func = render_func;
528 ImGui::OpenPopup(
id.c_str());
533 [&
id](
const ModalState& modal) { return modal.id == id; });
542 [&
id](
const ModalState& modal) { return modal.id == id; });
550 static std::unordered_map<std::string, const char*> icon_map = {
557 auto it = icon_map.find(icon_name);
558 if (it != icon_map.end()) {
559 ImGui::TextColored(color,
"%s", it->second);
564 const std::string& icon,
const ImVec4& color) {
568 ImGui::Text(
"%s %s", icon.c_str(), title.c_str());
571 ImGui::TextColored(color,
"%s", value.c_str());
577 float* value,
float min_val,
float max_val,
578 const char* format) {
579 ImGui::Text(
"%s %s", icon.c_str(), label.c_str());
581 ImGui::SetNextItemWidth(200);
582 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 RenderMaterialIcon(const std::string &icon_name, const ImVec4 &color=ImVec4(1, 1, 1, 1))
void RenderMetricCard(const std::string &title, const std::string &value, const std::string &icon, 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)
Main namespace for the application.
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