window: add support for textual representation of background color

This commit is contained in:
Andrzej Rybczak
2014-11-09 00:41:09 +01:00
parent 5ff553005d
commit 448c87f850
4 changed files with 67 additions and 50 deletions

View File

@@ -58,8 +58,11 @@ std::pair<std::vector<Column>, std::string> generate_columns(const std::string &
while (!(width = getEnclosedString(format, '(', ')', &pos)).empty())
{
Column col;
col.color = stringToColor(getEnclosedString(format, '[', ']', &pos));
std::string tag_type = getEnclosedString(format, '{', '}', &pos);
auto scolor = getEnclosedString(format, '[', ']', &pos);
if (scolor.empty())
col.color = NC::Color::Default;
else
col.color = boost::lexical_cast<NC::Color>(scolor);
if (*width.rbegin() == 'f')
{
@@ -69,6 +72,7 @@ std::pair<std::vector<Column>, std::string> generate_columns(const std::string &
else
col.fixed = false;
auto tag_type = getEnclosedString(format, '{', '}', &pos);
// alternative name
size_t tag_type_colon_pos = tag_type.find(':');
if (tag_type_colon_pos != std::string::npos)
@@ -243,11 +247,14 @@ bool Configuration::read(const std::string &config_path)
return result;
}));
p.add("visualizer_color", option_parser::worker([this](std::string v) {
boost::sregex_token_iterator i(v.begin(), v.end(), boost::regex("\\w+")), j;
for (; i != j; ++i)
boost::sregex_token_iterator color(v.begin(), v.end(), boost::regex("\\w+")), end;
for (; color != end; ++color)
{
auto color = stringToColor(*i);
visualizer_colors.push_back(color);
try {
visualizer_colors.push_back(boost::lexical_cast<NC::Color>(*color));
} catch (boost::bad_lexical_cast &) {
throw std::runtime_error("invalid color: " + *color);
}
}
if (visualizer_colors.empty())
throw std::runtime_error("empty list");

View File

@@ -50,28 +50,6 @@ NC::Color charToColor(char c)
}
}
NC::Color stringToColor(const std::string &color)
{
NC::Color result = NC::Color::Default;
if (color == "black")
result = NC::Color::Black;
else if (color == "red")
result = NC::Color::Red;
else if (color == "green")
result = NC::Color::Green;
else if (color == "yellow")
result = NC::Color::Yellow;
else if (color == "blue")
result = NC::Color::Blue;
else if (color == "magenta")
result = NC::Color::Magenta;
else if (color == "cyan")
result = NC::Color::Cyan;
else if (color == "white")
result = NC::Color::White;
return result;
}
NC::Border stringToBorder(const std::string &border)
{
NC::Border result = NC::Border::None;

View File

@@ -28,7 +28,6 @@
NC::Color charToColor(char c);
NC::Color stringToColor(const std::string &color);
NC::Border stringToBorder(const std::string &border);
std::string tagTypeToString(mpd_tag_type tag);

View File

@@ -18,6 +18,7 @@
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
@@ -229,38 +230,70 @@ std::ostream &operator<<(std::ostream &os, const Color &c)
else if (c == Color::White)
os << "white";
else if (c.isEnd())
os << "color_end";
os << "end";
else
os << "color_" << c.foreground() << "_" << c.background();
os << c.foreground() << "_" << c.background();
return os;
}
std::istream &operator>>(std::istream &is, Color &c)
{
auto get_single_color = [](const std::string &s) {
std::cerr << "s: " << s << "\n";
short result = -1;
if (s == "black")
result = COLOR_BLACK;
else if (s == "red")
result = COLOR_RED;
else if (s == "green")
result = COLOR_GREEN;
else if (s == "yellow")
result = COLOR_YELLOW;
else if (s == "blue")
result = COLOR_BLUE;
else if (s == "magenta")
result = COLOR_MAGENTA;
else if (s == "cyan")
result = COLOR_CYAN;
else if (s == "white")
result = COLOR_WHITE;
else if (std::all_of(s.begin(), s.end(), isdigit))
{
result = atoi(s.c_str());
if (result < 1 || result > 256)
result = -1;
else
--result;
}
return result;
};
std::string sc;
is >> sc;
if (sc == "default")
c = Color::Default;
else if (sc == "black")
c = Color::Black;
else if (sc == "red")
c = Color::Red;
else if (sc == "green")
c = Color::Green;
else if (sc == "yellow")
c = Color::Yellow;
else if (sc == "blue")
c = Color::Blue;
else if (sc == "magenta")
c = Color::Magenta;
else if (sc == "cyan")
c = Color::Cyan;
else if (sc == "white")
c = Color::White;
else if (sc == "color_end")
c = Color::Default;
else if (sc == "end")
c = Color::End;
else
is.setstate(std::ios::failbit);
{
short value = get_single_color(sc);
if (value != -1)
c = Color(value);
else
{
size_t underscore = sc.find('_');
if (underscore != std::string::npos)
{
short fg = get_single_color(sc.substr(0, underscore));
short bg = get_single_color(sc.substr(underscore+1));
if (fg != -1 && bg != -1)
c = Color(fg, bg);
else
is.setstate(std::ios::failbit);
}
else
is.setstate(std::ios::failbit);
}
}
return is;
}