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 project {
22struct YazeProject;
23}
24namespace editor {
25
26// Forward declaration
27class ToastManager;
28
39
44 int palette_id; // Palette ID in ROM
45 std::string name; // Display name (e.g., "Light World Main")
46 std::string description; // Usage description
47 uint32_t rom_address; // Base ROM address for this palette
48 uint32_t vram_address; // VRAM address (for sprite palettes, 0 if N/A)
49 std::string usage_notes; // Additional usage information
50};
51
56 std::string group_name; // Internal group name
57 std::string display_name; // Display name for UI
58 std::vector<PaletteMetadata> palettes; // Metadata for each palette
59 int colors_per_palette; // Number of colors per palette (usually 8 or 16)
60 int colors_per_row; // Colors per row for grid layout
61};
62
77 public:
86 PaletteGroupPanel(const std::string& group_name,
87 const std::string& display_name, Rom* rom,
88 zelda3::GameData* game_data = nullptr);
89
90 void SetGameData(zelda3::GameData* game_data) { game_data_ = game_data; }
91
92 virtual ~PaletteGroupPanel() = default;
93
94 // ========== Main Rendering ==========
95
102 void Draw(bool* p_open) override;
103
104 // WindowContent Implementation
105 std::string GetId() const override { return "palette." + group_name_; }
106 std::string GetDisplayName() const override { return display_name_; }
107 std::string GetIcon() const override {
108 return ICON_MD_PALETTE;
109 } // Default, override in derived
110 std::string GetEditorCategory() const override { return "Palette"; }
111 int GetPriority() const override {
112 return 50;
113 } // Default, override in derived
114
115 // ========== Panel Control ==========
116
117 void Show() { show_ = true; }
118 void Hide() { show_ = false; }
119 bool IsVisible() const { return show_; }
120 bool* visibility_flag() { return &show_; }
121
122 void SetToastManager(ToastManager* toast_manager) {
123 toast_manager_ = toast_manager;
124 }
125 void SetProject(const project::YazeProject* project) { project_ = project; }
126 bool IsOwnedByRom(const Rom* rom) const { return rom_ == rom; }
127
128 // ========== Palette Operations ==========
129
133 absl::Status SaveToRom();
134
138 void DiscardChanges();
139
143 void ResetPalette(int palette_index);
144
148 void ResetColor(int palette_index, int color_index);
149
153 void SetColor(int palette_index, int color_index,
154 const gfx::SnesColor& new_color);
155
156 // ========== History Management ==========
157
158 void Undo();
159 void Redo();
160 bool CanUndo() const;
161 bool CanRedo() const;
162 void ClearHistory();
163
164 // ========== State Queries ==========
165
166 bool HasUnsavedChanges() const;
167 bool IsPaletteModified(int palette_index) const;
168 bool IsColorModified(int palette_index, int color_index) const;
169
171 void SetSelectedPaletteIndex(int index) { selected_palette_ = index; }
172
174 void SetSelectedColorIndex(int index) { selected_color_ = index; }
175
176 // ========== Export/Import ==========
177
178 std::string ExportToJson() const;
179 absl::Status ImportFromJson(const std::string& json);
180
181 std::string ExportToClipboard() const;
182 absl::Status ImportFromClipboard();
183
184 protected:
185 // ========== Pure Virtual Methods (Implemented by Derived Classes) ==========
186
191 virtual const gfx::PaletteGroup* GetPaletteGroup() const = 0;
192
196 virtual const PaletteGroupMetadata& GetMetadata() const = 0;
197
201 virtual void DrawPaletteGrid() = 0;
202
206 virtual int GetColorsPerRow() const = 0;
207
208 // ========== Optional Overrides ==========
209
213 virtual void DrawCustomToolbarButtons() {}
214
218 virtual void DrawCustomPanels() {}
219
220 // ========== Common UI Components ==========
221
225 void DrawToolbar();
226
230 void DrawPaletteSelector();
231
235 void DrawColorPicker();
236
240 void DrawColorInfo();
241
245 void DrawMetadataInfo();
246
251
252 // ========== Helper Methods ==========
253
258
262 gfx::SnesColor GetOriginalColor(int palette_index, int color_index) const;
263
265 bool IsManagedSession() const;
266
270 void MarkModified(int palette_index, int color_index);
271
275 void ClearModified(int palette_index);
276
277 // ========== Member Variables ==========
278
279 std::string group_name_; // Internal name (e.g., "ow_main")
280 std::string display_name_; // Display name (e.g., "Overworld Main")
281 Rom* rom_; // ROM instance
282 zelda3::GameData* game_data_ = nullptr; // GameData instance
283 const project::YazeProject* project_ = nullptr; // Session save policy
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 show_snes_format_ = true; // Show SNES $xxxx format in info
293 bool show_hex_format_ = true; // Show #xxxxxx hex in info
294
296};
297
298// ============================================================================
299// Concrete Palette Panel Implementations
300// ============================================================================
301
311 public:
312 explicit OverworldMainPalettePanel(Rom* rom,
313 zelda3::GameData* game_data = nullptr);
314 ~OverworldMainPalettePanel() override = default;
315
316 protected:
318 const gfx::PaletteGroup* GetPaletteGroup() const override;
319 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
320 void DrawPaletteGrid() override;
321 int GetColorsPerRow() const override { return 7; }
322
323 // WindowContent Overrides
324 std::string GetIcon() const override { return ICON_MD_LANDSCAPE; }
325 int GetPriority() const override { return 20; }
326
327 private:
330};
331
338 public:
340 zelda3::GameData* game_data = nullptr);
341 ~OverworldAnimatedPalettePanel() override = default;
342
343 protected:
345 const gfx::PaletteGroup* GetPaletteGroup() const override;
346 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
347 void DrawPaletteGrid() override;
348 int GetColorsPerRow() const override { return 7; }
349
350 // WindowContent Overrides
351 std::string GetIcon() const override { return ICON_MD_WATER; }
352 int GetPriority() const override { return 30; }
353
354 private:
357};
358
365 public:
366 explicit DungeonMainPalettePanel(Rom* rom,
367 zelda3::GameData* game_data = nullptr);
368 ~DungeonMainPalettePanel() override = default;
369
370 protected:
372 const gfx::PaletteGroup* GetPaletteGroup() const override;
373 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
374 void DrawPaletteGrid() override;
375 int GetColorsPerRow() const override { return 15; }
376
377 // WindowContent Overrides
378 std::string GetIcon() const override { return ICON_MD_CASTLE; }
379 int GetPriority() const override { return 40; }
380
381 private:
384};
385
395 public:
396 explicit SpritePalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
397 ~SpritePalettePanel() override = default;
398
399 protected:
401 const gfx::PaletteGroup* GetPaletteGroup() const override;
402 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
403 void DrawPaletteGrid() override;
404 int GetColorsPerRow() const override { return 15; }
405 void DrawCustomPanels() override; // Show VRAM info
406
407 // WindowContent Overrides
408 std::string GetIcon() const override { return ICON_MD_PETS; }
409 int GetPriority() const override { return 50; }
410
411 private:
414};
415
423 public:
424 explicit SpritesAux1PalettePanel(Rom* rom,
425 zelda3::GameData* game_data = nullptr);
426 ~SpritesAux1PalettePanel() override = default;
427
428 protected:
430 const gfx::PaletteGroup* GetPaletteGroup() const override;
431 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
432 void DrawPaletteGrid() override;
433 int GetColorsPerRow() const override { return 7; }
434
435 // WindowContent Overrides
436 std::string GetIcon() const override { return ICON_MD_FILTER_1; }
437 int GetPriority() const override { return 51; }
438
439 private:
442};
443
451 public:
452 explicit SpritesAux2PalettePanel(Rom* rom,
453 zelda3::GameData* game_data = nullptr);
454 ~SpritesAux2PalettePanel() override = default;
455
456 protected:
458 const gfx::PaletteGroup* GetPaletteGroup() const override;
459 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
460 void DrawPaletteGrid() override;
461 int GetColorsPerRow() const override { return 7; }
462
463 // WindowContent Overrides
464 std::string GetIcon() const override { return ICON_MD_FILTER_2; }
465 int GetPriority() const override { return 52; }
466
467 private:
470};
471
479 public:
480 explicit SpritesAux3PalettePanel(Rom* rom,
481 zelda3::GameData* game_data = nullptr);
482 ~SpritesAux3PalettePanel() override = default;
483
484 protected:
486 const gfx::PaletteGroup* GetPaletteGroup() const override;
487 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
488 void DrawPaletteGrid() override;
489 int GetColorsPerRow() const override { return 7; }
490
491 // WindowContent Overrides
492 std::string GetIcon() const override { return ICON_MD_FILTER_3; }
493 int GetPriority() const override { return 53; }
494
495 private:
498};
499
506 public:
507 explicit EquipmentPalettePanel(Rom* rom,
508 zelda3::GameData* game_data = nullptr);
509 ~EquipmentPalettePanel() override = default;
510
511 protected:
513 const gfx::PaletteGroup* GetPaletteGroup() const override;
514 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
515 void DrawPaletteGrid() override;
516 int GetColorsPerRow() const override { return 15; }
517
518 // WindowContent Overrides
519 std::string GetIcon() const override { return ICON_MD_SHIELD; }
520 int GetPriority() const override { return 60; }
521
522 private:
525};
526
527} // namespace editor
528} // namespace yaze
529
530#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.
const project::YazeProject * project_
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)
void SetProject(const project::YazeProject *project)
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.
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
bool IsOwnedByRom(const Rom *rom) const
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.
Modern project structure with comprehensive settings consolidation.
Definition project.h:172