yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
palette_group_panel.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_GRAPHICS_PALETTE_GROUP_CARD_H
2#define YAZE_APP_EDITOR_GRAPHICS_PALETTE_GROUP_CARD_H
3
4#include <functional>
5#include <memory>
6#include <string>
7#include <unordered_map>
8#include <unordered_set>
9#include <vector>
10
11#include "absl/status/status.h"
14#include "imgui/imgui.h"
15#include "rom/rom.h"
16#include "zelda3/game_data.h"
18#include "app/gui/core/icons.h"
19
20namespace yaze {
21namespace editor {
22
23// Forward declaration
24class ToastManager;
25
36
41 int palette_id; // Palette ID in ROM
42 std::string name; // Display name (e.g., "Light World Main")
43 std::string description; // Usage description
44 uint32_t rom_address; // Base ROM address for this palette
45 uint32_t vram_address; // VRAM address (for sprite palettes, 0 if N/A)
46 std::string usage_notes; // Additional usage information
47};
48
53 std::string group_name; // Internal group name
54 std::string display_name; // Display name for UI
55 std::vector<PaletteMetadata> palettes; // Metadata for each palette
56 int colors_per_palette; // Number of colors per palette (usually 8 or 16)
57 int colors_per_row; // Colors per row for grid layout
58};
59
74 public:
83 PaletteGroupPanel(const std::string& group_name,
84 const std::string& display_name, Rom* rom,
85 zelda3::GameData* game_data = nullptr);
86
87 void SetGameData(zelda3::GameData* game_data) { game_data_ = game_data; }
88
89 virtual ~PaletteGroupPanel() = default;
90
91 // ========== Main Rendering ==========
92
99 void Draw(bool* p_open) override;
100
101 // EditorPanel Implementation
102 std::string GetId() const override { return "palette." + group_name_; }
103 std::string GetDisplayName() const override { return display_name_; }
104 std::string GetIcon() const override { return ICON_MD_PALETTE; } // Default, override in derived
105 std::string GetEditorCategory() const override { return "Palette"; }
106 int GetPriority() const override { return 50; } // Default, override in derived
107
108 // ========== Panel Control ==========
109
110 void Show() { show_ = true; }
111 void Hide() { show_ = false; }
112 bool IsVisible() const { return show_; }
113 bool* visibility_flag() { return &show_; }
114
115 void SetToastManager(ToastManager* toast_manager) {
116 toast_manager_ = toast_manager;
117 }
118
119 // ========== Palette Operations ==========
120
124 absl::Status SaveToRom();
125
129 void DiscardChanges();
130
134 void ResetPalette(int palette_index);
135
139 void ResetColor(int palette_index, int color_index);
140
144 void SetColor(int palette_index, int color_index,
145 const gfx::SnesColor& new_color);
146
147 // ========== History Management ==========
148
149 void Undo();
150 void Redo();
151 bool CanUndo() const;
152 bool CanRedo() const;
153 void ClearHistory();
154
155 // ========== State Queries ==========
156
157 bool HasUnsavedChanges() const;
158 bool IsPaletteModified(int palette_index) const;
159 bool IsColorModified(int palette_index, int color_index) const;
160
162 void SetSelectedPaletteIndex(int index) { selected_palette_ = index; }
163
165 void SetSelectedColorIndex(int index) { selected_color_ = index; }
166
167 // ========== Export/Import ==========
168
169 std::string ExportToJson() const;
170 absl::Status ImportFromJson(const std::string& json);
171
172 std::string ExportToClipboard() const;
173 absl::Status ImportFromClipboard();
174
175 protected:
176 // ========== Pure Virtual Methods (Implemented by Derived Classes) ==========
177
182 virtual const gfx::PaletteGroup* GetPaletteGroup() const = 0;
183
187 virtual const PaletteGroupMetadata& GetMetadata() const = 0;
188
192 virtual void DrawPaletteGrid() = 0;
193
197 virtual int GetColorsPerRow() const = 0;
198
199 // ========== Optional Overrides ==========
200
204 virtual void DrawCustomToolbarButtons() {}
205
209 virtual void DrawCustomPanels() {}
210
211 // ========== Common UI Components ==========
212
216 void DrawToolbar();
217
221 void DrawPaletteSelector();
222
226 void DrawColorPicker();
227
231 void DrawColorInfo();
232
236 void DrawMetadataInfo();
237
242
243 // ========== Helper Methods ==========
244
249
253 gfx::SnesColor GetOriginalColor(int palette_index, int color_index) const;
254
258 absl::Status WriteColorToRom(int palette_index, int color_index,
259 const gfx::SnesColor& color);
260
264 void MarkModified(int palette_index, int color_index);
265
269 void ClearModified(int palette_index);
270
271 // ========== Member Variables ==========
272
273 std::string group_name_; // Internal name (e.g., "ow_main")
274 std::string display_name_; // Display name (e.g., "Overworld Main")
275 Rom* rom_; // ROM instance
276 zelda3::GameData* game_data_ = nullptr; // GameData instance
277 bool show_ = false; // Visibility flag
278
279 // Selection state
280 int selected_palette_ = 0; // Currently selected palette index
281 int selected_color_ = -1; // Currently selected color (-1 = none)
282 gfx::SnesColor editing_color_; // Color being edited in picker
283
284 // Settings
285 bool auto_save_enabled_ = false; // Auto-save to ROM on every change
286 bool show_snes_format_ = true; // Show SNES $xxxx format in info
287 bool show_hex_format_ = true; // Show #xxxxxx hex in info
288
290};
291
292// ============================================================================
293// Concrete Palette Panel Implementations
294// ============================================================================
295
305 public:
306 explicit OverworldMainPalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
307 ~OverworldMainPalettePanel() override = default;
308
309 protected:
311 const gfx::PaletteGroup* GetPaletteGroup() const override;
312 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
313 void DrawPaletteGrid() override;
314 int GetColorsPerRow() const override { return 7; }
315
316 // EditorPanel Overrides
317 std::string GetIcon() const override { return ICON_MD_LANDSCAPE; }
318 int GetPriority() const override { return 20; }
319
320 private:
323};
324
331 public:
332 explicit OverworldAnimatedPalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
333 ~OverworldAnimatedPalettePanel() override = default;
334
335 protected:
337 const gfx::PaletteGroup* GetPaletteGroup() const override;
338 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
339 void DrawPaletteGrid() override;
340 int GetColorsPerRow() const override { return 7; }
341
342 // EditorPanel Overrides
343 std::string GetIcon() const override { return ICON_MD_WATER; }
344 int GetPriority() const override { return 30; }
345
346 private:
349};
350
357 public:
358 explicit DungeonMainPalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
359 ~DungeonMainPalettePanel() override = default;
360
361 protected:
363 const gfx::PaletteGroup* GetPaletteGroup() const override;
364 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
365 void DrawPaletteGrid() override;
366 int GetColorsPerRow() const override { return 15; }
367
368 // EditorPanel Overrides
369 std::string GetIcon() const override { return ICON_MD_CASTLE; }
370 int GetPriority() const override { return 40; }
371
372 private:
375};
376
386 public:
387 explicit SpritePalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
388 ~SpritePalettePanel() override = default;
389
390 protected:
392 const gfx::PaletteGroup* GetPaletteGroup() const override;
393 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
394 void DrawPaletteGrid() override;
395 int GetColorsPerRow() const override { return 15; }
396 void DrawCustomPanels() override; // Show VRAM info
397
398 // EditorPanel Overrides
399 std::string GetIcon() const override { return ICON_MD_PETS; }
400 int GetPriority() const override { return 50; }
401
402
403
404 private:
407};
408
416 public:
417 explicit SpritesAux1PalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
418 ~SpritesAux1PalettePanel() override = default;
419
420 protected:
422 const gfx::PaletteGroup* GetPaletteGroup() const override;
423 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
424 void DrawPaletteGrid() override;
425 int GetColorsPerRow() const override { return 7; }
426
427 // EditorPanel Overrides
428 std::string GetIcon() const override { return ICON_MD_FILTER_1; }
429 int GetPriority() const override { return 51; }
430
431 private:
434};
435
443 public:
444 explicit SpritesAux2PalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
445 ~SpritesAux2PalettePanel() override = default;
446
447 protected:
449 const gfx::PaletteGroup* GetPaletteGroup() const override;
450 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
451 void DrawPaletteGrid() override;
452 int GetColorsPerRow() const override { return 7; }
453
454 // EditorPanel Overrides
455 std::string GetIcon() const override { return ICON_MD_FILTER_2; }
456 int GetPriority() const override { return 52; }
457
458 private:
461};
462
470 public:
471 explicit SpritesAux3PalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
472 ~SpritesAux3PalettePanel() override = default;
473
474 protected:
476 const gfx::PaletteGroup* GetPaletteGroup() const override;
477 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
478 void DrawPaletteGrid() override;
479 int GetColorsPerRow() const override { return 7; }
480
481 // EditorPanel Overrides
482 std::string GetIcon() const override { return ICON_MD_FILTER_3; }
483 int GetPriority() const override { return 53; }
484
485 private:
488};
489
496 public:
497 explicit EquipmentPalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
498 ~EquipmentPalettePanel() override = default;
499
500 protected:
502 const gfx::PaletteGroup* GetPaletteGroup() const override;
503 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
504 void DrawPaletteGrid() override;
505 int GetColorsPerRow() const override { return 15; }
506
507 // EditorPanel Overrides
508 std::string GetIcon() const override { return ICON_MD_SHIELD; }
509 int GetPriority() const override { return 60; }
510
511 private:
514};
515
516} // namespace editor
517} // namespace yaze
518
519#endif // YAZE_APP_EDITOR_GRAPHICS_PALETTE_GROUP_CARD_H
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:28
Dungeon Main palette group panel.
std::string GetIcon() const override
Material Design icon for this panel.
void DrawPaletteGrid() override
Draw the palette grid specific to this palette type.
int GetColorsPerRow() const override
Get the number of colors per row for grid layout.
static const PaletteGroupMetadata metadata_
~DungeonMainPalettePanel() override=default
DungeonMainPalettePanel(Rom *rom, zelda3::GameData *game_data=nullptr)
gfx::PaletteGroup * GetPaletteGroup() override
Get the palette group for this card.
int GetPriority() const override
Get display priority for menu ordering.
static PaletteGroupMetadata InitializeMetadata()
const PaletteGroupMetadata & GetMetadata() const override
Get metadata for this palette group.
Base interface for all logical panel components.
Equipment/Armor palette group panel.
int GetPriority() const override
Get display priority for menu ordering.
const PaletteGroupMetadata & GetMetadata() const override
Get metadata for this palette group.
gfx::PaletteGroup * GetPaletteGroup() override
Get the palette group for this card.
int GetColorsPerRow() const override
Get the number of colors per row for grid layout.
EquipmentPalettePanel(Rom *rom, zelda3::GameData *game_data=nullptr)
static PaletteGroupMetadata InitializeMetadata()
static const PaletteGroupMetadata metadata_
std::string GetIcon() const override
Material Design icon for this panel.
~EquipmentPalettePanel() override=default
void DrawPaletteGrid() override
Draw the palette grid specific to this palette type.
Overworld Animated palette group panel.
const PaletteGroupMetadata & GetMetadata() const override
Get metadata for this palette group.
void DrawPaletteGrid() override
Draw the palette grid specific to this palette type.
int GetColorsPerRow() const override
Get the number of colors per row for grid layout.
std::string GetIcon() const override
Material Design icon for this panel.
OverworldAnimatedPalettePanel(Rom *rom, zelda3::GameData *game_data=nullptr)
int GetPriority() const override
Get display priority for menu ordering.
static const PaletteGroupMetadata metadata_
gfx::PaletteGroup * GetPaletteGroup() override
Get the palette group for this card.
Overworld Main palette group panel.
static PaletteGroupMetadata InitializeMetadata()
~OverworldMainPalettePanel() override=default
OverworldMainPalettePanel(Rom *rom, zelda3::GameData *game_data=nullptr)
void DrawPaletteGrid() override
Draw the palette grid specific to this palette type.
std::string GetIcon() const override
Material Design icon for this panel.
static const PaletteGroupMetadata metadata_
int GetPriority() const override
Get display priority for menu ordering.
gfx::PaletteGroup * GetPaletteGroup() override
Get the palette group for this card.
const PaletteGroupMetadata & GetMetadata() const override
Get metadata for this palette group.
int GetColorsPerRow() const override
Get the number of colors per row for grid layout.
Base class for palette group editing cards.
virtual gfx::PaletteGroup * GetPaletteGroup()=0
Get the palette group for this card.
void ResetPalette(int palette_index)
Reset a specific palette to original ROM values.
virtual void DrawCustomToolbarButtons()
Draw additional toolbar buttons (called after standard buttons)
void DrawPaletteSelector()
Draw palette selector dropdown.
std::string GetIcon() const override
Material Design icon for this panel.
void ResetColor(int palette_index, int color_index)
Reset a specific color to original ROM value.
gfx::SnesColor GetOriginalColor(int palette_index, int color_index) const
Get original color from ROM (for reset/comparison)
gfx::SnesPalette * GetMutablePalette(int index)
Get mutable palette by index.
void DiscardChanges()
Discard all unsaved changes.
void SetGameData(zelda3::GameData *game_data)
void DrawToolbar()
Draw standard toolbar with save/discard/undo/redo.
void MarkModified(int palette_index, int color_index)
Mark palette as modified.
void DrawBatchOperationsPopup()
Draw batch operations popup.
void ClearModified(int palette_index)
Clear modified flags for palette.
void DrawMetadataInfo()
Draw palette metadata info panel.
void SetColor(int palette_index, int color_index, const gfx::SnesColor &new_color)
Set a color value (records change for undo)
std::string GetEditorCategory() const override
Editor category this panel belongs to.
virtual const gfx::PaletteGroup * GetPaletteGroup() const =0
virtual const PaletteGroupMetadata & GetMetadata() const =0
Get metadata for this palette group.
absl::Status SaveToRom()
Save all modified palettes to ROM.
absl::Status WriteColorToRom(int palette_index, int color_index, const gfx::SnesColor &color)
Write a single color to ROM.
virtual void DrawCustomPanels()
Draw additional panels (called after main content)
void DrawColorPicker()
Draw color picker for selected color.
bool IsPaletteModified(int palette_index) const
PaletteGroupPanel(const std::string &group_name, const std::string &display_name, Rom *rom, zelda3::GameData *game_data=nullptr)
Construct a new Palette Group Panel.
int GetPriority() const override
Get display priority for menu ordering.
bool IsColorModified(int palette_index, int color_index) const
void Draw(bool *p_open) override
Draw the card's ImGui UI.
void DrawColorInfo()
Draw color info panel with RGB/SNES/Hex values.
virtual ~PaletteGroupPanel()=default
absl::Status ImportFromJson(const std::string &json)
void SetToastManager(ToastManager *toast_manager)
virtual void DrawPaletteGrid()=0
Draw the palette grid specific to this palette type.
std::string GetDisplayName() const override
Human-readable name shown in menus and title bars.
std::string GetId() const override
Unique identifier for this panel.
virtual int GetColorsPerRow() const =0
Get the number of colors per row for grid layout.
Global Sprite palette group panel.
~SpritePalettePanel() override=default
std::string GetIcon() const override
Material Design icon for this panel.
const PaletteGroupMetadata & GetMetadata() const override
Get metadata for this palette group.
static PaletteGroupMetadata InitializeMetadata()
static const PaletteGroupMetadata metadata_
SpritePalettePanel(Rom *rom, zelda3::GameData *game_data=nullptr)
int GetColorsPerRow() const override
Get the number of colors per row for grid layout.
gfx::PaletteGroup * GetPaletteGroup() override
Get the palette group for this card.
int GetPriority() const override
Get display priority for menu ordering.
void DrawCustomPanels() override
Draw additional panels (called after main content)
void DrawPaletteGrid() override
Draw the palette grid specific to this palette type.
Sprites Aux1 palette group panel.
gfx::PaletteGroup * GetPaletteGroup() override
Get the palette group for this card.
static PaletteGroupMetadata InitializeMetadata()
~SpritesAux1PalettePanel() override=default
void DrawPaletteGrid() override
Draw the palette grid specific to this palette type.
int GetPriority() const override
Get display priority for menu ordering.
int GetColorsPerRow() const override
Get the number of colors per row for grid layout.
const PaletteGroupMetadata & GetMetadata() const override
Get metadata for this palette group.
SpritesAux1PalettePanel(Rom *rom, zelda3::GameData *game_data=nullptr)
static const PaletteGroupMetadata metadata_
std::string GetIcon() const override
Material Design icon for this panel.
Sprites Aux2 palette group panel.
const PaletteGroupMetadata & GetMetadata() const override
Get metadata for this palette group.
std::string GetIcon() const override
Material Design icon for this panel.
int GetColorsPerRow() const override
Get the number of colors per row for grid layout.
~SpritesAux2PalettePanel() override=default
gfx::PaletteGroup * GetPaletteGroup() override
Get the palette group for this card.
int GetPriority() const override
Get display priority for menu ordering.
void DrawPaletteGrid() override
Draw the palette grid specific to this palette type.
static const PaletteGroupMetadata metadata_
static PaletteGroupMetadata InitializeMetadata()
SpritesAux2PalettePanel(Rom *rom, zelda3::GameData *game_data=nullptr)
Sprites Aux3 palette group panel.
static PaletteGroupMetadata InitializeMetadata()
int GetColorsPerRow() const override
Get the number of colors per row for grid layout.
SpritesAux3PalettePanel(Rom *rom, zelda3::GameData *game_data=nullptr)
std::string GetIcon() const override
Material Design icon for this panel.
const PaletteGroupMetadata & GetMetadata() const override
Get metadata for this palette group.
int GetPriority() const override
Get display priority for menu ordering.
void DrawPaletteGrid() override
Draw the palette grid specific to this palette type.
static const PaletteGroupMetadata metadata_
gfx::PaletteGroup * GetPaletteGroup() override
Get the palette group for this card.
~SpritesAux3PalettePanel() override=default
SNES Color container.
Definition snes_color.h:110
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
#define ICON_MD_LANDSCAPE
Definition icons.h:1059
#define ICON_MD_PETS
Definition icons.h:1431
#define ICON_MD_SHIELD
Definition icons.h:1724
#define ICON_MD_FILTER_2
Definition icons.h:752
#define ICON_MD_CASTLE
Definition icons.h:380
#define ICON_MD_FILTER_3
Definition icons.h:753
#define ICON_MD_FILTER_1
Definition icons.h:751
#define ICON_MD_PALETTE
Definition icons.h:1370
#define ICON_MD_WATER
Definition icons.h:2129
Represents a single color change for undo/redo.
Metadata for an entire palette group.
std::vector< PaletteMetadata > palettes
Metadata for a single palette in a group.
Represents a group of palettes.