yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
music_undo_actions.h
Go to the documentation of this file.
1#ifndef YAZE_APP_EDITOR_MUSIC_UNDO_ACTIONS_H_
2#define YAZE_APP_EDITOR_MUSIC_UNDO_ACTIONS_H_
3
4#include <cstddef>
5#include <string>
6#include <utility>
7
8#include "absl/status/status.h"
9#include "absl/strings/str_format.h"
13
14namespace yaze {
15namespace editor {
16
26 public:
27 MusicSongEditAction(int song_index,
28 zelda3::music::MusicSong before_snapshot,
29 zelda3::music::MusicSong after_snapshot,
30 zelda3::music::MusicBank* music_bank)
31 : song_index_(song_index),
32 before_snapshot_(std::move(before_snapshot)),
33 after_snapshot_(std::move(after_snapshot)),
34 music_bank_(music_bank) {}
35
36 absl::Status Undo() override {
37 auto* song = music_bank_->GetSong(song_index_);
38 if (!song) {
39 return absl::OutOfRangeError(
40 absl::StrFormat("Song %d out of range", song_index_));
41 }
42 *song = before_snapshot_;
43 return absl::OkStatus();
44 }
45
46 absl::Status Redo() override {
47 auto* song = music_bank_->GetSong(song_index_);
48 if (!song) {
49 return absl::OutOfRangeError(
50 absl::StrFormat("Song %d out of range", song_index_));
51 }
52 *song = after_snapshot_;
53 return absl::OkStatus();
54 }
55
56 std::string Description() const override {
57 return absl::StrFormat("Edit song %d", song_index_);
58 }
59
60 size_t MemoryUsage() const override {
61 // Rough estimate based on segment count
62 size_t usage = sizeof(*this);
63 for (const auto& seg : before_snapshot_.segments) {
64 for (const auto& track : seg.tracks) {
65 usage += track.events.capacity() * sizeof(zelda3::music::TrackEvent);
66 }
67 }
68 for (const auto& seg : after_snapshot_.segments) {
69 for (const auto& track : seg.tracks) {
70 usage += track.events.capacity() * sizeof(zelda3::music::TrackEvent);
71 }
72 }
73 return usage;
74 }
75
76 private:
81};
82
83} // namespace editor
84} // namespace yaze
85
86#endif // YAZE_APP_EDITOR_MUSIC_UNDO_ACTIONS_H_
Undoable action for edits to a music song.
zelda3::music::MusicBank * music_bank_
zelda3::music::MusicSong before_snapshot_
size_t MemoryUsage() const override
Approximate memory footprint for budget enforcement.
MusicSongEditAction(int song_index, zelda3::music::MusicSong before_snapshot, zelda3::music::MusicSong after_snapshot, zelda3::music::MusicBank *music_bank)
zelda3::music::MusicSong after_snapshot_
std::string Description() const override
Human-readable description (e.g., "Paint 12 tiles on map 5")
Abstract base for all undoable actions (Command pattern)
Definition undo_action.h:20
Manages the collection of songs, instruments, and samples from a ROM.
Definition music_bank.h:27
MusicSong * GetSong(int index)
Get a song by index.
A complete song composed of segments.
Definition song_data.h:334
std::vector< MusicSegment > segments
Definition song_data.h:336
A single event in a music track (note, command, or control).
Definition song_data.h:247