Update ApplicationProjectReader.cpp and RecentProjectsComponent.cpp | fix invalid projects not being removed from recent. Mark as invalid perhaps?

This commit is contained in:
Skarn
2022-03-14 01:17:18 +03:00
parent da28cc67c8
commit b8be475ed8
2 changed files with 105 additions and 94 deletions

View File

@@ -11,102 +11,100 @@
namespace Noggit::Project
{
std::optional<NoggitProject> ApplicationProjectReader::readProject(std::filesystem::path const& project_path)
std::optional<NoggitProject> ApplicationProjectReader::readProject(std::filesystem::path const& project_path)
{
for (const auto& entry: std::filesystem::directory_iterator(project_path))
{
for (const auto& entry : std::filesystem::directory_iterator(project_path))
if (entry.path().extension() == ".noggitproj")
{
QFile input_file(QString::fromStdString(entry.path().generic_string()));
input_file.open(QIODevice::ReadOnly);
auto document = QJsonDocument().fromJson(input_file.readAll());
auto root = document.object();
auto project = NoggitProject();
project.ProjectPath = project_path.generic_string();
if (root.contains("Project") && root["Project"].isObject())
{
if (entry.path().extension() == ".noggitproj")
auto project_configuration = root["Project"].toObject();
if (project_configuration.contains("ProjectName"))
project.ProjectName = project_configuration["ProjectName"].toString().toStdString();
if (project_configuration.contains("Bookmarks") && project_configuration["Bookmarks"].isArray())
{
auto project_bookmarks = project_configuration["Bookmarks"].toArray();
for (auto const& json_bookmark: project_bookmarks)
{
QFile input_file(QString::fromStdString(entry.path().generic_string()));
input_file.open(QIODevice::ReadOnly);
auto bookmark = NoggitProjectBookmarkMap();
bookmark.map_id = json_bookmark.toObject().value("MapId").toInt();
bookmark.name = json_bookmark.toObject().value("BookmarkName").toString().toStdString();
bookmark.camera_pitch = json_bookmark.toObject().value("CameraPitch").toDouble();
bookmark.camera_yaw = json_bookmark.toObject().value("CameraYaw").toDouble();
auto document = QJsonDocument().fromJson(input_file.readAll());
auto root = document.object();
auto bookmark_position = json_bookmark.toObject().value("Position");
auto bookmark_position_x = bookmark_position.toObject().value("X").toDouble();
auto bookmark_position_y = bookmark_position.toObject().value("Y").toDouble();
auto bookmark_position_z = bookmark_position.toObject().value("Z").toDouble();
bookmark.position = glm::vec3(bookmark_position_x, bookmark_position_y, bookmark_position_z);
auto project = NoggitProject();
project.ProjectPath = project_path.generic_string();
if (root.contains("Project") && root["Project"].isObject())
{
auto project_configuration = root["Project"].toObject();
if (project_configuration.contains("ProjectName"))
project.ProjectName = project_configuration["ProjectName"].toString().toStdString();
if (project_configuration.contains("Bookmarks") && project_configuration["Bookmarks"].isArray())
{
auto project_bookmarks = project_configuration["Bookmarks"].toArray();
for (auto const& json_bookmark : project_bookmarks)
{
auto bookmark = NoggitProjectBookmarkMap();
bookmark.map_id = json_bookmark.toObject().value("MapId").toInt();
bookmark.name = json_bookmark.toObject().value("BookmarkName").toString().toStdString();
bookmark.camera_pitch = json_bookmark.toObject().value("CameraPitch").toDouble();
bookmark.camera_yaw = json_bookmark.toObject().value("CameraYaw").toDouble();
auto bookmark_position = json_bookmark.toObject().value("Position");
auto bookmark_position_x = bookmark_position.toObject().value("X").toDouble();
auto bookmark_position_y = bookmark_position.toObject().value("Y").toDouble();
auto bookmark_position_z = bookmark_position.toObject().value("Z").toDouble();
bookmark.position = glm::vec3(bookmark_position_x, bookmark_position_y, bookmark_position_z);
project.Bookmarks.push_back(bookmark);
}
}
if (project_configuration.contains("PinnedMaps") && project_configuration["PinnedMaps"].isArray())
{
auto project_pinned_maps = project_configuration["PinnedMaps"].toArray();
for(auto const &json_pinned_map : project_pinned_maps)
{
auto pinned_map = NoggitProjectPinnedMap();
pinned_map.MapId = json_pinned_map.toObject().value("MapId").toInt();
pinned_map.MapName = json_pinned_map.toObject().value("MapName").toString().toStdString();
project.PinnedMaps.push_back(pinned_map);
}
}
if (project_configuration.contains("Client") && project_configuration["Client"].isObject())
{
auto project_client_configuration = project_configuration["Client"].toObject();
if (project_client_configuration.contains("ClientPath"))
{
project.ClientPath = project_client_configuration["ClientPath"].toString().toStdString();
}
if (project_client_configuration.contains("ClientVersion"))
{
auto client_version = project_client_configuration["ClientVersion"].toString().toStdString();
auto client_version_enum = Noggit::Project::ProjectVersion::WOTLK;
if (client_version == std::string("Shadowlands"))
{
client_version_enum = Noggit::Project::ProjectVersion::SL;
}
if (client_version == std::string("Wrath Of The Lich King"))
{
client_version_enum = Noggit::Project::ProjectVersion::WOTLK;
}
project.projectVersion = client_version_enum;
}
}
else
{
return {};
}
}
else
{
return {};
}
return project;
project.Bookmarks.push_back(bookmark);
}
}
if (project_configuration.contains("PinnedMaps") && project_configuration["PinnedMaps"].isArray())
{
auto project_pinned_maps = project_configuration["PinnedMaps"].toArray();
for (auto const& json_pinned_map: project_pinned_maps)
{
auto pinned_map = NoggitProjectPinnedMap();
pinned_map.MapId = json_pinned_map.toObject().value("MapId").toInt();
pinned_map.MapName = json_pinned_map.toObject().value("MapName").toString().toStdString();
project.PinnedMaps.push_back(pinned_map);
}
}
if (project_configuration.contains("Client") && project_configuration["Client"].isObject())
{
auto project_client_configuration = project_configuration["Client"].toObject();
if (project_client_configuration.contains("ClientPath"))
{
project.ClientPath = project_client_configuration["ClientPath"].toString().toStdString();
}
if (project_client_configuration.contains("ClientVersion"))
{
auto client_version = project_client_configuration["ClientVersion"].toString().toStdString();
auto client_version_enum = Noggit::Project::ProjectVersion::WOTLK;
if (client_version == std::string("Shadowlands"))
{
client_version_enum = Noggit::Project::ProjectVersion::SL;
}
if (client_version == std::string("Wrath Of The Lich King"))
{
client_version_enum = Noggit::Project::ProjectVersion::WOTLK;
}
project.projectVersion = client_version_enum;
}
} else
{
return {};
}
} else
{
return {};
}
return {};
return project;
}
}
return {};
}
}

View File

@@ -3,7 +3,7 @@
#include "RecentProjectsComponent.hpp"
#include <QList>
#include <filesystem>
using namespace Noggit::Ui::Component;
@@ -22,17 +22,18 @@ void RecentProjectsComponent::buildRecentProjectsList(Noggit::Ui::Windows::Noggi
settings.setArrayIndex(i);
std::filesystem::path project_path = settings.value("project_path").toString().toStdString().c_str();
auto item = new QListWidgetItem(parent->_ui->listView);
auto project_reader = Noggit::Project::ApplicationProjectReader();
if (!std::filesystem::exists(project_path) || !std::filesystem::is_directory(project_path))
continue;
auto project_reader = Noggit::Project::ApplicationProjectReader();
auto project = project_reader.readProject(project_path);
if (!project.has_value())
continue;
auto item = new QListWidgetItem(parent->_ui->listView);
auto project_data = Noggit::Ui::Widget::ProjectListItemData();
project_data.project_version = project->projectVersion;
project_data.project_directory = QString::fromStdString(project_path.generic_string());
@@ -91,7 +92,19 @@ void RecentProjectsComponent::registerProjectChange(std::string const& project_p
for (int i = 0; i < size; ++i)
{
settings.setArrayIndex(i);
recent_projects.append(settings.value("project_path").toString());
QString p_path = settings.value("project_path").toString();
std::string std_project_path = p_path.toStdString();
if (std::filesystem::exists(std_project_path)
&& std::filesystem::is_directory(std_project_path))
{
recent_projects.append(p_path);
}
else
{
size--;
}
}
settings.endArray();