SaveTool,MassManager: improve staged file updates.
No need to redo the whole staged list when only one file gets updated. Considering the call to refreshStagedMasses() is blocking (I might look into threading stuff), its time complexity is O(n) at worst, which can be bad on slower systems.
This commit is contained in:
parent
869ca07b20
commit
71d38f4a91
4 changed files with 31 additions and 8 deletions
|
@ -105,8 +105,8 @@ auto MassManager::exportMass(Int hangar) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
Containers::String source = Utility::Path::join(_saveDirectory, _hangars[hangar].filename());
|
Containers::String source = Utility::Path::join(_saveDirectory, _hangars[hangar].filename());
|
||||||
Containers::String dest = Utility::Path::join(_stagingAreaDirectory,
|
Containers::String dest = Utility::Path::join(_stagingAreaDirectory,
|
||||||
Utility::format("{}_{}.sav", _hangars[hangar].name(), _account));
|
Utility::format("{}_{}.sav", _hangars[hangar].name(), _account));
|
||||||
|
|
||||||
if(!Utility::Path::copy(source, dest)) {
|
if(!Utility::Path::copy(source, dest)) {
|
||||||
_lastError = Utility::format("Couldn't export data from hangar {:.2d} to {}", hangar, dest);
|
_lastError = Utility::format("Couldn't export data from hangar {:.2d} to {}", hangar, dest);
|
||||||
|
@ -200,6 +200,26 @@ void MassManager::refreshStagedMasses() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MassManager::refreshStagedMass(Containers::StringView filename) {
|
||||||
|
Utility::Debug{} << "Refreshing staged unit with filename" << filename;
|
||||||
|
|
||||||
|
bool file_exists = Utility::Path::exists(Utility::Path::join(_stagingAreaDirectory, filename));
|
||||||
|
auto it = _stagedMasses.find(filename);
|
||||||
|
|
||||||
|
if(file_exists) {
|
||||||
|
auto name = Mass::getNameFromFile(Utility::Path::join(_stagingAreaDirectory, filename));
|
||||||
|
if(name) {
|
||||||
|
_stagedMasses[filename] = *name;
|
||||||
|
}
|
||||||
|
else if(it != _stagedMasses.cend()) {
|
||||||
|
_stagedMasses.erase(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(it != _stagedMasses.cend()) {
|
||||||
|
_stagedMasses.erase(it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto MassManager::deleteStagedMass(Containers::StringView filename) -> bool {
|
auto MassManager::deleteStagedMass(Containers::StringView filename) -> bool {
|
||||||
if(_stagedMasses.find(filename) == _stagedMasses.cend()) {
|
if(_stagedMasses.find(filename) == _stagedMasses.cend()) {
|
||||||
_lastError = "The file "_s + filename + " couldn't be found in the list of staged M.A.S.S.es."_s;
|
_lastError = "The file "_s + filename + " couldn't be found in the list of staged M.A.S.S.es."_s;
|
||||||
|
|
|
@ -44,6 +44,7 @@ class MassManager {
|
||||||
|
|
||||||
auto stagedMasses() -> std::map<Containers::String, Containers::String> const&;
|
auto stagedMasses() -> std::map<Containers::String, Containers::String> const&;
|
||||||
void refreshStagedMasses();
|
void refreshStagedMasses();
|
||||||
|
void refreshStagedMass(Containers::StringView filename);
|
||||||
auto deleteStagedMass(Containers::StringView filename) -> bool;
|
auto deleteStagedMass(Containers::StringView filename) -> bool;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -94,7 +94,7 @@ class SaveTool: public Platform::Sdl2Application, public efsw::FileWatchListener
|
||||||
FileDeleted = efsw::Action::Delete,
|
FileDeleted = efsw::Action::Delete,
|
||||||
FileModified = efsw::Action::Modified,
|
FileModified = efsw::Action::Modified,
|
||||||
FileMoved = efsw::Action::Moved,
|
FileMoved = efsw::Action::Moved,
|
||||||
StagedUpdate
|
StagedUpdate = 1 << 3
|
||||||
};
|
};
|
||||||
void fileUpdateEvent(SDL_Event& event);
|
void fileUpdateEvent(SDL_Event& event);
|
||||||
|
|
||||||
|
|
|
@ -32,8 +32,10 @@ void SaveTool::handleFileAction(efsw::WatchID watch_id,
|
||||||
SDL_zero(event);
|
SDL_zero(event);
|
||||||
event.type = _fileEventId;
|
event.type = _fileEventId;
|
||||||
|
|
||||||
|
event.user.data1 = Containers::String{Containers::AllocatedInit, filename.c_str()}.release();
|
||||||
|
|
||||||
if(watch_id == _watchIDs[StagingDir] && Utility::String::endsWith(filename, ".sav")) {
|
if(watch_id == _watchIDs[StagingDir] && Utility::String::endsWith(filename, ".sav")) {
|
||||||
event.user.code = StagedUpdate;
|
event.user.code = StagedUpdate | action;
|
||||||
SDL_PushEvent(&event);
|
SDL_PushEvent(&event);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -47,7 +49,6 @@ void SaveTool::handleFileAction(efsw::WatchID watch_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
event.user.code = action;
|
event.user.code = action;
|
||||||
event.user.data1 = Containers::String{Containers::AllocatedInit, filename.c_str()}.release();
|
|
||||||
if(action == efsw::Actions::Moved) {
|
if(action == efsw::Actions::Moved) {
|
||||||
event.user.data2 = Containers::String{Containers::AllocatedInit, old_filename.c_str()}.release();
|
event.user.data2 = Containers::String{Containers::AllocatedInit, old_filename.c_str()}.release();
|
||||||
}
|
}
|
||||||
|
@ -56,12 +57,13 @@ void SaveTool::handleFileAction(efsw::WatchID watch_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
void SaveTool::fileUpdateEvent(SDL_Event& event) {
|
void SaveTool::fileUpdateEvent(SDL_Event& event) {
|
||||||
if(event.user.code == StagedUpdate) {
|
Containers::String filename{static_cast<char*>(event.user.data1), std::strlen(static_cast<char*>(event.user.data1)), nullptr};
|
||||||
_massManager->refreshStagedMasses();
|
|
||||||
|
if((event.user.code & StagedUpdate) == StagedUpdate) {
|
||||||
|
_massManager->refreshStagedMass(filename);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Containers::String filename{static_cast<char*>(event.user.data1), std::strlen(static_cast<char*>(event.user.data1)), nullptr};
|
|
||||||
Containers::String old_filename;
|
Containers::String old_filename;
|
||||||
|
|
||||||
Int index = 0;
|
Int index = 0;
|
||||||
|
|
Loading…
Reference in a new issue