Skip to content

Commit

Permalink
allow deletion of specific savepoints
Browse files Browse the repository at this point in the history
  • Loading branch information
chrxh committed Oct 30, 2024
1 parent c4a7af4 commit 831ffea
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 7 deletions.
16 changes: 16 additions & 0 deletions source/Gui/AutosaveWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ void AutosaveWindow::processToolbar()
ImGui::SameLine();
ImGui::BeginDisabled(!static_cast<bool>(_selectedEntry) || _selectedEntry->state != SavepointState_Persisted);
if (AlienImGui::ToolbarButton(ICON_FA_TRASH)) {
onDeleteSavepoint(_selectedEntry);
}
AlienImGui::Tooltip("Delete save point");
ImGui::EndDisabled();
Expand Down Expand Up @@ -283,9 +284,23 @@ void AutosaveWindow::onCreateSavepoint()
SavepointTableService::get().insertEntryAtFront(_savepointTable.value(), entry);
}

void AutosaveWindow::onDeleteSavepoint(SavepointEntry const& entry)
{
printOverlayMessage("Deleting save point ...");

SavepointTableService::get().deleteEntry(_savepointTable.value(), entry);

if (entry->state != SavepointState_Persisted) {
scheduleDeleteNonPersistentSavepoint({entry});
}
_selectedEntry.reset();
}

void AutosaveWindow::processCleanup()
{
if (_scheduleCleanup) {
printOverlayMessage("Cleaning up save points ...");

auto nonPersistentEntries = SavepointTableService::get().truncate(_savepointTable.value(), 0);
scheduleDeleteNonPersistentSavepoint(nonPersistentEntries);
_scheduleCleanup = false;
Expand Down Expand Up @@ -359,6 +374,7 @@ void AutosaveWindow::updateSavepointTableFromFile()
} else {
_savepointTable.reset();
}
_selectedEntry.reset();
}

std::string AutosaveWindow::getSavepointFilename() const
Expand Down
1 change: 1 addition & 0 deletions source/Gui/AutosaveWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class AutosaveWindow : public AlienWindow<SimulationFacade, PersisterFacade>
void processStatusBar();

void onCreateSavepoint();
void onDeleteSavepoint(SavepointEntry const& entry);

void scheduleDeleteNonPersistentSavepoint(std::vector<SavepointEntry> const& entries);
void processDeleteNonPersistentSavepoint();
Expand Down
22 changes: 16 additions & 6 deletions source/PersisterInterface/SavepointTableService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,29 +80,39 @@ std::vector<SavepointEntry> SavepointTableService::truncate(SavepointTable& tabl
}

entries.erase(entries.begin() + newSize, entries.end());
writeToFile(table);
updateFile(table);
return result;
}

void SavepointTableService::insertEntryAtFront(SavepointTable& table, SavepointEntry const& entry) const
{
table._entries.emplace_front(entry);
++table._sequenceNumber;
writeToFile(table);
updateFile(table);
}

void SavepointTableService::updateEntry(SavepointTable& table, int row, SavepointEntry const& newEntry) const
{
table._entries.at(row) = newEntry;
writeToFile(table);
updateFile(table);
}

void SavepointTableService::writeToFile(SavepointTable& table) const
void SavepointTableService::deleteEntry(SavepointTable& table, SavepointEntry const& entry) const
{
if (entry->state == SavepointState_Persisted) {
SerializerService::get().deleteSimulation(entry->filename);
}

table._entries.erase(std::remove(table._entries.begin(), table._entries.end(), entry), table._entries.end());
updateFile(table);
}

void SavepointTableService::updateFile(SavepointTable& table) const
{
try {
std::ofstream stream(table.getFilename(), std::ios::binary);
if (!stream) {
throw std::runtime_error("Could not access savepoint table file: " + table.getFilename().string());
throw std::runtime_error("Could not access save point table file: " + table.getFilename().string());
}
boost::property_tree::ptree tree;
encodeDecode(tree, table, ParserTask::Encode);
Expand Down Expand Up @@ -147,7 +157,7 @@ void SavepointTableService::encodeDecode(boost::property_tree::ptree& tree, Save
JsonParser::encodeDecode(tree, entry->state, 0, "state", task);
JsonParser::encodeDecode(tree, entry->timestamp, std::string(), "timestamp", task);
JsonParser::encodeDecode(tree, entry->name, std::string(), "name", task);
JsonParser::encodeDecode(tree, entry->timestep, 0ull, "timestep", task);
JsonParser::encodeDecode(tree, entry->timestep, uint64_t(0), "timestep", task);
}

void SavepointTableService::encodeDecode(boost::property_tree::ptree& tree, std::filesystem::path& path, std::string const& node, ParserTask task) const
Expand Down
3 changes: 2 additions & 1 deletion source/PersisterInterface/SavepointTableService.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,10 @@ class SavepointTableService
std::vector<SavepointEntry> truncate(SavepointTable& table, int newSize) const; //returns non-persistent entries
void insertEntryAtFront(SavepointTable& table, SavepointEntry const& entry) const;
void updateEntry(SavepointTable& table, int row, SavepointEntry const& newEntry) const;
void deleteEntry(SavepointTable& table, SavepointEntry const& entry) const;

private:
void writeToFile(SavepointTable& table) const;
void updateFile(SavepointTable& table) const;
void encodeDecode(boost::property_tree::ptree& tree, SavepointTable& table, ParserTask task) const;
void encodeDecode(boost::property_tree::ptree& tree, std::deque<SavepointEntry>& entries, ParserTask task) const;
void encodeDecode(boost::property_tree::ptree& tree, SavepointEntry& entry, ParserTask task) const;
Expand Down

0 comments on commit 831ffea

Please sign in to comment.