Managers,Application: adapt to StagedMassManager.
This commit is contained in:
parent
db4632182a
commit
57f6364b7f
6 changed files with 17 additions and 142 deletions
|
@ -40,6 +40,7 @@
|
||||||
#include "../Managers/BackupManager.h"
|
#include "../Managers/BackupManager.h"
|
||||||
#include "../Managers/MassManager.h"
|
#include "../Managers/MassManager.h"
|
||||||
#include "../Managers/ProfileManager.h"
|
#include "../Managers/ProfileManager.h"
|
||||||
|
#include "../Managers/StagedMassManager.h"
|
||||||
#include "../ToastQueue/ToastQueue.h"
|
#include "../ToastQueue/ToastQueue.h"
|
||||||
#include "../UpdateChecker/UpdateChecker.h"
|
#include "../UpdateChecker/UpdateChecker.h"
|
||||||
|
|
||||||
|
@ -260,6 +261,8 @@ class Application: public Platform::Sdl2Application, public efsw::FileWatchListe
|
||||||
Containers::Pointer<Managers::MassManager> _massManager;
|
Containers::Pointer<Managers::MassManager> _massManager;
|
||||||
GameObjects::Mass* _currentMass = nullptr;
|
GameObjects::Mass* _currentMass = nullptr;
|
||||||
|
|
||||||
|
Containers::Pointer<Managers::StagedMassManager> _stagedMassManager;
|
||||||
|
|
||||||
GameObjects::Weapon* _currentWeapon = nullptr;
|
GameObjects::Weapon* _currentWeapon = nullptr;
|
||||||
|
|
||||||
Containers::Pointer<efsw::FileWatcher> _fileWatcher;
|
Containers::Pointer<efsw::FileWatcher> _fileWatcher;
|
||||||
|
|
|
@ -68,7 +68,7 @@ Application::fileUpdateEvent(SDL_Event& event) {
|
||||||
std::strlen(static_cast<char*>(event.user.data1)), nullptr};
|
std::strlen(static_cast<char*>(event.user.data1)), nullptr};
|
||||||
|
|
||||||
if((event.user.code & StagedUpdate) == StagedUpdate) {
|
if((event.user.code & StagedUpdate) == StagedUpdate) {
|
||||||
_massManager->refreshStagedMass(filename);
|
_stagedMassManager->refreshMass(filename);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,6 +117,8 @@ Application::initialiseManager() {
|
||||||
|
|
||||||
_backupManager.emplace();
|
_backupManager.emplace();
|
||||||
|
|
||||||
|
_stagedMassManager.emplace();
|
||||||
|
|
||||||
event.user.code = InitSuccess;
|
event.user.code = InitSuccess;
|
||||||
SDL_PushEvent(&event);
|
SDL_PushEvent(&event);
|
||||||
}
|
}
|
||||||
|
|
|
@ -438,7 +438,7 @@ Application::drawMassManager() {
|
||||||
|
|
||||||
Containers::StringView file = *static_cast<Containers::String*>(payload->Data);
|
Containers::StringView file = *static_cast<Containers::String*>(payload->Data);
|
||||||
|
|
||||||
if(!_massManager->importMass(file, i)) {
|
if(!_stagedMassManager->import(file, i, _currentProfile->account(), _currentProfile->isDemo())) {
|
||||||
_queue.addToast(Toast::Type::Error, _massManager->lastError());
|
_queue.addToast(Toast::Type::Error, _massManager->lastError());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -530,26 +530,26 @@ Application::drawMassManager() {
|
||||||
openUri(Utility::Path::toNativeSeparators(conf().directories().staging));
|
openUri(Utility::Path::toNativeSeparators(conf().directories().staging));
|
||||||
}
|
}
|
||||||
|
|
||||||
for(const auto& pair : _massManager->stagedMasses()) {
|
for(const auto& mass : _stagedMassManager->stagedMasses()) {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableSetColumnIndex(0);
|
ImGui::TableSetColumnIndex(0);
|
||||||
Containers::String staged_formatted = Utility::format("{} ({})", pair.second, pair.first);
|
Containers::String staged_formatted = Utility::format("{} ({})", mass.name, mass.filename);
|
||||||
ImGui::Selectable(staged_formatted.data());
|
ImGui::Selectable(staged_formatted.data());
|
||||||
if((ImGui::CalcTextSize(staged_formatted.data()).x + ImGui::GetStyle().FramePadding.x) > ImGui::GetContentRegionAvail().x) {
|
if((ImGui::CalcTextSize(staged_formatted.data()).x + ImGui::GetStyle().FramePadding.x) > ImGui::GetContentRegionAvail().x) {
|
||||||
drawTooltip(staged_formatted.data());
|
drawTooltip(staged_formatted.data());
|
||||||
}
|
}
|
||||||
if(ImGui::BeginDragDropSource(ImGuiDragDropFlags_SourceNoHoldToOpenOthers)) {
|
if(ImGui::BeginDragDropSource(ImGuiDragDropFlags_SourceNoHoldToOpenOthers)) {
|
||||||
ImGui::SetDragDropPayload("StagedMass", &(pair.first), sizeof(Containers::String));
|
ImGui::SetDragDropPayload("StagedMass", &(mass.filename), sizeof(Containers::String));
|
||||||
|
|
||||||
ImGui::Text("%s - Staged", pair.second.data());
|
ImGui::Text("%s - Staged", mass.name.cbegin());
|
||||||
|
|
||||||
ImGui::EndDragDropSource();
|
ImGui::EndDragDropSource();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::TableSetColumnIndex(1);
|
ImGui::TableSetColumnIndex(1);
|
||||||
ImGui::PushID(pair.first.data());
|
ImGui::PushID(mass.filename.data());
|
||||||
if(ImGui::SmallButton(ICON_FA_TRASH_ALT)) {
|
if(ImGui::SmallButton(ICON_FA_TRASH_ALT)) {
|
||||||
staged_mass_to_delete = pair.first;
|
staged_mass_to_delete = mass.filename;
|
||||||
ImGui::OpenPopup("Confirmation##DeleteStagedMassConfirmation");
|
ImGui::OpenPopup("Confirmation##DeleteStagedMassConfirmation");
|
||||||
}
|
}
|
||||||
drawTooltip("Delete");
|
drawTooltip("Delete");
|
||||||
|
@ -644,7 +644,7 @@ Application::drawDeleteStagedMassPopup(Containers::StringView filename) {
|
||||||
|
|
||||||
ImGui::PushTextWrapPos(float(windowSize().x()) * 0.40f);
|
ImGui::PushTextWrapPos(float(windowSize().x()) * 0.40f);
|
||||||
ImGui::Text("Are you sure you want to delete the staged M.A.S.S. named %s ? This operation is irreversible.",
|
ImGui::Text("Are you sure you want to delete the staged M.A.S.S. named %s ? This operation is irreversible.",
|
||||||
_massManager->stagedMasses().at(filename).data());
|
_stagedMassManager->at(filename).filename.cbegin());
|
||||||
ImGui::PopTextWrapPos();
|
ImGui::PopTextWrapPos();
|
||||||
|
|
||||||
if(ImGui::BeginTable("##DeleteStagedMassLayout", 2)) {
|
if(ImGui::BeginTable("##DeleteStagedMassLayout", 2)) {
|
||||||
|
@ -655,8 +655,9 @@ Application::drawDeleteStagedMassPopup(Containers::StringView filename) {
|
||||||
|
|
||||||
ImGui::TableSetColumnIndex(1);
|
ImGui::TableSetColumnIndex(1);
|
||||||
if(ImGui::Button("Yes")) {
|
if(ImGui::Button("Yes")) {
|
||||||
if(!_massManager->deleteStagedMass(filename)) {
|
if(!_stagedMassManager->remove(filename)) {
|
||||||
_queue.addToast(Toast::Type::Error, _massManager->lastError());
|
_queue.addToast(Toast::Type::Error,
|
||||||
|
"Couldn't delete the staged M.A.S.S. at " + filename + ": " + _stagedMassManager->lastError());
|
||||||
}
|
}
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,8 +37,6 @@ MassManager::MassManager(Containers::StringView account, bool demo):
|
||||||
Utility::format("{}Unit{:.2d}{}.sav", demo ? "Demo"_s : ""_s, i, _account));
|
Utility::format("{}Unit{:.2d}{}.sav", demo ? "Demo"_s : ""_s, i, _account));
|
||||||
new(&_hangars[i]) GameObjects::Mass{mass_filename};
|
new(&_hangars[i]) GameObjects::Mass{mass_filename};
|
||||||
}
|
}
|
||||||
|
|
||||||
refreshStagedMasses();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Containers::StringView
|
Containers::StringView
|
||||||
|
@ -65,49 +63,6 @@ MassManager::refreshHangar(std::int32_t hangar) {
|
||||||
_hangars[hangar] = GameObjects::Mass{mass_filename};
|
_hangars[hangar] = GameObjects::Mass{mass_filename};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
MassManager::importMass(Containers::StringView staged_fn, std::int32_t hangar) {
|
|
||||||
if(hangar < 0 || hangar >= 32) {
|
|
||||||
_lastError = "Hangar index out of range.";
|
|
||||||
LOG_ERROR(_lastError);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto it = _stagedMasses.find(Containers::String::nullTerminatedView(staged_fn));
|
|
||||||
|
|
||||||
if(it == _stagedMasses.end()) {
|
|
||||||
_lastError = "Couldn't find "_s + staged_fn + " in the staged M.A.S.S.es."_s;
|
|
||||||
LOG_ERROR(_lastError);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Containers::String source = Utility::Path::join(conf().directories().staging, staged_fn);
|
|
||||||
Utility::Path::copy(source, source + ".tmp"_s);
|
|
||||||
|
|
||||||
{
|
|
||||||
GameObjects::Mass mass{source + ".tmp"_s};
|
|
||||||
if(!mass.updateAccount(_account)) {
|
|
||||||
_lastError = mass.lastError();
|
|
||||||
Utility::Path::remove(source + ".tmp"_s);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Containers::String dest = Utility::Path::join(conf().directories().gameSaves, _hangars[hangar].filename());
|
|
||||||
|
|
||||||
if(Utility::Path::exists(dest)) {
|
|
||||||
Utility::Path::remove(dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!Utility::Path::move(source + ".tmp"_s, dest)) {
|
|
||||||
_lastError = Utility::format("Couldn't move {} to hangar {:.2d}", staged_fn, hangar + 1);
|
|
||||||
LOG_ERROR(_lastError);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
MassManager::exportMass(std::int32_t hangar) {
|
MassManager::exportMass(std::int32_t hangar) {
|
||||||
if(hangar < 0 || hangar >= 32) {
|
if(hangar < 0 || hangar >= 32) {
|
||||||
|
@ -192,80 +147,4 @@ MassManager::deleteMass(std::int32_t hangar) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::map<Containers::String, Containers::String>&
|
|
||||||
MassManager::stagedMasses() {
|
|
||||||
return _stagedMasses;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MassManager::refreshStagedMasses() {
|
|
||||||
_stagedMasses.clear();
|
|
||||||
|
|
||||||
using Utility::Path::ListFlag;
|
|
||||||
auto file_list = Utility::Path::list(conf().directories().staging,
|
|
||||||
ListFlag::SkipSpecial|ListFlag::SkipDirectories|ListFlag::SkipDotAndDotDot);
|
|
||||||
|
|
||||||
if(!file_list) {
|
|
||||||
LOG_ERROR_FORMAT("{} couldn't be opened.", conf().directories().staging);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto iter = std::remove_if(file_list->begin(), file_list->end(), [](Containers::StringView file){
|
|
||||||
return !file.hasSuffix(".sav"_s);
|
|
||||||
});
|
|
||||||
|
|
||||||
auto list_view = file_list->exceptSuffix(file_list->end() - iter);
|
|
||||||
|
|
||||||
LOG_INFO("Scanning for staged M.A.S.S.es...");
|
|
||||||
for(Containers::StringView file : list_view) {
|
|
||||||
auto name = GameObjects::Mass::getNameFromFile(Utility::Path::join(conf().directories().staging, file));
|
|
||||||
|
|
||||||
if(name) {
|
|
||||||
LOG_INFO_FORMAT("Found staged M.A.S.S.: {}", *name);
|
|
||||||
_stagedMasses[file] = *name;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
LOG_WARNING_FORMAT("Skipped {}.", file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
MassManager::refreshStagedMass(Containers::StringView filename) {
|
|
||||||
LOG_INFO_FORMAT("Refreshing staged unit with filename {}.", filename);
|
|
||||||
|
|
||||||
bool file_exists = Utility::Path::exists(Utility::Path::join(conf().directories().staging, filename));
|
|
||||||
auto it = _stagedMasses.find(filename);
|
|
||||||
|
|
||||||
if(file_exists) {
|
|
||||||
auto name = GameObjects::Mass::getNameFromFile(Utility::Path::join(conf().directories().staging, filename));
|
|
||||||
if(name) {
|
|
||||||
_stagedMasses[filename] = *name;
|
|
||||||
}
|
|
||||||
else if(it != _stagedMasses.cend()) {
|
|
||||||
_stagedMasses.erase(it);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(it != _stagedMasses.cend()) {
|
|
||||||
_stagedMasses.erase(it);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
MassManager::deleteStagedMass(Containers::StringView filename) {
|
|
||||||
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;
|
|
||||||
LOG_ERROR(_lastError);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!Utility::Path::remove(Utility::Path::join(conf().directories().staging, filename))) {
|
|
||||||
_lastError = filename + " couldn't be deleted: " + std::strerror(errno);
|
|
||||||
LOG_ERROR(_lastError);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,8 +16,6 @@
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
#include <Corrade/Containers/StaticArray.h>
|
#include <Corrade/Containers/StaticArray.h>
|
||||||
#include <Corrade/Containers/String.h>
|
#include <Corrade/Containers/String.h>
|
||||||
#include <Corrade/Containers/StringView.h>
|
#include <Corrade/Containers/StringView.h>
|
||||||
|
@ -38,17 +36,11 @@ class MassManager {
|
||||||
|
|
||||||
void refreshHangar(int hangar);
|
void refreshHangar(int hangar);
|
||||||
|
|
||||||
bool importMass(Containers::StringView staged_fn, int hangar);
|
|
||||||
bool exportMass(int hangar);
|
bool exportMass(int hangar);
|
||||||
|
|
||||||
bool moveMass(int source, int destination);
|
bool moveMass(int source, int destination);
|
||||||
bool deleteMass(int hangar);
|
bool deleteMass(int hangar);
|
||||||
|
|
||||||
auto stagedMasses() -> std::map<Containers::String, Containers::String> const&;
|
|
||||||
void refreshStagedMasses();
|
|
||||||
void refreshStagedMass(Containers::StringView filename);
|
|
||||||
bool deleteStagedMass(Containers::StringView filename);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Containers::StringView _account;
|
Containers::StringView _account;
|
||||||
bool _demo;
|
bool _demo;
|
||||||
|
@ -56,8 +48,6 @@ class MassManager {
|
||||||
Containers::String _lastError;
|
Containers::String _lastError;
|
||||||
|
|
||||||
Containers::StaticArray<32, GameObjects::Mass> _hangars{NoInit};
|
Containers::StaticArray<32, GameObjects::Mass> _hangars{NoInit};
|
||||||
|
|
||||||
std::map<Containers::String, Containers::String> _stagedMasses;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue