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"
15#include "app/gui/core/icons.h"
16#include "imgui/imgui.h"
17#include "rom/rom.h"
18#include "zelda3/game_data.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 // WindowContent 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 {
105 return ICON_MD_PALETTE;
106 } // Default, override in derived
107 std::string GetEditorCategory() const override { return "Palette"; }
108 int GetPriority() const override {
109 return 50;
110 } // Default, override in derived
111
112 // ========== Panel Control ==========
113
114 void Show() { show_ = true; }
115 void Hide() { show_ = false; }
116 bool IsVisible() const { return show_; }
117 bool* visibility_flag() { return &show_; }
118
119 void SetToastManager(ToastManager* toast_manager) {
120 toast_manager_ = toast_manager;
121 }
122
123 // ========== Palette Operations ==========
124
128 absl::Status SaveToRom();
129
133 void DiscardChanges();
134
138 void ResetPalette(int palette_index);
139
143 void ResetColor(int palette_index, int color_index);
144
148 void SetColor(int palette_index, int color_index,
149 const gfx::SnesColor& new_color);
150
151 // ========== History Management ==========
152
153 void Undo();
154 void Redo();
155 bool CanUndo() const;
156 bool CanRedo() const;
157 void ClearHistory();
158
159 // ========== State Queries ==========
160
161 bool HasUnsavedChanges() const;
162 bool IsPaletteModified(int palette_index) const;
163 bool IsColorModified(int palette_index, int color_index) const;
164
166 void SetSelectedPaletteIndex(int index) { selected_palette_ = index; }
167
169 void SetSelectedColorIndex(int index) { selected_color_ = index; }
170
171 // ========== Export/Import ==========
172
173 std::string ExportToJson() const;
174 absl::Status ImportFromJson(const std::string& json);
175
176 std::string ExportToClipboard() const;
177 absl::Status ImportFromClipboard();
178
179 protected:
180 // ========== Pure Virtual Methods (Implemented by Derived Classes) ==========
181
186 virtual const gfx::PaletteGroup* GetPaletteGroup() const = 0;
187
191 virtual const PaletteGroupMetadata& GetMetadata() const = 0;
192
196 virtual void DrawPaletteGrid() = 0;
197
201 virtual int GetColorsPerRow() const = 0;
202
203 // ========== Optional Overrides ==========
204
208 virtual void DrawCustomToolbarButtons() {}
209
213 virtual void DrawCustomPanels() {}
214
215 // ========== Common UI Components ==========
216
220 void DrawToolbar();
221
225 void DrawPaletteSelector();
226
230 void DrawColorPicker();
231
235 void DrawColorInfo();
236
240 void DrawMetadataInfo();
241
246
247 // ========== Helper Methods ==========
248
253
257 gfx::SnesColor GetOriginalColor(int palette_index, int color_index) const;
258
262 absl::Status WriteColorToRom(int palette_index, int color_index,
263 const gfx::SnesColor& color);
264
266 bool IsManagedSession() const;
267
271 void MarkModified(int palette_index, int color_index);
272
276 void ClearModified(int palette_index);
277
278 // ========== Member Variables ==========
279
280 std::string group_name_; // Internal name (e.g., "ow_main")
281 std::string display_name_; // Display name (e.g., "Overworld Main")
282 Rom* rom_; // ROM instance
283 zelda3::GameData* game_data_ = nullptr; // GameData instance
284 bool show_ = false; // Visibility flag
285
286 // Selection state
287 int selected_palette_ = 0; // Currently selected palette index
288 int selected_color_ = -1; // Currently selected color (-1 = none)
289 gfx::SnesColor editing_color_; // Color being edited in picker
290
291 // Settings
292 bool auto_save_enabled_ = false; // Auto-save to ROM on every change
293 bool show_snes_format_ = true; // Show SNES $xxxx format in info
294 bool show_hex_format_ = true; // Show #xxxxxx hex in info
295
297};
298
299// ============================================================================
300// Concrete Palette Panel Implementations
301// ============================================================================
302
312 public:
313 explicit OverworldMainPalettePanel(Rom* rom,
314 zelda3::GameData* game_data = nullptr);
315 ~OverworldMainPalettePanel() override = default;
316
317 protected:
319 const gfx::PaletteGroup* GetPaletteGroup() const override;
320 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
321 void DrawPaletteGrid() override;
322 int GetColorsPerRow() const override { return 7; }
323
324 // WindowContent Overrides
325 std::string GetIcon() const override { return ICON_MD_LANDSCAPE; }
326 int GetPriority() const override { return 20; }
327
328 private:
331};
332
339 public:
341 zelda3::GameData* game_data = nullptr);
342 ~OverworldAnimatedPalettePanel() override = default;
343
344 protected:
346 const gfx::PaletteGroup* GetPaletteGroup() const override;
347 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
348 void DrawPaletteGrid() override;
349 int GetColorsPerRow() const override { return 7; }
350
351 // WindowContent Overrides
352 std::string GetIcon() const override { return ICON_MD_WATER; }
353 int GetPriority() const override { return 30; }
354
355 private:
358};
359
366 public:
367 explicit DungeonMainPalettePanel(Rom* rom,
368 zelda3::GameData* game_data = nullptr);
369 ~DungeonMainPalettePanel() override = default;
370
371 protected:
373 const gfx::PaletteGroup* GetPaletteGroup() const override;
374 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
375 void DrawPaletteGrid() override;
376 int GetColorsPerRow() const override { return 15; }
377
378 // WindowContent Overrides
379 std::string GetIcon() const override { return ICON_MD_CASTLE; }
380 int GetPriority() const override { return 40; }
381
382 private:
385};
386
396 public:
397 explicit SpritePalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
398 ~SpritePalettePanel() override = default;
399
400 protected:
402 const gfx::PaletteGroup* GetPaletteGroup() const override;
403 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
404 void DrawPaletteGrid() override;
405 int GetColorsPerRow() const override { return 15; }
406 void DrawCustomPanels() override; // Show VRAM info
407
408 // WindowContent Overrides
409 std::string GetIcon() const override { return ICON_MD_PETS; }
410 int GetPriority() const override { return 50; }
411
412 private:
415};
416
424 public:
425 explicit SpritesAux1PalettePanel(Rom* rom,
426 zelda3::GameData* game_data = nullptr);
427 ~SpritesAux1PalettePanel() override = default;
428
429 protected:
431 const gfx::PaletteGroup* GetPaletteGroup() const override;
432 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
433 void DrawPaletteGrid() override;
434 int GetColorsPerRow() const override { return 7; }
435
436 // WindowContent Overrides
437 std::string GetIcon() const override { return ICON_MD_FILTER_1; }
438 int GetPriority() const override { return 51; }
439
440 private:
443};
444
452 public:
453 explicit SpritesAux2PalettePanel(Rom* rom,
454 zelda3::GameData* game_data = nullptr);
455 ~SpritesAux2PalettePanel() override = default;
456
457 protected:
459 const gfx::PaletteGroup* GetPaletteGroup() const override;
460 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
461 void DrawPaletteGrid() override;
462 int GetColorsPerRow() const override { return 7; }
463
464 // WindowContent Overrides
465 std::string GetIcon() const override { return ICON_MD_FILTER_2; }
466 int GetPriority() const override { return 52; }
467
468 private:
471};
472
480 public:
481 explicit SpritesAux3PalettePanel(Rom* rom,
482 zelda3::GameData* game_data = nullptr);
483 ~SpritesAux3PalettePanel() override = default;
484
485 protected:
487 const gfx::PaletteGroup* GetPaletteGroup() const override;
488 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
489 void DrawPaletteGrid() override;
490 int GetColorsPerRow() const override { return 7; }
491
492 // WindowContent Overrides
493 std::string GetIcon() const override { return ICON_MD_FILTER_3; }
494 int GetPriority() const override { return 53; }
495
496 private:
499};
500
507 public:
508 explicit EquipmentPalettePanel(Rom* rom,
509 zelda3::GameData* game_data = nullptr);
510 ~EquipmentPalettePanel() override = default;
511
512 protected:
514 const gfx::PaletteGroup* GetPaletteGroup() const override;
515 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
516 void DrawPaletteGrid() override;
517 int GetColorsPerRow() const override { return 15; }
518
519 // WindowContent Overrides
520 std::string GetIcon() const override { return ICON_MD_SHIELD; }
521 int GetPriority() const override { return 60; }
522
523 private:
526};
527
528} // namespace editor
529} // namespace yaze
530
531#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.
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
bool IsManagedSession() const
Return true only while PaletteManager is bound to this panel's session.
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
Base interface for all logical window content components.
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.