260 lines
9.0 KiB
C++
260 lines
9.0 KiB
C++
#include "BaseVisualizer.hpp"
|
|
|
|
void BaseVisualizer::ClearTerminal() {
|
|
//std::cout << "\033[2J";
|
|
system("cls");
|
|
}
|
|
|
|
std::vector<std::vector<std::string>>* BaseVisualizer::GetDisplayVector() {
|
|
return &display_vector;
|
|
}
|
|
|
|
size_t BaseVisualizer::CountVisibleCharacters(const std::string& str) {
|
|
size_t count = 0;
|
|
size_t i = 0;
|
|
|
|
while (i < str.size()) {
|
|
if (str[i] == '\x1B' && i + 1 < str.size() && str[i + 1] == '[') {
|
|
// ANSI-Escape-Sequenz erkennen und überspringen
|
|
i += 2; // Überspringe '\x1B['
|
|
while (i < str.size() && !std::isalpha(str[i])) {
|
|
++i; // Fortsetzung der Sequenz überspringen
|
|
}
|
|
if (i < str.size() && std::isalpha(str[i])) {
|
|
++i; // Buchstaben am Ende der Sequenz überspringen
|
|
}
|
|
} else {
|
|
// UTF-8 Startbytes zählen (kein Fortsetzungsbyte)
|
|
if ((str[i] & 0b11000000) != 0b10000000) {
|
|
++count;
|
|
}
|
|
++i;
|
|
}
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
size_t BaseVisualizer::GetSumAllCharsFromVector(const std::vector<std::string>& vec) {
|
|
size_t sum = 0;
|
|
for (const std::string& str : vec) {
|
|
sum += CountVisibleCharacters(str);
|
|
}
|
|
return sum;
|
|
}
|
|
|
|
void BaseVisualizer::GenerateEmptyLine(const int lengthOfMenu, const bool single) {
|
|
std::string result = "";
|
|
for (int i = 0; i < lengthOfMenu; ++i) {
|
|
if (i == 0) {
|
|
result += ((single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE);
|
|
} else if (i == lengthOfMenu-1) {
|
|
result += ((single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE);
|
|
} else {
|
|
result += " ";
|
|
}
|
|
}
|
|
display_vector.push_back({result});
|
|
}
|
|
|
|
// ToDo: Auf Max länge bringen
|
|
void BaseVisualizer::GenerateBoxMenuLine(const size_t length, const std::string& str, const bool single, const size_t padding) {
|
|
std::string result = ((single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE) + std::string(padding, ' ') + str;
|
|
while (CountVisibleCharacters(result) < length-1) {
|
|
result += " ";
|
|
}
|
|
display_vector.push_back({result.append(((single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE))});
|
|
}
|
|
|
|
void BaseVisualizer::GenerateCenteredString(const size_t widthOfMenu, const std::string& str, const bool single) {
|
|
std::string result = (single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE;
|
|
|
|
float newLength = widthOfMenu - CountVisibleCharacters(str) - 2;
|
|
|
|
int firstHalfLength = std::floor(newLength / 2);
|
|
int secondHalfLength = std::ceil(newLength / 2);
|
|
|
|
for (int i = 0; i < firstHalfLength; ++i) {
|
|
result += " ";
|
|
}
|
|
|
|
result += str;
|
|
|
|
for (int i = 0; i < secondHalfLength; ++i) {
|
|
result += " ";
|
|
}
|
|
|
|
display_vector.push_back({result+ ((single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE)});
|
|
}
|
|
|
|
void BaseVisualizer::DisplayElement() {
|
|
int temp;
|
|
for (const auto& row : display_vector) {
|
|
for (const auto& cell : row) {
|
|
std::cout << cell;
|
|
}
|
|
std::cout << std::endl;
|
|
}
|
|
std::cout << "\x1B[u";
|
|
//std::cout << "Select option" << std::endl;
|
|
std::cin >> temp;
|
|
}
|
|
|
|
size_t BaseVisualizer::CalculateMaxMenuWidth(const size_t longestStringLength, const size_t padding) {
|
|
return longestStringLength + 2*padding + 2;
|
|
}
|
|
|
|
void BaseVisualizer::GenerateTopBottomBorder(const size_t totalLength, const bool top, const bool single) {
|
|
std::string result = (top) ? ((single) ? BaseVisualizer::TOP_LEFT_CORNER_SINGLE : BaseVisualizer::TOP_LEFT_CORNER) : ((single) ? BaseVisualizer::BOTTOM_LEFT_CORNER_SINGLE : BaseVisualizer::BOTTOM_LEFT_CORNER);
|
|
for (size_t i = 0; i < totalLength-2; ++i) {
|
|
result += (single) ? BaseVisualizer::HORIZONTAL_LINE_SINGLE : BaseVisualizer::HORIZONTAL_LINE;
|
|
}
|
|
display_vector.push_back({result + ((top) ? ((single) ? BaseVisualizer::TOP_RIGHT_CORNER_SINGLE : BaseVisualizer::TOP_RIGHT_CORNER) : ((single) ? BaseVisualizer::BOTTOM_RIGHT_CORNER_SINGLE : BaseVisualizer::BOTTOM_RIGHT_CORNER))});
|
|
}
|
|
|
|
void BaseVisualizer::AddEmptyLines(const size_t lines, const size_t length, const bool sinlge) {
|
|
for (size_t i = 0; i < lines; ++i) {
|
|
BaseVisualizer::GenerateEmptyLine(length, sinlge);
|
|
}
|
|
}
|
|
|
|
void BaseVisualizer::GenerateTableTopBottom(const size_t totalLength, const bool top, const bool single) {
|
|
int firstHalfLength = std::floor(totalLength / 2);
|
|
|
|
std::string result = (top) ? ((single) ? BaseVisualizer::TOP_LEFT_CORNER_SINGLE : BaseVisualizer::TOP_LEFT_CORNER) : ((single) ? BaseVisualizer::BOTTOM_LEFT_CORNER_SINGLE : BaseVisualizer::BOTTOM_LEFT_CORNER);
|
|
|
|
for (size_t i = 0; i < firstHalfLength-1; ++i) {
|
|
result += (single) ? BaseVisualizer::HORIZONTAL_LINE_SINGLE : BaseVisualizer::HORIZONTAL_LINE;
|
|
}
|
|
|
|
result += (top) ? ((single) ? BaseVisualizer::TOP_CROSS_SINGLE : BaseVisualizer::TOP_CROSS) : ((single) ? BaseVisualizer::BOTTOM_CROSS_SINGLE : BaseVisualizer::BOTTOM_CROSS);
|
|
|
|
for (size_t i = 0; i < firstHalfLength-1; ++i) {
|
|
result += (single) ? BaseVisualizer::HORIZONTAL_LINE_SINGLE : BaseVisualizer::HORIZONTAL_LINE;
|
|
}
|
|
|
|
display_vector.push_back({result + ((top) ? ((single) ? BaseVisualizer::TOP_RIGHT_CORNER_SINGLE : BaseVisualizer::TOP_RIGHT_CORNER) : ((single) ? BaseVisualizer::BOTTOM_RIGHT_CORNER_SINGLE : BaseVisualizer::BOTTOM_RIGHT_CORNER))});
|
|
}
|
|
|
|
void BaseVisualizer::GenerateTableLine(const float length, const std::vector<std::string>& str, const bool single) {
|
|
int firstHalfLength = std::floor(length / 2);
|
|
std::string result = ((single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE);
|
|
std::string temp;
|
|
|
|
for (size_t i = 0; i < 2; ++i) {
|
|
temp += " " + str[i];
|
|
|
|
while (CountVisibleCharacters(temp) < firstHalfLength-1) {
|
|
temp += " ";
|
|
}
|
|
temp += ((single) ? BaseVisualizer::VERTICAL_LINE_SINGLE : BaseVisualizer::VERTICAL_LINE);
|
|
result += temp;
|
|
temp = "";
|
|
}
|
|
display_vector.push_back({result});
|
|
}
|
|
|
|
void BaseVisualizer::GenerateTableSeperator(const float length, const bool single) {
|
|
int firstHalfLength = std::floor(length / 2);
|
|
std::string result = ((single) ? BaseVisualizer::RIGHT_CROSS_SINGLE : BaseVisualizer::RIGHT_CROSS);
|
|
std::string temp;
|
|
|
|
for (size_t i = 0; i < 2; ++i) {
|
|
while (CountVisibleCharacters(temp) < firstHalfLength-1) {
|
|
temp += ((single) ? BaseVisualizer::HORIZONTAL_LINE_SINGLE : BaseVisualizer::HORIZONTAL_LINE);
|
|
}
|
|
temp += (i != 1) ? ((single) ? BaseVisualizer::CROSS_SINGLE : BaseVisualizer::CROSS) : "";
|
|
result += temp;
|
|
temp = "";
|
|
}
|
|
result += ((single) ? BaseVisualizer::LEFT_CROSS_SINGLE : BaseVisualizer::LEFT_CROSS);
|
|
|
|
display_vector.push_back({result});
|
|
}
|
|
|
|
void BaseVisualizer::GenerateBoxSeperator(const float length, const bool single) {
|
|
std::string result = ((single) ? BaseVisualizer::RIGHT_CROSS_SINGLE : BaseVisualizer::RIGHT_CROSS);
|
|
|
|
while (CountVisibleCharacters(result) < length-1) {
|
|
result += ((single) ? BaseVisualizer::HORIZONTAL_LINE_SINGLE : BaseVisualizer::HORIZONTAL_LINE);
|
|
}
|
|
|
|
result += ((single) ? BaseVisualizer::LEFT_CROSS_SINGLE : BaseVisualizer::LEFT_CROSS);
|
|
|
|
display_vector.push_back({result});
|
|
}
|
|
|
|
void BaseVisualizer::SetConsoleColor(Colors foreground, Colors background) {
|
|
const std::string SEQ_FOREGROUND = "\x1b[3";
|
|
const std::string SEQ_FOREGROUND_LIGHT = "\x1b[9";
|
|
const std::string SEQ_BACKGROUND = "\x1b[4";
|
|
const std::string SEQ_BACKGROUND_LIGHT = "\x1b[10";
|
|
|
|
// set foreground color
|
|
switch (foreground) {
|
|
case BLACK:
|
|
case RED:
|
|
case GREEN:
|
|
case YELLOW:
|
|
case BLUE:
|
|
case MAGENTA:
|
|
case CYAN:
|
|
case WHITE:
|
|
std::cout << SEQ_FOREGROUND << foreground << "m";
|
|
break;
|
|
case LIGHT_BLACK:
|
|
case LIGHT_RED:
|
|
case LIGHT_GREEN:
|
|
case LIGHT_YELLOW:
|
|
case LIGHT_BLUE:
|
|
case LIGHT_MAGENTA:
|
|
case LIGHT_CYAN:
|
|
case LIGHT_WHITE:
|
|
std::cout << SEQ_FOREGROUND_LIGHT << foreground << "m";
|
|
break;
|
|
case DEFAULT:
|
|
default:
|
|
std::cout << SEQ_FOREGROUND << foreground << "m";
|
|
break;
|
|
}
|
|
|
|
// set background color
|
|
switch (background) {
|
|
case BLACK:
|
|
case RED:
|
|
case GREEN:
|
|
case YELLOW:
|
|
case BLUE:
|
|
case MAGENTA:
|
|
case CYAN:
|
|
case WHITE:
|
|
std::cout << SEQ_BACKGROUND << background << "m";
|
|
break;
|
|
case LIGHT_BLACK:
|
|
case LIGHT_RED:
|
|
case LIGHT_GREEN:
|
|
case LIGHT_YELLOW:
|
|
case LIGHT_BLUE:
|
|
case LIGHT_MAGENTA:
|
|
case LIGHT_CYAN:
|
|
case LIGHT_WHITE:
|
|
std::cout << SEQ_BACKGROUND_LIGHT << background << "m";
|
|
break;
|
|
case DEFAULT:
|
|
default:
|
|
std::cout << SEQ_BACKGROUND << background << "m";
|
|
break;
|
|
}
|
|
}
|
|
|
|
size_t BaseVisualizer::FindMaxLength(const std::vector<std::string> vec) {
|
|
size_t max = 0;
|
|
size_t currentLength = 0;
|
|
for (const std::string& str : vec) {
|
|
currentLength = CountVisibleCharacters(str);
|
|
(currentLength > max) ? max = CountVisibleCharacters(str) : max;
|
|
}
|
|
return max;
|
|
}
|
|
|