12#include "imgui/imgui.h"
22 handler(command, config);
69 const std::string& context_id,
const ImVec2& ,
Rom* rom,
77 if (ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right);
79 ImGui::OpenPopupOnItemClick(context_id.c_str(),
80 ImGuiPopupFlags_MouseButtonRight);
84 auto popup_callback = [canvas](
const std::string& id,
85 std::function<void()> callback) {
92 if (ImGui::BeginPopup(context_id.c_str())) {
123 if (ImGui::GetIO().KeyCtrl) {
144 const ImVec2& canvas_size,
const ImVec2& content_size,
float global_scale,
145 float grid_step,
bool enable_grid,
bool enable_hex_labels,
146 bool enable_custom_labels,
bool enable_context_menu,
bool is_draggable,
147 bool auto_resize,
const ImVec2& scrolling) {
163 std::function<
void(
const std::string&, std::function<
void()>)>
170 const std::string& title,
const std::vector<CanvasMenuItem>& items,
171 std::function<
void(
const std::string&, std::function<
void()>)>
176 ImGui::TextColored(ImVec4(0.7F, 0.7F, 0.7F, 1.0F),
"%s", title.c_str());
177 for (
const auto& item : items) {
183 std::function<
void(
const std::string&, std::function<
void()>)>
197 for (
const auto& item : it->second) {
206 if (ImGui::MenuItem(tr(
"Reset View"),
"Ctrl+R")) {
209 if (ImGui::MenuItem(tr(
"Zoom to Fit"),
"Ctrl+F")) {
213 if (ImGui::MenuItem(tr(
"Zoom In"),
"Ctrl++")) {
218 if (ImGui::MenuItem(tr(
"Zoom Out"),
"Ctrl+-")) {
224 const struct ScaleOption {
227 } scale_options[] = {{
"0.25x", 0.25F}, {
"0.5x", 0.5F}, {
"1x", 1.0F},
228 {
"2x", 2.0F}, {
"4x", 4.0F}, {
"8x", 8.0F}};
231 for (
const auto& option : scale_options) {
232 const bool selected = current_config.
global_scale == option.value;
233 if (ImGui::MenuItem(option.label,
nullptr, selected)) {
243 if (ImGui::MenuItem(tr(
"Show Grid"),
nullptr,
enable_grid_)) {
253 if (ImGui::MenuItem(tr(
"Show Custom Labels"),
nullptr,
261 const struct GridOption {
265 {
"8x8", 8.0F}, {
"16x16", 16.0F}, {
"32x32", 32.0F}, {
"64x64", 64.0F}};
267 for (
const auto& option : grid_options) {
268 const bool selected =
grid_step_ == option.value;
269 if (ImGui::MenuItem(option.label,
nullptr, selected)) {
279 ImGui::TextDisabled(tr(
"Canvas %.0f x %.0f"),
canvas_size_.x,
281 ImGui::TextDisabled(tr(
"Content %.0f x %.0f"),
content_size_.x,
284 ImGui::TextDisabled(tr(
"Grid %.1f"),
grid_step_);
287 if (ImGui::MenuItem(tr(
"Advanced Properties..."))) {
310 ImGui::TextDisabled(tr(
"Size %d x %d"), bitmap->
width(), bitmap->
height());
311 if (
auto* surface = bitmap->
surface()) {
312 ImGui::TextDisabled(tr(
"Pitch %d"), surface->pitch);
313 ImGui::TextDisabled(tr(
"BPP %d / %d bytes"),
318 if (ImGui::BeginMenu(tr(
"Pixel Format"))) {
319 if (ImGui::MenuItem(tr(
"Indexed"))) {
325 if (ImGui::MenuItem(tr(
"4BPP"))) {
331 if (ImGui::MenuItem(tr(
"8BPP"))) {
340 if (ImGui::BeginMenu(tr(
"Format Tools"))) {
341 if (ImGui::MenuItem(tr(
"Format Analysis..."))) {
344 if (ImGui::MenuItem(tr(
"Convert Format..."))) {
347 if (ImGui::MenuItem(tr(
"Format Comparison..."))) {
363 if (ImGui::MenuItem(tr(
"Edit Palette..."))) {
367 if (ImGui::MenuItem(tr(
"Color Analysis..."))) {
371 if (rom && ImGui::BeginMenu(tr(
"ROM Palette Selection"))) {
375 ImGui::Text(tr(
"Group:"));
377 ImGui::InputScalar(
"##group", ImGuiDataType_U64,
379 ImGui::Text(tr(
"Palette:"));
383 if (ImGui::Button(tr(
"Apply to Canvas"))) {
390 if (ImGui::BeginMenu(tr(
"View Palette"))) {
399 ImGui::TextColored(ImVec4(0.7F, 0.9F, 1.0F, 1.0F), tr(
"Bitmap Metadata"));
402 const auto& meta = bitmap->
metadata();
403 ImGui::Text(tr(
"Source BPP: %d"), meta.source_bpp);
404 ImGui::Text(tr(
"Palette Format: %s"),
405 meta.palette_format == 0 ?
"Full" :
"Sub-palette");
406 ImGui::Text(tr(
"Source Type: %s"), meta.source_type.c_str());
407 ImGui::Text(tr(
"Expected Colors: %d"), meta.palette_colors);
408 ImGui::Text(tr(
"Actual Palette Size: %zu"), bitmap->
palette().
size());
411 ImGui::TextColored(ImVec4(1.0F, 0.9F, 0.6F, 1.0F),
412 tr(
"Palette Application Method"));
413 if (meta.palette_format == 0) {
415 tr(
"Full palette (SetPalette) - all colors applied directly"));
417 ImGui::TextWrapped(tr(
418 "Sub-palette (SetPaletteWithTransparent) - color 0 is transparent, "
419 "1-7 from palette"));
423 ImGui::TextColored(ImVec4(0.6F, 1.0F, 0.6F, 1.0F), tr(
"Documentation"));
424 if (ImGui::MenuItem(tr(
"Palette System Architecture"))) {
425 ImGui::SetClipboardText(
"yaze/docs/palette-system-architecture.md");
428 if (ImGui::MenuItem(tr(
"User Palette Guide"))) {
429 ImGui::SetClipboardText(
"yaze/docs/user-palette-guide.md");
450 auto canvas_stats = profiler.GetStats(
"canvas_operations");
451 auto draw_stats = profiler.GetStats(
"canvas_draw");
453 ImGui::Text(tr(
"Canvas Operations: %zu"), canvas_stats.sample_count);
454 ImGui::Text(tr(
"Average Time: %.2f ms"), draw_stats.avg_time_us / 1000.0);
456 if (ImGui::MenuItem(tr(
"Performance Dashboard..."))) {
459 if (ImGui::MenuItem(tr(
"Usage Report..."))) {
468 const ImVec4& color) {
470 static std::unordered_map<std::string, const char*> icon_map = {
494 auto it = icon_map.find(icon_name);
495 if (it != icon_map.end()) {
496 ImGui::TextColored(color,
"%s", it->second);
503 return "Tile Painting";
505 return "Tile Selecting";
507 return "Rectangle Selection";
509 return "Color Painting";
511 return "Bitmap Editing";
513 return "Palette Editing";
515 return "BPP Conversion";
517 return "Performance Mode";
519 return "Entity Manipulation";
530 return ImVec4(0.2F, 1.0F, 0.2F, 1.0F);
532 return ImVec4(0.2F, 0.8F, 1.0F, 1.0F);
534 return ImVec4(1.0F, 0.8F, 0.2F, 1.0F);
536 return ImVec4(1.0F, 0.2F, 1.0F, 1.0F);
538 return ImVec4(1.0F, 0.5F, 0.2F, 1.0F);
540 return ImVec4(0.8F, 0.2F, 1.0F, 1.0F);
542 return ImVec4(0.2F, 1.0F, 1.0F, 1.0F);
544 return ImVec4(1.0F, 0.2F, 0.2F, 1.0F);
546 return ImVec4(0.4F, 0.8F, 1.0F, 1.0F);
548 return ImVec4(0.7F, 0.7F, 0.7F, 1.0F);
550 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