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 // Same editing surface, without a second save/undo toolbar.
104 void DrawEmbedded();
105
106 // WindowContent Implementation
107 std::string GetId() const override { return "palette." + group_name_; }
108 std::string GetDisplayName() const override { return display_name_; }
109 std::string GetIcon() const override {
110 return ICON_MD_PALETTE;
111 } // Default, override in derived
112 std::string GetEditorCategory() const override { return "Palette"; }
113 // Optional comparison windows reuse the main workspace editing controls.
117 int GetPriority() const override {
118 return 50;
119 } // Default, override in derived
120
121 // ========== Panel Control ==========
122
123 void Show() { show_ = true; }
124 void Hide() { show_ = false; }
125 bool IsVisible() const { return show_; }
126 bool* visibility_flag() { return &show_; }
127
128 void SetToastManager(ToastManager* toast_manager) {
129 toast_manager_ = toast_manager;
130 }
131 void SetProject(const project::YazeProject* project) { project_ = project; }
132 bool IsOwnedByRom(const Rom* rom) const { return rom_ == rom; }
133
134 // ========== Palette Operations ==========
135
139 absl::Status SaveToRom();
140
144 void DiscardChanges();
145
149 void ResetPalette(int palette_index);
150
154 void ResetColor(int palette_index, int color_index);
155
159 void SetColor(int palette_index, int color_index,
160 const gfx::SnesColor& new_color);
161
162 // ========== History Management ==========
163
164 void Undo();
165 void Redo();
166 bool CanUndo() const;
167 bool CanRedo() const;
168 void ClearHistory();
169
170 // ========== State Queries ==========
171
172 bool HasUnsavedChanges() const;
173 bool IsPaletteModified(int palette_index) const;
174 bool IsColorModified(int palette_index, int color_index) const;
175
177 void SetSelectedPaletteIndex(int index);
178
180 void SetSelectedColorIndex(int index) { selected_color_ = index; }
181
182 // ========== Export/Import ==========
183
184 std::string ExportToJson() const;
185 absl::Status ImportFromJson(const std::string& json);
186
187 std::string ExportToClipboard() const;
188 absl::Status ImportFromClipboard();
189
190 protected:
191 // ========== Pure Virtual Methods (Implemented by Derived Classes) ==========
192
197 virtual const gfx::PaletteGroup* GetPaletteGroup() const = 0;
198
202 virtual const PaletteGroupMetadata& GetMetadata() const = 0;
203
207 void DrawPaletteGrid();
208 void DrawContent(bool embedded);
209
213 virtual int GetColorsPerRow() const = 0;
214
215 // ========== Optional Overrides ==========
216
220 virtual void DrawCustomToolbarButtons() {}
221
225 virtual void DrawCustomPanels() {}
226
227 // ========== Common UI Components ==========
228
232 void DrawToolbar();
233
237 void DrawPaletteSelector();
238
242 void DrawColorPicker();
243
247 void DrawColorInfo();
248
252 void DrawMetadataInfo();
253
258
259 // ========== Helper Methods ==========
260
265
269 gfx::SnesColor GetOriginalColor(int palette_index, int color_index) const;
270
272 bool IsManagedSession() const;
273
277 void MarkModified(int palette_index, int color_index);
278
282 void ClearModified(int palette_index);
283
284 // ========== Member Variables ==========
285
286 std::string group_name_; // Internal name (e.g., "ow_main")
287 std::string display_name_; // Display name (e.g., "Overworld Main")
288 Rom* rom_; // ROM instance
289 zelda3::GameData* game_data_ = nullptr; // GameData instance
290 const project::YazeProject* project_ = nullptr; // Session save policy
291 bool show_ = false; // Visibility flag
292
293 // Selection state
294 int selected_palette_ = 0; // Currently selected palette index
295 int selected_color_ = -1; // Currently selected color (-1 = none)
296
297 // Widget identity keeps an optional comparison window from ending the
298 // workspace picker gesture when both render this panel in the same frame.
299 ImGuiID active_picker_ = 0;
300 bool picker_cancelled_ = false;
301
302 // Settings
303 bool show_snes_format_ = true; // Show SNES $xxxx format in info
304 bool show_hex_format_ = true; // Show #xxxxxx hex in info
305
307};
308
309// ============================================================================
310// Concrete Palette Panel Implementations
311// ============================================================================
312
322 public:
323 explicit OverworldMainPalettePanel(Rom* rom,
324 zelda3::GameData* game_data = nullptr);
325 ~OverworldMainPalettePanel() override = default;
326
327 protected:
329 const gfx::PaletteGroup* GetPaletteGroup() const override;
330 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
331 int GetColorsPerRow() const override { return 7; }
332
333 // WindowContent Overrides
334 std::string GetIcon() const override { return ICON_MD_LANDSCAPE; }
335 int GetPriority() const override { return 20; }
336
337 private:
340};
341
348 public:
350 zelda3::GameData* game_data = nullptr);
351 ~OverworldAnimatedPalettePanel() override = default;
352
353 protected:
355 const gfx::PaletteGroup* GetPaletteGroup() const override;
356 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
357 int GetColorsPerRow() const override { return 7; }
358
359 // WindowContent Overrides
360 std::string GetIcon() const override { return ICON_MD_WATER; }
361 int GetPriority() const override { return 30; }
362
363 private:
366};
367
374 public:
375 explicit DungeonMainPalettePanel(Rom* rom,
376 zelda3::GameData* game_data = nullptr);
377 ~DungeonMainPalettePanel() override = default;
378
379 protected:
381 const gfx::PaletteGroup* GetPaletteGroup() const override;
382 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
383 int GetColorsPerRow() const override { return 15; }
384
385 // WindowContent Overrides
386 std::string GetIcon() const override { return ICON_MD_CASTLE; }
387 int GetPriority() const override { return 40; }
388
389 private:
392};
393
403 public:
404 explicit SpritePalettePanel(Rom* rom, zelda3::GameData* game_data = nullptr);
405 ~SpritePalettePanel() override = default;
406
407 protected:
409 const gfx::PaletteGroup* GetPaletteGroup() const override;
410 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
411 int GetColorsPerRow() const override { return 15; }
412 void DrawCustomPanels() override; // Show VRAM info
413
414 // WindowContent Overrides
415 std::string GetIcon() const override { return ICON_MD_PETS; }
416 int GetPriority() const override { return 50; }
417
418 private:
421};
422
430 public:
431 explicit SpritesAux1PalettePanel(Rom* rom,
432 zelda3::GameData* game_data = nullptr);
433 ~SpritesAux1PalettePanel() override = default;
434
435 protected:
437 const gfx::PaletteGroup* GetPaletteGroup() const override;
438 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
439 int GetColorsPerRow() const override { return 7; }
440
441 // WindowContent Overrides
442 std::string GetIcon() const override { return ICON_MD_FILTER_1; }
443 int GetPriority() const override { return 51; }
444
445 private:
448};
449
457 public:
458 explicit SpritesAux2PalettePanel(Rom* rom,
459 zelda3::GameData* game_data = nullptr);
460 ~SpritesAux2PalettePanel() override = default;
461
462 protected:
464 const gfx::PaletteGroup* GetPaletteGroup() const override;
465 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
466 int GetColorsPerRow() const override { return 7; }
467
468 // WindowContent Overrides
469 std::string GetIcon() const override { return ICON_MD_FILTER_2; }
470 int GetPriority() const override { return 52; }
471
472 private:
475};
476
484 public:
485 explicit SpritesAux3PalettePanel(Rom* rom,
486 zelda3::GameData* game_data = nullptr);
487 ~SpritesAux3PalettePanel() override = default;
488
489 protected:
491 const gfx::PaletteGroup* GetPaletteGroup() const override;
492 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
493 int GetColorsPerRow() const override { return 7; }
494
495 // WindowContent Overrides
496 std::string GetIcon() const override { return ICON_MD_FILTER_3; }
497 int GetPriority() const override { return 53; }
498
499 private:
502};
503
510 public:
511 explicit EquipmentPalettePanel(Rom* rom,
512 zelda3::GameData* game_data = nullptr);
513 ~EquipmentPalettePanel() override = default;
514
515 protected:
517 const gfx::PaletteGroup* GetPaletteGroup() const override;
518 const PaletteGroupMetadata& GetMetadata() const override { return metadata_; }
519 int GetColorsPerRow() const override { return 15; }
520
521 // WindowContent Overrides
522 std::string GetIcon() const override { return ICON_MD_SHIELD; }
523 int GetPriority() const override { return 60; }
524
525 private:
528};
529
530} // namespace editor
531} // namespace yaze
532
533#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:49
Dungeon Main palette group panel.
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.
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
Overworld Animated palette group panel.
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.
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)
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 DrawPaletteGrid()
Draw the palette grid specific to this palette type.
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
WindowPresentationPolicy GetPresentationPolicy() const override
How this content is hosted and advertised by workspace chrome.
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)
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)
Sprites Aux1 palette group panel.
gfx::PaletteGroup * GetPaletteGroup() override
Get the palette group for this card.
static PaletteGroupMetadata InitializeMetadata()
~SpritesAux1PalettePanel() override=default
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.
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.
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.
static WindowPresentationPolicy OptionalPopOut()
Represents a group of palettes.
Modern project structure with comprehensive settings consolidation.
Definition project.h:287