sources/interface.cpp

changeset 46
19be47c9bab7
parent 45
87b180260a5d
child 47
35b968619b0c
--- 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);
-}

mercurial