yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
palette_editor.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_PALETTE_EDITOR_H
2#define YAZE_APP_EDITOR_PALETTE_EDITOR_H
3
4#include <deque>
5#include <optional>
6#include <string>
7#include <vector>
8
9#include "absl/status/status.h"
10#include "app/editor/editor.h"
12
16#include "imgui/imgui.h"
17#include "rom/rom.h"
18
19namespace yaze {
20namespace editor {
21
22namespace palette_internal {
23
31
33 public:
34 void RecordChange(const std::string& group_name, size_t palette_index,
35 size_t color_index, const gfx::SnesColor& original_color,
36 const gfx::SnesColor& new_color) {
37 if (recent_changes_.size() >= kMaxHistorySize) {
38 recent_changes_.pop_front();
39 }
40
41 recent_changes_.push_back(
42 {group_name, palette_index, color_index, original_color, new_color});
43 }
44
45 gfx::SnesColor RestoreOriginalColor(const std::string& group_name,
46 size_t palette_index,
47 size_t color_index) const {
48 for (const auto& change : recent_changes_) {
49 if (change.group_name == group_name &&
50 change.palette_index == palette_index &&
51 change.color_index == color_index) {
52 return change.original_color;
53 }
54 }
55 return gfx::SnesColor();
56 }
57
58 auto size() const { return recent_changes_.size(); }
59
61 return recent_changes_[index].new_color;
62 }
64 return recent_changes_[index].original_color;
65 }
66
67 const std::deque<PaletteChange>& GetRecentChanges() const {
68 return recent_changes_;
69 }
70
71 private:
72 std::deque<PaletteChange> recent_changes_;
73 static const size_t kMaxHistorySize = 50;
74};
75} // namespace palette_internal
76
77absl::Status DisplayPalette(gfx::SnesPalette& palette, bool loaded);
78
83class PaletteEditor : public Editor {
84 public:
85 explicit PaletteEditor(Rom* rom = nullptr) : rom_(rom) {
87 custom_palette_.push_back(gfx::SnesColor(0x7FFF));
88 }
89
90 void SetDependencies(const EditorDependencies& deps) override;
91 void Initialize() override;
92 absl::Status Load() override;
93 absl::Status Update() override;
94 absl::Status Cut() override { return absl::OkStatus(); }
95 absl::Status Copy() override { return absl::OkStatus(); }
96 absl::Status Paste() override { return absl::OkStatus(); }
97 absl::Status Undo() override;
98 absl::Status Redo() override;
99 absl::Status Find() override { return absl::OkStatus(); }
100 // Palette history lives in gfx::PaletteManager, not Editor::undo_manager_.
101 bool CanUndo() const override;
102 bool CanRedo() const override;
103 bool CanCut() const override { return false; }
104 bool CanCopy() const override { return false; }
105 bool CanPaste() const override { return false; }
106 absl::Status Save() override;
107 absl::Status BeginSaveTransaction() override;
108 void RollbackSaveTransaction() override;
109 void CommitSaveTransaction() override;
110
111 void set_rom(Rom* rom) { rom_ = rom; }
112 Rom* rom() const { return rom_; }
113
114 // Override to propagate game_data to embedded components
118
124 void JumpToPalette(const std::string& group_name, int palette_index);
125
126 absl::Status ReloadPaletteCatalog();
128 return palette_catalog_ ? &*palette_catalog_ : nullptr;
129 }
130 const absl::Status& palette_catalog_status() const { return catalog_status_; }
131
132 private:
133 void DrawControlPanel();
134 void DrawPaletteCatalog();
140
141 // Category and search UI methods
143 void DrawSearchBar();
144 bool PassesSearchFilter(const std::string& group_name) const;
145 PaletteGroupPanel* GetPanelForGroup(const std::string& group_name);
146 std::string selected_group_ = "ow_main";
147
148 std::optional<core::PaletteCatalog> palette_catalog_;
149 absl::Status catalog_status_;
151 std::string catalog_path_;
153 size_t catalog_session_id_ = static_cast<size_t>(-1);
154 char catalog_query_[256] = {};
157 bool show_catalog_ = false;
158
159 // Legacy methods (for backward compatibility if needed)
160 void DrawQuickAccessTab();
161 void DrawCustomPalette();
162 absl::Status DrawPaletteGroup(int category, bool right_side = false);
163 absl::Status EditColorInPalette(gfx::SnesPalette& palette, int index);
164 absl::Status ResetColorToOriginal(gfx::SnesPalette& palette, int index,
165 const gfx::SnesPalette& originalPalette);
166 void AddRecentlyUsedColor(const gfx::SnesColor& color);
167 absl::Status HandleColorPopup(gfx::SnesPalette& palette, int i, int j, int n);
168
169 absl::Status status_;
171
172 std::vector<gfx::SnesColor> custom_palette_;
173 std::vector<gfx::SnesColor> recently_used_colors_;
174
176
177 ImVec4 saved_palette_[256] = {};
178
180
182
183 // Search filter for palette groups
184 char search_buffer_[256] = "";
185
186 // Panel visibility flags (legacy; superseded by WorkspaceWindowManager visibility)
188 // Palette panel visibility flags
192 bool show_sprite_panel_ = false;
197 bool show_quick_access_ = false;
199
200 // Palette Panels (formerly Cards)
201 // Non-owning references refreshed through WorkspaceWindowManager before use.
210};
211
212} // namespace editor
213} // namespace yaze
214
215#endif
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.
Interface for editor classes.
Definition editor.h:249
virtual void SetGameData(zelda3::GameData *game_data)
Definition editor.h:259
zelda3::GameData * game_data() const
Definition editor.h:357
EditorType type_
Definition editor.h:369
Equipment/Armor palette group panel.
Overworld Animated palette group panel.
Overworld Main palette group panel.
Allows the user to view and edit in game palettes.
absl::Status DrawPaletteGroup(int category, bool right_side=false)
OverworldAnimatedPalettePanel * ow_anim_panel_
bool CanUndo() const override
std::optional< core::PaletteCatalog > palette_catalog_
const core::PaletteCatalog * palette_catalog() const
absl::Status ResetColorToOriginal(gfx::SnesPalette &palette, int index, const gfx::SnesPalette &originalPalette)
const project::YazeProject * catalog_project_
std::vector< gfx::SnesColor > custom_palette_
SpritesAux1PalettePanel * sprite_aux1_panel_
absl::Status Find() override
void CommitSaveTransaction() override
void RollbackSaveTransaction() override
void DrawCustomPalette()
Draw custom palette editor with enhanced ROM hacking features.
absl::Status BeginSaveTransaction() override
void SetDependencies(const EditorDependencies &deps) override
void AddRecentlyUsedColor(const gfx::SnesColor &color)
absl::Status Update() override
bool PassesSearchFilter(const std::string &group_name) const
PaletteEditor(Rom *rom=nullptr)
absl::Status Undo() override
absl::Status Copy() override
EquipmentPalettePanel * equipment_panel_
SpritePalettePanel * sprite_global_panel_
absl::Status HandleColorPopup(gfx::SnesPalette &palette, int i, int j, int n)
SpritesAux2PalettePanel * sprite_aux2_panel_
bool CanRedo() const override
bool CanPaste() const override
std::vector< gfx::SnesColor > recently_used_colors_
palette_internal::PaletteEditorHistory history_
PaletteGroupPanel * GetPanelForGroup(const std::string &group_name)
absl::Status Save() override
absl::Status Paste() override
absl::Status Load() override
absl::Status Cut() override
bool CanCut() const override
void JumpToPalette(const std::string &group_name, int palette_index)
Jump to a specific palette by group and index.
DungeonMainPalettePanel * dungeon_main_panel_
void SetGameData(zelda3::GameData *game_data) override
SpritesAux3PalettePanel * sprite_aux3_panel_
OverworldMainPalettePanel * ow_main_panel_
absl::Status Redo() override
bool CanCopy() const override
absl::Status EditColorInPalette(gfx::SnesPalette &palette, int index)
const absl::Status & palette_catalog_status() const
Base class for palette group editing cards.
Global Sprite palette group panel.
Sprites Aux1 palette group panel.
Sprites Aux2 palette group panel.
Sprites Aux3 palette group panel.
gfx::SnesColor RestoreOriginalColor(const std::string &group_name, size_t palette_index, size_t color_index) const
void RecordChange(const std::string &group_name, size_t palette_index, size_t color_index, const gfx::SnesColor &original_color, const gfx::SnesColor &new_color)
const std::deque< PaletteChange > & GetRecentChanges() const
SNES Color container.
Definition snes_color.h:110
Represents a palette of colors for the Super Nintendo Entertainment System (SNES).
absl::Status DisplayPalette(gfx::SnesPalette &palette, bool loaded)
Display SNES palette with enhanced ROM hacking features.
Unified dependency container for all editor types.
Definition editor.h:170
Modern project structure with comprehensive settings consolidation.
Definition project.h:287