window: add support for textual representation of background color
This commit is contained in:
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user