yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
minecart_track_editor_panel.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_DUNGEON_PANELS_MINECART_TRACK_EDITOR_PANEL_H
2#define YAZE_APP_EDITOR_DUNGEON_PANELS_MINECART_TRACK_EDITOR_PANEL_H
3
4#include <array>
5#include <cstdint>
6#include <filesystem>
7#include <functional>
8#include <optional>
9#include <string>
10#include <unordered_map>
11#include <utility>
12#include <vector>
13
14#include "absl/status/status.h"
15#include "absl/status/statusor.h"
19#include "app/gui/core/icons.h"
20#include "core/project.h"
21#include "rom/rom.h"
22#include "zelda3/dungeon/room.h"
23
24namespace yaze::editor {
25
27 public:
29 std::function<absl::Status(const project::DungeonOverlaySettings&)>;
30 using ProjectDraftChangedCallback = std::function<absl::Status()>;
31 using ProjectSaveCallback = std::function<absl::Status()>;
32
34
35 // WindowContent overrides
36 std::string GetId() const override { return "dungeon.minecart_tracks"; }
37 std::string GetDisplayName() const override { return "Minecart Tracks"; }
38 std::string GetIcon() const override { return ICON_MD_TRAIN; }
39 std::string GetEditorCategory() const override { return "Dungeon"; }
40
41 void Draw(bool* p_open) override;
42
43 // Custom methods
45 rooms_ = rooms;
46 audit_dirty_ = true;
47 }
48 absl::Status SetProject(project::YazeProject* project);
49 // Reapply project-backed panel state even when the stable session project
50 // pointer and descriptor path did not change.
51 absl::Status RebindProjectContext(project::YazeProject* project);
52 void SetRom(Rom* rom) { rom_ = rom; }
53 absl::Status SaveTracks();
54 absl::Status ReloadTracks();
55 absl::Status DiscardUnpublishedChanges();
56 bool HasUnpublishedChanges() const;
57 absl::StatusOr<std::filesystem::path> ResolveTrackSourcePath() const;
58 absl::Status UpdateTrack(size_t track_index, const MinecartTrack& track);
60 absl::Status PrepareProjectSave();
61
62 // Coordinate picking from dungeon canvas
63 // When picking mode is active, the next canvas click will set the coordinates
64 // for the selected track slot
65 void SetPickedCoordinates(int room_id, uint16_t camera_x, uint16_t camera_y);
66 bool IsPickingCoordinates() const { return picking_mode_; }
68 const std::vector<MinecartTrack>& GetTracks();
69
70 // Callback to navigate to a specific room for coordinate picking
71 using RoomNavigationCallback = std::function<void(int room_id)>;
73 room_navigation_callback_ = std::move(callback);
74 }
76 project_changed_callback_ = std::move(callback);
77 }
82 project_save_callback_ = std::move(callback);
83 }
84
85 private:
87
88 absl::Status LoadTracks();
89 absl::Status ValidateLoadedManifestIdentity() const;
90 absl::Status RefreshProjectBinding();
91 void ResetTrackSession();
92 void StartCoordinatePicking(int track_index);
94 void RebuildAuditCache();
95 bool IsDefaultTrack(const MinecartTrack& track) const;
98 void ClearOverlayInputs();
99
101 std::vector<uint16_t> project::DungeonOverlaySettings::*;
102 bool UpdateOverlayList(const char* label, std::string& input,
103 OverlayListMember member);
104 absl::StatusOr<bool> CommitOverlayList(std::string& input,
105 OverlayListMember member);
106 absl::StatusOr<bool> CommitOverlayInputsForSave();
107 absl::StatusOr<bool> ResetOverlaySettings();
108 absl::Status NotifyProjectChanged(
109 const project::DungeonOverlaySettings& overlay);
110 absl::Status NotifyProjectDraftChanged();
111 absl::Status SaveProjectSettings();
112
115 bool has_stop_tiles = false;
118 std::vector<int> track_subtypes;
119 };
120
121 std::vector<MinecartTrack> tracks_;
122 std::vector<MinecartTrack> loaded_tracks_;
123 std::optional<MinecartTrackSourceDocument> source_document_;
124 std::optional<core::MinecartTrackLayout::Source> loaded_source_identity_;
125 std::filesystem::path loaded_source_path_;
128 std::optional<core::MinecartTrackLayout::Source> bound_source_identity_;
129 Rom* rom_ = nullptr;
132 std::unordered_map<int, RoomTrackAudit> room_audit_;
133 std::unordered_map<int, std::vector<int>> track_usage_rooms_;
134 std::vector<bool> track_subtype_used_;
135 bool audit_dirty_ = true;
136 bool load_attempted_ = false;
137 bool loaded_ = false;
138 std::string status_message_;
139 bool show_success_ = false;
140 float success_timer_ = 0.0f;
141
142 // Coordinate picking state
143 bool picking_mode_ = false;
145
146 // Last picked coordinates (for display)
147 uint16_t last_picked_x_ = 0;
148 uint16_t last_picked_y_ = 0;
149 bool has_picked_coords_ = false;
150
155
156 // Overlay config input state
158 std::optional<project::DungeonOverlaySettings> overlay_inputs_model_;
164};
165
166} // namespace yaze::editor
167
168#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:28
bool IsDefaultTrack(const MinecartTrack &track) const
std::string GetId() const override
Unique identifier for this panel.
std::string GetIcon() const override
Material Design icon for this panel.
std::string GetEditorCategory() const override
Editor category this panel belongs to.
std::optional< core::MinecartTrackLayout::Source > bound_source_identity_
void SetProjectChangedCallback(ProjectChangedCallback callback)
bool UpdateOverlayList(const char *label, std::string &input, OverlayListMember member)
void Draw(bool *p_open) override
Draw the panel content.
const std::vector< MinecartTrack > & GetTracks()
ProjectDraftChangedCallback project_draft_changed_callback_
std::vector< uint16_t > project::DungeonOverlaySettings::* OverlayListMember
std::unordered_map< int, RoomTrackAudit > room_audit_
std::function< void(int room_id)> RoomNavigationCallback
void SetRoomNavigationCallback(RoomNavigationCallback callback)
absl::Status NotifyProjectChanged(const project::DungeonOverlaySettings &overlay)
std::optional< MinecartTrackSourceDocument > source_document_
absl::StatusOr< bool > CommitOverlayList(std::string &input, OverlayListMember member)
absl::Status UpdateTrack(size_t track_index, const MinecartTrack &track)
absl::Status RebindProjectContext(project::YazeProject *project)
absl::StatusOr< std::filesystem::path > ResolveTrackSourcePath() const
absl::Status SetProject(project::YazeProject *project)
std::optional< core::MinecartTrackLayout::Source > loaded_source_identity_
std::function< absl::Status(const project::DungeonOverlaySettings &)> ProjectChangedCallback
std::function< absl::Status()> ProjectSaveCallback
std::unordered_map< int, std::vector< int > > track_usage_rooms_
void SetProjectDraftChangedCallback(ProjectDraftChangedCallback callback)
std::function< absl::Status()> ProjectDraftChangedCallback
void SetProjectSaveCallback(ProjectSaveCallback callback)
std::string GetDisplayName() const override
Human-readable name shown in menus and title bars.
void SetPickedCoordinates(int room_id, uint16_t camera_x, uint16_t camera_y)
std::optional< project::DungeonOverlaySettings > overlay_inputs_model_
Base interface for all logical window content components.
#define ICON_MD_TRAIN
Definition icons.h:2005
Editors are the view controllers for the application.
Dungeon overlay configuration (per-project).
Definition project.h:93
Modern project structure with comprehensive settings consolidation.
Definition project.h:172