transm/3rd/ColorConsole.hpp

225 lines
6.3 KiB
C++

// Based on https://gitee.com/whatitis/ColorfulConsoleIO/ modification
#include <iostream>
#include <string>
#if defined(_WIN32)
#include <windows.h>
#endif // OS_TYPE_WINDOWS_CC
// Enum class for console text color
enum class ConsoleColor {
Green,
Red,
Blue,
White,
Black,
Yellow,
Purple,
Gray,
Cyan,
None,
GreenIntensity,
RedIntensity,
BlueIntensity,
WhiteIntensity,
BlackIntensity,
YellowIntensity,
PurpleIntensity,
GrayIntensity,
CyanIntensity
};
// Enum class for console background color
enum class ConsoleBackgroundColor {
Green,
Red,
Blue,
White,
Black,
Yellow,
Purple,
Gray,
Cyan,
None
};
#if defined(_WIN32)
// Get the Windows color code for a given ConsoleColor
inline WORD GetColorCode(ConsoleColor color)
{
switch (color) {
case ConsoleColor::Green:
return FOREGROUND_GREEN;
case ConsoleColor::Black:
return 0;
case ConsoleColor::Blue:
return FOREGROUND_BLUE;
case ConsoleColor::Gray:
return FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
case ConsoleColor::Purple:
return FOREGROUND_BLUE | FOREGROUND_RED;
case ConsoleColor::Red:
return FOREGROUND_RED;
case ConsoleColor::White:
return FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN;
case ConsoleColor::Cyan:
return FOREGROUND_BLUE | FOREGROUND_GREEN;
case ConsoleColor::Yellow:
return FOREGROUND_RED | FOREGROUND_GREEN;
case ConsoleColor::None:
return FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN;
case ConsoleColor::GreenIntensity:
return FOREGROUND_GREEN | FOREGROUND_INTENSITY;
case ConsoleColor::BlackIntensity:
return 0;
case ConsoleColor::BlueIntensity:
return FOREGROUND_BLUE | FOREGROUND_INTENSITY;
case ConsoleColor::GrayIntensity:
return FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY;
case ConsoleColor::PurpleIntensity:
return FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY;
case ConsoleColor::RedIntensity:
return FOREGROUND_RED | FOREGROUND_INTENSITY;
case ConsoleColor::WhiteIntensity:
return FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
case ConsoleColor::YellowIntensity:
return FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
case ConsoleColor::CyanIntensity:
return FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
default:
return 0;
}
}
#else
// Get the ANSI escape code for a given ConsoleColor
inline std::string GetColorCode(ConsoleColor color)
{
switch (color) {
case ConsoleColor::Green:
return "\033[32m";
case ConsoleColor::Black:
return "\033[30m";
case ConsoleColor::Blue:
return "\033[34m";
case ConsoleColor::Gray:
return "\033[37m";
case ConsoleColor::Purple:
return "\033[35m";
case ConsoleColor::Red:
return "\033[31m";
case ConsoleColor::White:
return "\033[37m";
case ConsoleColor::Cyan:
return "\033[36m";
case ConsoleColor::Yellow:
return "\033[33m";
case ConsoleColor::None:
return "\033[0m";
case ConsoleColor::GreenIntensity:
return "\033[32m;1m";
case ConsoleColor::BlackIntensity:
return "\033[30m;1m";
case ConsoleColor::BlueIntensity:
return "\033[34m;1m";
case ConsoleColor::GrayIntensity:
return "\033[37m;1m";
case ConsoleColor::PurpleIntensity:
return "\033[35m;1m";
case ConsoleColor::RedIntensity:
return "\033[31m;1m";
case ConsoleColor::WhiteIntensity:
return "\033[37m;1m";
case ConsoleColor::YellowIntensity:
return "\033[33m;1m";
case ConsoleColor::CyanIntensity:
return "\033[36m;1m";
default:
return 0;
}
}
#endif
#if defined(_WIN32)
// Get the Windows color code for a given ConsoleBackgroundColor
inline WORD GetBackgroundColorCode(ConsoleBackgroundColor color)
{
switch (color) {
case ConsoleBackgroundColor::Green:
return BACKGROUND_GREEN;
case ConsoleBackgroundColor::Black:
return 0;
case ConsoleBackgroundColor::Blue:
return BACKGROUND_BLUE;
case ConsoleBackgroundColor::Gray:
return 0;
case ConsoleBackgroundColor::Purple:
return BACKGROUND_RED | BACKGROUND_BLUE;
case ConsoleBackgroundColor::Red:
return BACKGROUND_RED;
case ConsoleBackgroundColor::White:
return BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_GREEN;
case ConsoleBackgroundColor::Cyan:
return BACKGROUND_BLUE | BACKGROUND_GREEN;
case ConsoleBackgroundColor::Yellow:
return BACKGROUND_RED | BACKGROUND_GREEN;
case ConsoleBackgroundColor::None:
return 0;
default:
return 0;
}
}
#else
// Get the ANSI escape code for a given ConsoleBackgroundColor
inline std::string GetBackgroundColorCode(ConsoleBackgroundColor color)
{
switch (color) {
case ConsoleBackgroundColor::Green:
return "\033[42m";
case ConsoleBackgroundColor::Black:
return "\033[40m";
case ConsoleBackgroundColor::Blue:
return "\033[44m";
case ConsoleBackgroundColor::Gray:
return "\033[40m";
case ConsoleBackgroundColor::Purple:
return "\033[45m";
case ConsoleBackgroundColor::Red:
return "\033[41m";
case ConsoleBackgroundColor::White:
return "\033[47m";
case ConsoleBackgroundColor::Cyan:
return "\033[46m";
case ConsoleBackgroundColor::Yellow:
return "\033[43m";
case ConsoleBackgroundColor::None:
return "\033[40m";
default:
return 0;
}
}
#endif
// Operator overloading for console text color
inline std::ostream& operator<<(std::ostream& os, ConsoleColor data)
{
#if defined(_WIN32)
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle, GetColorCode(data));
#else
std::cout << GetColorCode(data);
#endif
return os;
}
// Operator overloading for console background color
inline std::ostream& operator<<(std::ostream& os, ConsoleBackgroundColor data)
{
#if defined(_WIN32)
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle, GetBackgroundColorCode(data));
#else
std::cout << GetBackgroundColorCode(data);
#endif
return os;
}