diff --git a/src/commands/b_list.cpp b/src/commands/b_list.cpp index 38dc199..c2baeb5 100644 --- a/src/commands/b_list.cpp +++ b/src/commands/b_list.cpp @@ -20,7 +20,7 @@ void list_datasets(argparse::ArgumentParser& program) { auto excel = program.get("excel"); auto report = platform::DatasetsConsole(); - report.list_datasets(); + report.report(); std::cout << report.getOutput(); if (excel) { auto data = report.getData(); diff --git a/src/manage/ManageResults.cpp b/src/manage/ManageResults.cpp index c71dd5f..7fc93f1 100644 --- a/src/manage/ManageResults.cpp +++ b/src/manage/ManageResults.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "common/Colors.h" #include "common/CLocale.h" #include "common/Paths.h" @@ -66,12 +67,13 @@ namespace platform { auto pages = paginator[static_cast(output_type)].getPages(); auto lines = paginator[static_cast(output_type)].getLines(); auto total = paginator[static_cast(output_type)].getTotal(); - std::string header = " Lines " + std::to_string(lines) + " " + std::string header = " Lines " + std::to_string(lines) + " of " + std::to_string(total) + " - Page " + std::to_string(page) + " of " + std::to_string(pages) + " "; std::string prefix = std::string(max_status_line - suffix.size() - header.size(), ' '); - std::cout << Colors::CLRSCR() << Colors::REVERSE() << Colors::WHITE() << header << prefix << Colors::MAGENTA() << suffix << std::endl; + std::cout << Colors::CLRSCR() << Colors::REVERSE() << Colors::WHITE() << header << prefix + << Colors::MAGENTA() << suffix << Colors::RESET() << std::endl; } void ManageResults::footer(const std::string& status, const std::string& status_color) { @@ -102,6 +104,7 @@ namespace platform { } void ManageResults::list_result(const std::string& status_message, const std::string& status_color) { + // // header // @@ -115,14 +118,21 @@ namespace platform { void ManageResults::list_datasets(const std::string& status_message, const std::string& status_color) { auto report = DatasetsConsole(); - report.list_datasets(); - auto output = report.getOutput(); + report.report(); paginator[static_cast(output_type)].setTotal(report.getNumLines()); // // header // header(); - + // + // Results + // + auto data = report.getBody(); + std::cout << report.getHeader(); + auto [index_from, index_to] = paginator[static_cast(output_type)].getOffset(); + for (int i = index_from; i <= index_to; i++) { + std::cout << data[i]; + } // // Status Area // @@ -268,7 +278,7 @@ namespace platform { std::vector> mainOptions = { {"quit", 'q', false}, {"list", 'l', false}, - {"delete", 'x', true}, + {"delete", 'D', true}, {"datasets", 'd', false}, {"hide", 'h', true}, {"sort", 's', false}, @@ -289,6 +299,7 @@ namespace platform { {"back", 'b', false}, {"quit", 'q', false} }; + auto parser = CommandParser(); while (!finished) { bool parserError = true; // force the first iteration @@ -368,7 +379,7 @@ namespace platform { list(STATUS_OK, STATUS_COLOR); indexList = true; break; - case 'x': + case 'D': filename = results.at(index).getFilename(); if (!confirmAction("delete", filename)) { list(filename + " not deleted!", Colors::YELLOW()); @@ -401,6 +412,10 @@ namespace platform { } break; case 'r': + if (output_type == OutputType::DATASETS) { + list_datasets(STATUS_OK, STATUS_COLOR); + break; + } if (indexList) { report(index, false); indexList = false; diff --git a/src/reports/DatasetsConsole.cpp b/src/reports/DatasetsConsole.cpp index 17ad7a7..4c4b9a6 100644 --- a/src/reports/DatasetsConsole.cpp +++ b/src/reports/DatasetsConsole.cpp @@ -5,44 +5,73 @@ namespace platform { const int DatasetsConsole::BALANCE_LENGTH = 75; - std::string DatasetsConsole::outputBalance(const std::string& balance) + void DatasetsConsole::split_lines(std::string line, const std::string& balance) { auto temp = std::string(balance); while (temp.size() > DatasetsConsole::BALANCE_LENGTH - 1) { auto part = temp.substr(0, DatasetsConsole::BALANCE_LENGTH); - output << part << std::endl; - output << setw(52) << " "; + line += part + "\n"; + body.push_back(line); + line = string(52, ' '); temp = temp.substr(DatasetsConsole::BALANCE_LENGTH); } - return temp; + line += temp + "\n"; + body.push_back(line); } - void DatasetsConsole::list_datasets() + std::string DatasetsConsole::getOutput() const { - output.str(""); + std::string s; + for (const auto& piece : header) s += piece; + for (const auto& piece : body) s += piece; + return s; + } + std::string DatasetsConsole::getHeader() const + { + std::string s; + for (const auto& piece : header) s += piece; + return s; + } + void DatasetsConsole::report() + { + header.clear(); + body.clear(); auto datasets = platform::Datasets(false, platform::Paths::datasets()); auto loc = std::locale("es_ES"); - output.imbue(loc); - output << Colors::GREEN() << " # Dataset Sampl. Feat. Cls Balance" << std::endl; - std::string balanceBars = std::string(DatasetsConsole::BALANCE_LENGTH, '='); - output << "=== ============================== ====== ===== === " << balanceBars << std::endl; + std::stringstream sheader; + std::vector header_labels = { " #", "Dataset", "Sampl.", "Feat.", "Cls", "Balance" }; + std::vector header_lengths = { 3, 30, 6, 5, 3, DatasetsConsole::BALANCE_LENGTH }; + sheader << Colors::GREEN(); + for (int i = 0; i < header_labels.size(); i++) { + sheader << setw(header_lengths[i]) << left << header_labels[i] << " "; + } + sheader << std::endl; + header.push_back(sheader.str()); + std::string sline; + for (int i = 0; i < header_labels.size(); i++) { + sline += std::string(header_lengths[i], '=') + " "; + } + sline += "\n"; + header.push_back(sline); int num = 0; for (const auto& dataset : datasets.getNames()) { + std::stringstream line; + line.imbue(loc); auto color = num % 2 ? Colors::CYAN() : Colors::BLUE(); - output << color << setw(3) << right << num++ << " "; - output << setw(30) << left << dataset << " "; + line << color << setw(3) << right << num++ << " "; + line << setw(30) << left << dataset << " "; datasets.loadDataset(dataset); auto nSamples = datasets.getNSamples(dataset); - output << setw(6) << right << nSamples << " "; - output << setw(5) << right << datasets.getFeatures(dataset).size() << " "; - output << setw(3) << right << datasets.getNClasses(dataset) << " "; + line << setw(6) << right << nSamples << " "; + line << setw(5) << right << datasets.getFeatures(dataset).size() << " "; + line << setw(3) << right << datasets.getNClasses(dataset) << " "; std::stringstream oss; + oss.imbue(loc); std::string sep = ""; for (auto number : datasets.getClassesCounts(dataset)) { oss << sep << std::setprecision(2) << fixed << (float)number / nSamples * 100.0 << "% (" << number << ")"; sep = " / "; } - auto balance = outputBalance(oss.str()); - output << balance << std::endl; + split_lines(line.str(), oss.str()); // Store data for Excel report data[dataset] = json::object(); data[dataset]["samples"] = nSamples; @@ -50,7 +79,6 @@ namespace platform { data[dataset]["classes"] = datasets.getNClasses(dataset); data[dataset]["balance"] = oss.str(); } - numLines = num + 2; } } diff --git a/src/reports/DatasetsConsole.h b/src/reports/DatasetsConsole.h index 0156f75..ab4ec0e 100644 --- a/src/reports/DatasetsConsole.h +++ b/src/reports/DatasetsConsole.h @@ -13,15 +13,16 @@ namespace platform { static const int BALANCE_LENGTH; DatasetsConsole() = default; ~DatasetsConsole() = default; - std::string getOutput() const { return output.str(); } - int getNumLines() const { return numLines; } + std::string getOutput() const; + std::string getHeader() const; + std::vector& getBody() { return body; } + int getNumLines() const { return body.size(); } json& getData() { return data; } - std::string outputBalance(const std::string& balance); - void list_datasets(); + void report(); private: - std::stringstream output; + void split_lines(std::string line, const std::string& balance); + std::vector header, body; json data; - int numLines = 0; }; }