20 using States = std::vector<std::pair<int, Snapshot>>;
23 : before_(std::move(before)),
24 after_(std::move(after)),
25 restore_(std::move(restore)) {}
26 absl::Status
Undo()
override {
return restore_(before_); }
27 absl::Status
Redo()
override {
return restore_(after_); }
29 if (before_.size() == 1) {
30 return absl::StrFormat(
"Edit room %03X properties",
31 before_.front().first);
33 return absl::StrFormat(
"Edit properties in %zu rooms", before_.size());
37 (before_.size() + after_.size()) *
sizeof(States::value_type);
38 for (
const auto* states : {&before_, &after_}) {
39 for (
const auto& [
id, snapshot] : *states) {
40 bytes += snapshot.layer_merging.Name.capacity();
59 const std::vector<RoomMetadataRequest>& requests) {
60 std::map<int, std::vector<RoomMetadataEdit>> room_edits;
61 for (
const auto& request : requests) {
64 if (!room || room->rom() !=
rom_) {
65 return absl::FailedPreconditionError(
"Room properties are not loaded");
67 room_edits[request.room_id].push_back(request.edit);
70 RoomMetadataAction::States before;
71 RoomMetadataAction::States after;
76 for (
const auto& [room_id, edits] : room_edits) {
80 for (
const auto& edit : edits) {
84 if (original != planned) {
85 before.emplace_back(room_id, original);
86 after.emplace_back(room_id, std::move(planned));
90 return absl::OkStatus();
95 std::move(before), std::move(after),
96 [
this](
const RoomMetadataAction::States& states) {
99 return absl::OkStatus();
103 const std::vector<std::pair<int, zelda3::Room::MetadataSnapshot>>& states) {
104 for (
const auto& [room_id, snapshot] : states) {
106 if (!room || room->rom() !=
rom_) {
107 return absl::FailedPreconditionError(
"Room properties are not loaded");
110 for (
const auto& [room_id, snapshot] : states) {
113 for (
const auto& [room_id, snapshot] : states) {
118 return absl::OkStatus();
140 const int palette_id = room->ResolveDungeonPaletteId();
153 [&](
int id, std::unique_ptr<DungeonCanvasViewer>& viewer) {
154 refresh_viewer(viewer.get(),
id == room_id);
InteractionContext * context() const
Get the interaction context.
void SetCurrentPaletteId(uint64_t id)
int current_room_id() const
DungeonObjectInteraction & object_interaction()
void InvalidateConnectedRoomGraph()
void SetCurrentPaletteGroup(const gfx::PaletteGroup &group, bool force_refresh=false)
uint64_t current_palette_group_id_
util::LruCache< int, std::unique_ptr< DungeonCanvasViewer > > room_viewers_
gfx::PaletteGroup current_palette_group_
absl::Status EditRoomMetadataBatch(const std::vector< RoomMetadataRequest > &requests)
void FinalizePendingUndoActions()
ObjectTileEditorPanel * object_tile_editor_panel_
ObjectSelectorContent * object_selector_panel_
gfx::SnesPalette current_palette_
absl::Status EditRoomMetadata(int room_id, const RoomMetadataEdit &edit)
std::unique_ptr< DungeonCanvasViewer > workbench_compare_viewer_
gui::PaletteEditorWidget palette_editor_
RoomGraphicsContent * room_graphics_panel_
class RoomTagEditorPanel * room_tag_editor_panel_
void RefreshRoomMetadataViews(int room_id)
absl::Status RestoreRoomMetadataBatch(const std::vector< std::pair< int, zelda3::Room::MetadataSnapshot > > &states)
zelda3::GameData * game_data_
std::unique_ptr< DungeonCanvasViewer > workbench_viewer_
bool undo_restore_triggered_ping_
uint64_t current_palette_id_
InteractionCoordinator & entity_coordinator()
Get the interaction coordinator for entity handling.
zelda3::Room * GetIfLoaded(int room_id)
UndoManager undo_manager_
TileObjectHandler & tile_handler()
void SetCurrentPaletteGroup(const gfx::PaletteGroup &group)
void SetCurrentPaletteGroupForRoom(int room_id, const gfx::PaletteGroup &group)
void SetCurrentPaletteGroup(const gfx::PaletteGroup &group)
Set the current palette group for graphics rendering.
void InvalidateUsageCache()
Abstract base for all undoable actions (Command pattern)
void Push(std::unique_ptr< UndoAction > action)
void RestoreMetadataSnapshot(const MetadataSnapshot &snapshot)
MetadataSnapshot CaptureMetadataSnapshot() const
Editors are the view controllers for the application.
absl::Status ValidateRoomMetadataEdit(const RoomMetadataEdit &edit)
absl::Status ApplyRoomMetadataEdit(zelda3::Room &room, const RoomMetadataEdit &edit)
gfx::PaletteGroup BuildDungeonRenderPaletteGroupFromGameData(const gfx::SnesPalette &dungeon_palette, const GameData *game_data)
#define RETURN_IF_ERROR(expr)
PaletteGroup dungeon_main
gfx::PaletteGroupMap palette_groups