12#include "imgui/imgui.h"
22 handler(command, config);
70 const std::string& context_id,
const ImVec2& ,
Rom* rom,
78 if (ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right);
80 if (ImGui::IsItemHovered() &&
81 ImGui::IsMouseReleased(ImGuiMouseButton_Right)) {
84 ImGui::OpenPopupOnItemClick(context_id.c_str(),
85 ImGuiPopupFlags_MouseButtonRight);
89 auto popup_callback = [canvas](
const std::string& id,
90 std::function<void()> callback) {
97 if (ImGui::BeginPopup(context_id.c_str())) {
128 if (ImGui::GetIO().KeyCtrl) {
149 const ImVec2& canvas_size,
const ImVec2& content_size,
float global_scale,
150 float grid_step,
bool enable_grid,
bool enable_hex_labels,
151 bool enable_custom_labels,
bool enable_context_menu,
bool is_draggable,
152 bool auto_resize,
const ImVec2& scrolling) {
168 std::function<
void(
const std::string&, std::function<
void()>)>
175 const std::string& title,
const std::vector<CanvasMenuItem>& items,
176 std::function<
void(
const std::string&, std::function<
void()>)>
181 ImGui::TextColored(ImVec4(0.7F, 0.7F, 0.7F, 1.0F),
"%s", title.c_str());
182 for (
const auto& item : items) {
188 std::function<
void(
const std::string&, std::function<
void()>)>
202 for (
const auto& item : it->second) {
211 if (ImGui::MenuItem(tr(
"Reset View"),
"Ctrl+R")) {
214 if (ImGui::MenuItem(tr(
"Zoom to Fit"),
"Ctrl+F")) {
218 if (ImGui::MenuItem(tr(
"Zoom In"),
"Ctrl++")) {
223 if (ImGui::MenuItem(tr(
"Zoom Out"),
"Ctrl+-")) {
229 const struct ScaleOption {
232 } scale_options[] = {{
"0.25x", 0.25F}, {
"0.5x", 0.5F}, {
"1x", 1.0F},
233 {
"2x", 2.0F}, {
"4x", 4.0F}, {
"8x", 8.0F}};
236 for (
const auto& option : scale_options) {
237 const bool selected = current_config.
global_scale == option.value;
238 if (ImGui::MenuItem(option.label,
nullptr, selected)) {
248 if (ImGui::MenuItem(tr(
"Show Grid"),
nullptr,
enable_grid_)) {
258 if (ImGui::MenuItem(tr(
"Show Custom Labels"),
nullptr,
266 const struct GridOption {
270 {
"8x8", 8.0F}, {
"16x16", 16.0F}, {
"32x32", 32.0F}, {
"64x64", 64.0F}};
272 for (
const auto& option : grid_options) {
273 const bool selected =
grid_step_ == option.value;
274 if (ImGui::MenuItem(option.label,
nullptr, selected)) {
284 ImGui::TextDisabled(tr(
"Canvas %.0f x %.0f"),
canvas_size_.x,
286 ImGui::TextDisabled(tr(
"Content %.0f x %.0f"),
content_size_.x,
289 ImGui::TextDisabled(tr(
"Grid %.1f"),
grid_step_);
292 if (ImGui::MenuItem(tr(
"Advanced Properties..."))) {
315 ImGui::TextDisabled(tr(
"Size %d x %d"), bitmap->
width(), bitmap->
height());
316 if (
auto* surface = bitmap->
surface()) {
317 ImGui::TextDisabled(tr(
"Pitch %d"), surface->pitch);
318 ImGui::TextDisabled(tr(
"BPP %d / %d bytes"),
323 if (ImGui::BeginMenu(tr(
"Pixel Format"))) {
324 if (ImGui::MenuItem(tr(
"Indexed"))) {
330 if (ImGui::MenuItem(tr(
"4BPP"))) {
336 if (ImGui::MenuItem(tr(
"8BPP"))) {
345 if (ImGui::BeginMenu(tr(
"Format Tools"))) {
346 if (ImGui::MenuItem(tr(
"Format Analysis..."))) {
349 if (ImGui::MenuItem(tr(
"Convert Format..."))) {
352 if (ImGui::MenuItem(tr(
"Format Comparison..."))) {
368 if (ImGui::MenuItem(tr(
"Edit Palette..."))) {
372 if (ImGui::MenuItem(tr(
"Color Analysis..."))) {
376 if (rom && ImGui::BeginMenu(tr(
"ROM Palette Selection"))) {
380 ImGui::Text(tr(
"Group:"));
382 ImGui::InputScalar(
"##group", ImGuiDataType_U64,
384 ImGui::Text(tr(
"Palette:"));
388 if (ImGui::Button(tr(
"Apply to Canvas"))) {
395 if (ImGui::BeginMenu(tr(
"View Palette"))) {
404 ImGui::TextColored(ImVec4(0.7F, 0.9F, 1.0F, 1.0F), tr(
"Bitmap Metadata"));
407 const auto& meta = bitmap->
metadata();
408 ImGui::Text(tr(
"Source BPP: %d"), meta.source_bpp);
409 ImGui::Text(tr(
"Palette Format: %s"),
410 meta.palette_format == 0 ?
"Full" :
"Sub-palette");
411 ImGui::Text(tr(
"Source Type: %s"), meta.source_type.c_str());
412 ImGui::Text(tr(
"Expected Colors: %d"), meta.palette_colors);
413 ImGui::Text(tr(
"Actual Palette Size: %zu"), bitmap->
palette().
size());
416 ImGui::TextColored(ImVec4(1.0F, 0.9F, 0.6F, 1.0F),
417 tr(
"Palette Application Method"));
418 if (meta.palette_format == 0) {
420 tr(
"Full palette (SetPalette) - all colors applied directly"));
422 ImGui::TextWrapped(tr(
423 "Sub-palette (SetPaletteWithTransparent) - color 0 is transparent, "
424 "1-7 from palette"));
428 ImGui::TextColored(ImVec4(0.6F, 1.0F, 0.6F, 1.0F), tr(
"Documentation"));
429 if (ImGui::MenuItem(tr(
"Palette System Architecture"))) {
430 ImGui::SetClipboardText(
"yaze/docs/palette-system-architecture.md");
433 if (ImGui::MenuItem(tr(
"User Palette Guide"))) {
434 ImGui::SetClipboardText(
"yaze/docs/user-palette-guide.md");
455 auto canvas_stats = profiler.GetStats(
"canvas_operations");
456 auto draw_stats = profiler.GetStats(
"canvas_draw");
458 ImGui::Text(tr(
"Canvas Operations: %zu"), canvas_stats.sample_count);
459 ImGui::Text(tr(
"Average Time: %.2f ms"), draw_stats.avg_time_us / 1000.0);
461 if (ImGui::MenuItem(tr(
"Performance Dashboard..."))) {
464 if (ImGui::MenuItem(tr(
"Usage Report..."))) {
473 const ImVec4& color) {
475 static std::unordered_map<std::string, const char*> icon_map = {
499 auto it = icon_map.find(icon_name);
500 if (it != icon_map.end()) {
501 ImGui::TextColored(color,
"%s", it->second);
508 return "Tile Painting";
510 return "Tile Selecting";
512 return "Rectangle Selection";
514 return "Color Painting";
516 return "Bitmap Editing";
518 return "Palette Editing";
520 return "BPP Conversion";
522 return "Performance Mode";
524 return "Entity Manipulation";
535 return ImVec4(0.2F, 1.0F, 0.2F, 1.0F);
537 return ImVec4(0.2F, 0.8F, 1.0F, 1.0F);
539 return ImVec4(1.0F, 0.8F, 0.2F, 1.0F);
541 return ImVec4(1.0F, 0.2F, 1.0F, 1.0F);
543 return ImVec4(1.0F, 0.5F, 0.2F, 1.0F);
545 return ImVec4(0.8F, 0.2F, 1.0F, 1.0F);
547 return ImVec4(0.2F, 1.0F, 1.0F, 1.0F);
549 return ImVec4(1.0F, 0.2F, 0.2F, 1.0F);
551 return ImVec4(0.4F, 0.8F, 1.0F, 1.0F);
553 return ImVec4(0.7F, 0.7F, 0.7F, 1.0F);
555 return ImVec4(0.7F, 0.7F, 0.7F, 1.0F);
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
void QueueTextureCommand(TextureCommandType type, Bitmap *bitmap)
Represents a bitmap image optimized for SNES ROM hacking.
const SnesPalette & palette() const
void Reformat(int format)
Reformat the bitmap to use a different pixel format.
BitmapMetadata & metadata()
SnesPalette * mutable_palette()
SDL_Surface * surface() const
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
Modern, robust canvas for drawing and manipulating graphics.
PopupRegistry & GetPopupRegistry()
CanvasMenuDefinition & editor_menu()
#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_VISIBILITY
#define ICON_MD_COLOR_LENS
CanvasUsage
Canvas usage patterns and tracking.
void RenderCanvasMenu(const CanvasMenuDefinition &menu, std::function< void(const std::string &, std::function< void()>)> popup_opened_callback)
Render a complete menu definition.
constexpr bool RoleAllowsBitmapMutation(CanvasRole role)
void RenderMenuItem(const CanvasMenuItem &item, std::function< void(const std::string &, std::function< void()>)> popup_opened_callback)
Render a single menu item.
absl::Status DisplayEditablePalette(gfx::SnesPalette &palette, const std::string &title, bool show_color_picker, int colors_per_row, ImGuiColorEditFlags flags)
SDL2/SDL3 compatibility layer.
Unified configuration for canvas display and interaction.
bool enable_custom_labels
bool show_builtin_context_menu