130 lines
4.8 KiB
C++
130 lines
4.8 KiB
C++
#include <algorithm>
|
|
#include "common/Paths.h"
|
|
#include "ResultsManager.h"
|
|
|
|
namespace platform {
|
|
ResultsManager::ResultsManager(const std::string& model, const std::string& score, const std::string& platform, bool complete, bool partial) :
|
|
path(Paths::results()), model(model), scoreName(score), platform(platform), complete(complete), partial(partial), maxModel(0), maxTitle(0)
|
|
{
|
|
}
|
|
void ResultsManager::load()
|
|
{
|
|
using std::filesystem::directory_iterator;
|
|
bool found = false;
|
|
for (const auto& file : directory_iterator(path)) {
|
|
auto filename = file.path().filename().string();
|
|
if (filename.find(".json") != std::string::npos && filename.find("results_") == 0) {
|
|
auto result = Result();
|
|
result.load(path, filename);
|
|
bool addResult = true;
|
|
if (platform != "any" && result.getPlatform() != platform
|
|
|| model != "any" && result.getModel() != model
|
|
|| scoreName != "any" && scoreName != result.getScoreName()
|
|
|| complete && !result.isComplete()
|
|
|| partial && result.isComplete())
|
|
addResult = false;
|
|
if (addResult) {
|
|
files.push_back(result);
|
|
found = true;
|
|
}
|
|
}
|
|
}
|
|
if (found) {
|
|
maxModel = std::max(size_t(5), (*max_element(files.begin(), files.end(), [](const Result& a, const Result& b) { return a.getModel().size() < b.getModel().size(); })).getModel().size());
|
|
maxTitle = std::max(size_t(5), (*max_element(files.begin(), files.end(), [](const Result& a, const Result& b) { return a.getTitle().size() < b.getTitle().size(); })).getTitle().size());
|
|
}
|
|
}
|
|
void ResultsManager::hideResult(int index, const std::string& pathHidden)
|
|
{
|
|
auto filename = files.at(index).getFilename();
|
|
rename((path + "/" + filename).c_str(), (pathHidden + "/" + filename).c_str());
|
|
files.erase(files.begin() + index);
|
|
}
|
|
void ResultsManager::deleteResult(int index)
|
|
{
|
|
auto filename = files.at(index).getFilename();
|
|
remove((path + "/" + filename).c_str());
|
|
files.erase(files.begin() + index);
|
|
}
|
|
int ResultsManager::size() const
|
|
{
|
|
return files.size();
|
|
}
|
|
void ResultsManager::sortDate(SortType type)
|
|
{
|
|
if (empty())
|
|
return;
|
|
sort(files.begin(), files.end(), [type](const Result& a, const Result& b) {
|
|
if (a.getDate() == b.getDate()) {
|
|
if (type == SortType::ASC)
|
|
return a.getModel() < b.getModel();
|
|
return a.getModel() > b.getModel();
|
|
}
|
|
if (type == SortType::ASC)
|
|
return a.getDate() < b.getDate();
|
|
return a.getDate() > b.getDate();
|
|
});
|
|
}
|
|
void ResultsManager::sortModel(SortType type)
|
|
{
|
|
if (empty())
|
|
return;
|
|
sort(files.begin(), files.end(), [type](const Result& a, const Result& b) {
|
|
if (a.getModel() == b.getModel()) {
|
|
if (type == SortType::ASC)
|
|
return a.getDate() < b.getDate();
|
|
return a.getDate() > b.getDate();
|
|
}
|
|
if (type == SortType::ASC)
|
|
return a.getModel() < b.getModel();
|
|
return a.getModel() > b.getModel();
|
|
});
|
|
}
|
|
void ResultsManager::sortDuration(SortType type)
|
|
{
|
|
if (empty())
|
|
return;
|
|
sort(files.begin(), files.end(), [type](const Result& a, const Result& b) {
|
|
if (type == SortType::ASC)
|
|
return a.getDuration() < b.getDuration();
|
|
return a.getDuration() > b.getDuration();
|
|
});
|
|
}
|
|
void ResultsManager::sortScore(SortType type)
|
|
{
|
|
if (empty())
|
|
return;
|
|
sort(files.begin(), files.end(), [type](const Result& a, const Result& b) {
|
|
if (a.getScore() == b.getScore()) {
|
|
if (type == SortType::ASC)
|
|
return a.getDate() < b.getDate();
|
|
return a.getDate() > b.getDate();
|
|
}
|
|
if (type == SortType::ASC)
|
|
return a.getScore() < b.getScore();
|
|
return a.getScore() > b.getScore();
|
|
});
|
|
}
|
|
|
|
void ResultsManager::sortResults(SortField field, SortType type)
|
|
{
|
|
switch (field) {
|
|
case SortField::DATE:
|
|
sortDate(type);
|
|
break;
|
|
case SortField::MODEL:
|
|
sortModel(type);
|
|
break;
|
|
case SortField::SCORE:
|
|
sortScore(type);
|
|
break;
|
|
case SortField::DURATION:
|
|
sortDuration(type);
|
|
break;
|
|
}
|
|
}
|
|
bool ResultsManager::empty() const
|
|
{
|
|
return files.empty();
|
|
}
|
|
} |