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 "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 using CollisionBatchApplyCallback = std::function<absl::Status(
33 const std::vector<zelda3::TrackCollisionResult>&,
35
37
38 // WindowContent overrides
39 std::string GetId() const override { return "dungeon.minecart_tracks"; }
40 std::string GetWorkflowGroup() const override { return "Editors"; }
41 std::string GetDisplayName() const override { return "Minecart Tracks"; }
42 std::string GetIcon() const override { return ICON_MD_TRAIN; }
43 std::string GetEditorCategory() const override { return "Dungeon"; }
44
45 void Draw(bool* p_open) override;
46
47 // Custom methods
49 if (rooms_ != rooms) {
50 collision_preview_.clear();
52 }
53 rooms_ = rooms;
54 audit_dirty_ = true;
56 }
57 absl::Status SetProject(project::YazeProject* project);
58 // Reapply project-backed panel state even when the stable session project
59 // pointer and descriptor path did not change.
60 absl::Status RebindProjectContext(project::YazeProject* project);
61 absl::Status SaveTracks();
62 absl::Status ReloadTracks();
63 absl::Status DiscardUnpublishedChanges();
64 bool HasUnpublishedChanges() const;
65 absl::StatusOr<std::filesystem::path> ResolveTrackSourcePath() const;
66 absl::Status UpdateTrack(size_t track_index, const MinecartTrack& track);
68 absl::Status PrepareProjectSave();
69
70 // Coordinate picking from dungeon canvas
71 // When picking mode is active, the next canvas click will set the coordinates
72 // for the selected track slot
73 void SetPickedCoordinates(int room_id, uint16_t camera_x, uint16_t camera_y);
74 bool IsPickingCoordinates() const { return picking_mode_; }
76 const std::vector<MinecartTrack>& GetTracks();
77
78 // Callback to navigate to a specific room for coordinate picking
79 using RoomNavigationCallback = std::function<void(int room_id)>;
81 room_navigation_callback_ = std::move(callback);
82 }
84 project_changed_callback_ = std::move(callback);
85 }
90 project_save_callback_ = std::move(callback);
91 }
112
113 private:
115
116 absl::Status LoadTracks();
117 absl::Status ValidateLoadedManifestIdentity() const;
118 absl::Status RefreshProjectBinding();
119 void ResetTrackSession();
120 void StartCoordinatePicking(int track_index);
122 void RebuildAuditCache(bool include_unmaterialized = false);
123 absl::Status BuildCollisionPreview(const std::vector<int>& room_ids);
125 absl::Status ApplyCollisionPreview();
127 absl::StatusOr<zelda3::GeneratorOptions> ResolveGeneratorOptions() const;
128 bool IsDefaultTrack(const MinecartTrack& track) const;
129 void DrawOverlaySettings();
131 void ClearOverlayInputs();
132
134 std::vector<uint16_t> project::DungeonOverlaySettings::*;
135 bool UpdateOverlayList(const char* label, std::string& input,
136 OverlayListMember member);
137 absl::StatusOr<bool> CommitOverlayList(std::string& input,
138 OverlayListMember member);
139 absl::StatusOr<bool> CommitOverlayInputsForSave();
140 absl::StatusOr<bool> ResetOverlaySettings();
141 absl::Status NotifyProjectChanged(
142 const project::DungeonOverlaySettings& overlay);
143 absl::Status NotifyProjectDraftChanged();
144 absl::Status SaveProjectSettings();
145
149 bool has_stop_tiles = false;
152 std::vector<int> track_subtypes;
153 std::vector<int> route_slots;
154 };
155
156 std::vector<MinecartTrack> tracks_;
157 std::vector<MinecartTrack> loaded_tracks_;
158 std::optional<MinecartTrackSourceDocument> source_document_;
159 std::optional<core::MinecartTrackLayout::Source> loaded_source_identity_;
160 std::filesystem::path loaded_source_path_;
163 std::optional<core::MinecartTrackLayout::Source> bound_source_identity_;
166 std::unordered_map<int, RoomTrackAudit> room_audit_;
167 std::unordered_map<int, std::vector<int>> route_usage_rooms_;
168 std::vector<bool> route_slot_used_;
169 std::vector<zelda3::TrackCollisionResult> collision_preview_;
171 bool audit_dirty_ = true;
173 bool load_attempted_ = false;
174 bool loaded_ = false;
175 std::string status_message_;
176 bool show_success_ = false;
177 float success_timer_ = 0.0f;
178
179 // Coordinate picking state
180 bool picking_mode_ = false;
182
183 // Last picked coordinates (for display)
184 uint16_t last_picked_x_ = 0;
185 uint16_t last_picked_y_ = 0;
186 bool has_picked_coords_ = false;
187
193
194 // Overlay config input state
196 std::optional<project::DungeonOverlaySettings> overlay_inputs_model_;
202};
203
204} // namespace yaze::editor
205
206#endif
std::string GetWorkflowGroup() const override
Optional workflow group for hack-centric actions.
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.
absl::StatusOr< zelda3::GeneratorOptions > ResolveGeneratorOptions() const
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
std::function< absl::Status( const std::vector< zelda3::TrackCollisionResult > &, const zelda3::GeneratorOptions &)> CollisionBatchApplyCallback
CollisionBatchApplyCallback collision_batch_apply_callback_
void SetRoomNavigationCallback(RoomNavigationCallback callback)
absl::Status NotifyProjectChanged(const project::DungeonOverlaySettings &overlay)
std::vector< zelda3::TrackCollisionResult > collision_preview_
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 BuildCollisionPreview(const std::vector< int > &room_ids)
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 > > route_usage_rooms_
void SetCollisionBatchApplyCallback(CollisionBatchApplyCallback callback)
void RebuildAuditCache(bool include_unmaterialized=false)
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