--- a/sources/interface.cpp Mon Dec 15 21:46:05 2014 +0200 +++ b/sources/interface.cpp Mon Dec 15 21:59:24 2014 +0200 @@ -32,51 +32,7 @@ #include "interface.h" #include "network/rconsession.h" #include "network/ipaddress.h" - -enum -{ - RLINE_ON_BLACK = 256, - RLINE_ON_RED, - RLINE_ON_GREEN, - RLINE_ON_YELLOW, - RLINE_ON_BLUE, - RLINE_ON_MAGENTA, - RLINE_ON_CYAN, - RLINE_ON_WHITE, - RLINE_ON_BOLD, - RLINE_OFF_BLACK, - RLINE_OFF_RED, - RLINE_OFF_GREEN, - RLINE_OFF_YELLOW, - RLINE_OFF_BLUE, - RLINE_OFF_MAGENTA, - RLINE_OFF_CYAN, - RLINE_OFF_WHITE, - RLINE_OFF_BOLD, -}; - -class RendererLine -{ -public: - RendererLine() {} - - METHOD data() const -> const Vector<int>& { return m_data; } - METHOD length() const -> int { return m_length; } - METHOD add_char (char ch) -> void; - METHOD finalize() -> void; - METHOD rows (int cols) const -> int; - -private: - METHOD set_color (Color a, bool on) -> void; - - Vector<int> m_data; - int m_length = 0; - bool m_final = false; - Color m_activeColor = DEFAULT; - bool m_boldActive = false; - int m_colorCodeStage = 0; - String m_string; -}; +#include "coloredline.h" static const int g_pageSize = 10; @@ -97,7 +53,7 @@ static bool g_needInputRender = false; static bool g_needOutputRender = false; static struct { char ch; int x; } g_cursorChar; -static Vector<RendererLine> g_output;; +static Vector<ColoredLine> g_output;; static int g_outputScroll = 0; static String g_title; static InputState g_inputState = INPUTSTATE_NORMAL; @@ -105,32 +61,6 @@ static IPAddress g_address; static String g_statusBarText; -static const struct { Color color; bool bold; } g_colorCodes['v' - 'a' + 1] = -{ - { RED, true }, // a - brick - { YELLOW, true }, // b - tan - { WHITE, false }, // c - gray - { GREEN, true }, // d - light green - { YELLOW, false }, // e - brown - { YELLOW, true }, // f - gold yellow - { RED, true }, // g - bright red - { BLUE, false }, // h - dark blue - { YELLOW, false }, // i - orange - { WHITE, true }, // j - white - { YELLOW, true }, // k - fire yellow - { DEFAULT, false }, // l - untranslated - { BLACK, false }, // m - black - { BLUE, true }, // n - light blue - { YELLOW, true }, // o - cream - { GREEN, true }, // p - olive green - { GREEN, false }, // q - dark green - { RED, false }, // r - dark red - { YELLOW, false }, // s - dark brown - { MAGENTA, false }, // t - purple - { BLACK, true }, // u - dark gray - { CYAN, true }, // v - cyan -}; - // ------------------------------------------------------------------------------------------------- // static FUNCTION @@ -255,7 +185,7 @@ g_input.clear(); g_input << ""; g_output.clear(); - g_output << RendererLine(); + g_output << ColoredLine(); g_title = format (APPNAME " %1 (%2)", full_version_string(), changeset_date_string()); for (int i = 0; i < NUM_COLORS; ++i) @@ -908,7 +838,7 @@ if (ch == '\n') { g_output[g_output.size() - 1].finalize(); - g_output << RendererLine(); + g_output << ColoredLine(); continue; } @@ -940,97 +870,3 @@ session->set_password (password); session->connect (g_address); } - -// ------------------------------------------------------------------------------------------------- -// -METHOD -RendererLine::finalize() -> void -{ - if (m_activeColor != DEFAULT) - this->set_color (m_activeColor, false); - - if (m_boldActive) - m_data << RLINE_OFF_BOLD; - - m_final = true; -} - -// ------------------------------------------------------------------------------------------------- -// -METHOD -RendererLine::add_char (char ch) -> void -{ - if (m_final) - return; // Don't touch finalized lines. - - if (ch == '\x1C' and m_colorCodeStage == 0) - { - m_colorCodeStage = 1; - return; - } - - if (m_colorCodeStage == 1) - { - if (m_activeColor != DEFAULT) - this->set_color (m_activeColor, false); - - if (m_boldActive) - m_data << RLINE_OFF_BOLD; - - if (ch >= 'a' and ch <= 'v' and ch != 'l') - { - auto colorInfo = g_colorCodes[ch - 'a']; - m_activeColor = colorInfo.color; - m_boldActive = colorInfo.bold; - assert (m_activeColor < 8); - this->set_color (m_activeColor, true); - - if (m_boldActive) - m_data << RLINE_ON_BOLD; - } - - m_colorCodeStage = 0; - return; - } - - if (isprint (ch)) - { - m_string += ch; - m_data << int (ch); - ++m_length; - } -} - -// ------------------------------------------------------------------------------------------------- -// -METHOD -RendererLine::set_color (Color a, bool on) -> void -{ - switch (a) - { - case BLACK: m_data << (on ? RLINE_ON_BLACK : RLINE_OFF_BLACK); break; - case RED: m_data << (on ? RLINE_ON_RED : RLINE_OFF_RED); break; - case GREEN: m_data << (on ? RLINE_ON_GREEN : RLINE_OFF_GREEN); break; - case YELLOW: m_data << (on ? RLINE_ON_YELLOW : RLINE_OFF_YELLOW); break; - case BLUE: m_data << (on ? RLINE_ON_BLUE : RLINE_OFF_BLUE); break; - case MAGENTA: m_data << (on ? RLINE_ON_MAGENTA : RLINE_OFF_MAGENTA); break; - case CYAN: m_data << (on ? RLINE_ON_CYAN : RLINE_OFF_CYAN); break; - case WHITE: m_data << (on ? RLINE_ON_WHITE : RLINE_OFF_WHITE); break; - case NUM_COLORS: - case DEFAULT: assert (false); break; - } -} - -// ------------------------------------------------------------------------------------------------- -// How many rows does this line take up? -// -METHOD -RendererLine::rows (int cols) const -> int -{ - int rows = length() / cols; - - if (length() % cols != 0) - rows++; - - return max (rows, 1); -}