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
33
38 int palette_id; // Palette ID in ROM
39 std::string name; // Display name (e.g., "Light World Main")
40 std::string description; // Usage description
41 uint32_t rom_address; // Base ROM address for this palette
42 uint32_t vram_address; // VRAM address (for sprite palettes, 0 if N/A)
43 std::string usage_notes; // Additional usage information
44};
45
50 std::string group_name; // Internal group name
51 std::string display_name; // Display name for UI
52 std::vector<PaletteMetadata> palettes; // Metadata for each palette
53 int colors_per_palette; // Number of colors per palette (usually 8 or 16)
54 int colors_per_row; // Colors per row for grid layout
55};
56
71 public:
80 PaletteGroupPanel(const std::string& group_name,
81 const std::string& display_name, Rom* rom,
82 zelda3::GameData* game_data = nullptr);
83
84 void SetGameData(zelda3::GameData* game_data) { game_data_ = game_data; }
85
86 virtual ~PaletteGroupPanel() = default;
87
88 // ========== Main Rendering ==========
89
96 void Draw(bool* p_open) override;
97
98 // EditorPanel Implementation
99 std::string GetId() const override { return "palette." + group_name_; }
100 std::string GetDisplayName() const override { return display_name_; }
101 std::string GetIcon() const override { return ICON_MD_PALETTE; } // Default, override in derived
102 std::string GetEditorCategory() const override { return "Palette"; }
103 int GetPriority() const override { return 50; } // Default, override in derived
104
105 // ========== Panel Control ==========
106
107 void Show() { show_ = true; }
108 void Hide() { show_ = false; }
109 bool IsVisible() const { return show_; }
110 bool* visibility_flag() { return &show_; }
111
112 // ========== Palette Operations ==========
113
117 absl::Status SaveToRom();
118
122 void DiscardChanges();
123
127 void ResetPalette(int palette_index);
128
132 void ResetColor(int palette_index, int color_index);
133
137 void SetColor(int palette_index, int color_index,
138 const gfx::SnesColor& new_color);
139
140 // ========== History Management ==========
141
142 void Undo();
143 void Redo();
144 bool CanUndo() const;
145 bool CanRedo() const;
146 void ClearHistory();
147
148 // ========== State Queries ==========
149
150 bool HasUnsavedChanges() const;
151 bool IsPaletteModified(int palette_index) const;
152 bool IsColorModified(int palette_index, int color_index) const;
153
155 void SetSelectedPaletteIndex(int index) { selected_palette_ = index; }
156
158 void SetSelectedColorIndex(int index) { selected_color_ = index; }
159
160 // ========== Export/Import ==========
161
162 std::string ExportToJson() const;
163 absl::Status ImportFromJson(const std::string& json);
164
165 std::string ExportToClipboard() const;
166 absl::Status ImportFromClipboard();
167
168 protected:
169 // ========== Pure Virtual Methods (Implemented by Derived Classes) ==========
170
175 virtual const gfx::PaletteGroup* GetPaletteGroup() const = 0;
176
180 virtual const PaletteGroupMetadata& GetMetadata() const = 0;
181
185 virtual void DrawPaletteGrid() = 0;
186
190 virtual int GetColorsPerRow() const = 0;
191
192 // ========== Optional Overrides ==========
193
197 virtual void DrawCustomToolbarButtons() {}
198
202 virtual void DrawCustomPanels() {}
203
204 // ========== Common UI Components ==========
205
209 void DrawToolbar();
210
214 void DrawPaletteSelector();
215
219 void DrawColorPicker();
220
224 void DrawColorInfo();
225
229 void DrawMetadataInfo();
230
235
236 // ========== Helper Methods ==========
237
242
246 gfx::SnesColor GetOriginalColor(int palette_index, int color_index) const;
247
251 absl::Status WriteColorToRom(int palette_index, int color_index,
252 const gfx::SnesColor& color);
253
257 void MarkModified(int palette_index, int color_index);
258
262 void ClearModified(int palette_index);
263
264 // ========== Member Variables ==========
265
266 std::string group_name_; // Internal name (e.g., "ow_main")
267 std::string display_name_; // Display name (e.g., "Overworld Main")
268 Rom* rom_; // ROM instance
269 zelda3::GameData* game_data_ = nullptr; // GameData instance
270 bool show_ = false; // Visibility flag
271
272 // Selection state
273 int selected_palette_ = 0; // Currently selected palette index
274 int selected_color_ = -1; // Currently selected color (-1 = none)
275 gfx::SnesColor editing_color_; // Color being edited in picker
276
277 // Settings
278 bool auto_save_enabled_ = false; // Auto-save to ROM on every change
279 bool show_snes_format_ = true; // Show SNES $xxxx format in info
280 bool show_hex_format_ = true; // Show #xxxxxx hex in info
281};
282
283// ============================================================================
284// Concrete Palette Panel Implementations
285// ============================================================================
286
296 public:
297 explicit OverworldMainPalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
298 ~OverworldMainPalettePanel() override = default;
299
300 protected:
302 const gfx::PaletteGroup* GetPaletteGroup() const override;
303 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
304 void DrawPaletteGrid() override;
305 int GetColorsPerRow() const override { return 8; }
306
307 // EditorPanel Overrides
308 std::string GetIcon() const override { return ICON_MD_LANDSCAPE; }
309 int GetPriority() const override { return 20; }
310
311 private:
314};
315
322 public:
323 explicit OverworldAnimatedPalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
324 ~OverworldAnimatedPalettePanel() override = default;
325
326 protected:
328 const gfx::PaletteGroup* GetPaletteGroup() const override;
329 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
330 void DrawPaletteGrid() override;
331 int GetColorsPerRow() const override { return 8; }
332
333 // EditorPanel Overrides
334 std::string GetIcon() const override { return ICON_MD_WATER; }
335 int GetPriority() const override { return 30; }
336
337 private:
340};
341
348 public:
349 explicit DungeonMainPalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
350 ~DungeonMainPalettePanel() override = default;
351
352 protected:
354 const gfx::PaletteGroup* GetPaletteGroup() const override;
355 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
356 void DrawPaletteGrid() override;
357 int GetColorsPerRow() const override { return 16; }
358
359 // EditorPanel Overrides
360 std::string GetIcon() const override { return ICON_MD_CASTLE; }
361 int GetPriority() const override { return 40; }
362
363 private:
366};
367
377 public:
378 explicit SpritePalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
379 ~SpritePalettePanel() override = default;
380
381 protected:
383 const gfx::PaletteGroup* GetPaletteGroup() const override;
384 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
385 void DrawPaletteGrid() override;
386 int GetColorsPerRow() const override { return 16; }
387 void DrawCustomPanels() override; // Show VRAM info
388
389 // EditorPanel Overrides
390 std::string GetIcon() const override { return ICON_MD_PETS; }
391 int GetPriority() const override { return 50; }
392
393
394
395 private:
398};
399
407 public:
408 explicit SpritesAux1PalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
409 ~SpritesAux1PalettePanel() override = default;
410
411 protected:
413 const gfx::PaletteGroup* GetPaletteGroup() const override;
414 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
415 void DrawPaletteGrid() override;
416 int GetColorsPerRow() const override { return 8; }
417
418 // EditorPanel Overrides
419 std::string GetIcon() const override { return ICON_MD_FILTER_1; }
420 int GetPriority() const override { return 51; }
421
422 private:
425};
426
434 public:
435 explicit SpritesAux2PalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
436 ~SpritesAux2PalettePanel() override = default;
437
438 protected:
440 const gfx::PaletteGroup* GetPaletteGroup() const override;
441 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
442 void DrawPaletteGrid() override;
443 int GetColorsPerRow() const override { return 8; }
444
445 // EditorPanel Overrides
446 std::string GetIcon() const override { return ICON_MD_FILTER_2; }
447 int GetPriority() const override { return 52; }
448
449 private:
452};
453
461 public:
462 explicit SpritesAux3PalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
463 ~SpritesAux3PalettePanel() override = default;
464
465 protected:
467 const gfx::PaletteGroup* GetPaletteGroup() const override;
468 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
469 void DrawPaletteGrid() override;
470 int GetColorsPerRow() const override { return 8; }
471
472 // EditorPanel Overrides
473 std::string GetIcon() const override { return ICON_MD_FILTER_3; }
474 int GetPriority() const override { return 53; }
475
476 private:
479};
480
487 public:
488 explicit EquipmentPalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
489 ~EquipmentPalettePanel() override = default;
490
491 protected:
493 const gfx::PaletteGroup* GetPaletteGroup() const override;
494 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
495 void DrawPaletteGrid() override;
496 int GetColorsPerRow() const override { return 8; }
497
498 // EditorPanel Overrides
499 std::string GetIcon() const override { return ICON_MD_SHIELD; }
500 int GetPriority() const override { return 60; }
501
502 private:
505};
506
507} // namespace editor
508} // namespace yaze
509
510#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:24
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)
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.