00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef STYLE_H
00021 #define STYLE_H
00022
00023 #include <ncursesw/curses.h>
00024
00025 #include <cwidget/curses++.h>
00026
00027 #include <string>
00028
00029 #include <cwidget/config/colors.h>
00030
00031 #include <cwidget/generic/util/eassert.h>
00032
00033 namespace cwidget
00034 {
00051 class style
00052 {
00054 short fg;
00058 short bg;
00059
00061 attr_t set_attrs;
00063 attr_t clear_attrs;
00067 attr_t flip_attrs;
00068
00069
00070
00071
00072 public:
00074 style():fg(-1), bg(-2), set_attrs(0), clear_attrs(0), flip_attrs(0)
00075 {
00076 }
00077
00081 void set_fg(short _fg) {if(_fg >= 0) fg=_fg;}
00082
00086 void set_bg(short _bg) {if(_bg >= -1) bg = _bg;}
00087
00089 void attrs_on(attr_t attrs)
00090 {
00091 set_attrs|=attrs;
00092 clear_attrs&=~attrs;
00093 flip_attrs&=~attrs;
00094 }
00095
00097 void attrs_off(attr_t attrs)
00098 {
00099 clear_attrs|=attrs;
00100 set_attrs&=~attrs;
00101 flip_attrs&=~attrs;
00102 }
00103
00105 void attrs_flip(attr_t attrs)
00106 {
00107 flip_attrs^=attrs;
00108 }
00109
00113 void apply_style(const style &other)
00114 {
00115 set_fg(other.fg);
00116 set_bg(other.bg);
00117 attrs_on(other.set_attrs);
00118 attrs_off(other.clear_attrs);
00119 attrs_flip(other.flip_attrs);
00120 }
00121
00125 style operator+(const style &other) const
00126 {
00127 style rval(*this);
00128 rval+=other;
00129 return rval;
00130 }
00131
00133 style &operator+=(const style &other)
00134 {
00135 apply_style(other);
00136 return *this;
00137 }
00138
00139 bool operator==(const style &other) const
00140 {
00141 return fg == other.fg && bg == other.bg &&
00142 set_attrs == other.set_attrs && clear_attrs == other.clear_attrs &&
00143 flip_attrs == other.flip_attrs;
00144 }
00145
00146 bool operator!=(const style &other) const
00147 {
00148 return fg != other.fg || bg != other.bg ||
00149 set_attrs != other.set_attrs || clear_attrs != other.clear_attrs ||
00150 flip_attrs != other.flip_attrs;
00151 }
00152
00154 short get_fg() const {return fg<0?0:fg;}
00156 short get_bg() const {return bg<0?0:bg;}
00158 attr_t get_attrs() const
00159 {
00160 attr_t rval=0;
00161 rval |= set_attrs;
00162 rval &= ~clear_attrs;
00163 rval ^= flip_attrs;
00164 rval |= config::mix_color(0, fg, bg);
00165 if(fg == bg)
00166 rval |= A_INVIS;
00167 return rval;
00168 }
00169
00171 chtype apply_to(chtype ch) const
00172 {
00173
00174
00175
00176 return (ch & A_CHARTEXT) |
00177 config::mix_color(ch, fg, bg) |
00178 ((((ch & ~ (A_CHARTEXT | A_COLOR)) | set_attrs) & ~clear_attrs) ^ flip_attrs);
00179 }
00180
00182 wchtype apply_to(wchtype ch) const
00183 {
00184
00185
00186
00187 return wchtype(ch.ch,
00188 config::mix_color(ch.attrs, fg, bg) |
00189 ((((ch.attrs & ~ A_COLOR) | set_attrs) & ~clear_attrs) ^ flip_attrs));
00190 }
00191 };
00192
00193
00194
00195
00196
00200 inline style style_fg(short fg)
00201 {
00202 style rval;
00203 rval.set_fg(fg);
00204 return rval;
00205 }
00206
00210 inline style style_bg(short bg)
00211 {
00212 style rval;
00213 rval.set_bg(bg);
00214 return rval;
00215 }
00216
00219 inline style style_attrs_on(attr_t attrs)
00220 {
00221 style rval;
00222 rval.attrs_on(attrs);
00223 return rval;
00224 }
00225
00227 inline style style_attrs_off(attr_t attrs)
00228 {
00229 style rval;
00230 rval.attrs_off(attrs);
00231 return rval;
00232 }
00233
00235 inline style style_attrs_flip(attr_t attrs)
00236 {
00237 style rval;
00238 rval.attrs_flip(attrs);
00239 return rval;
00240 }
00241
00246 const style &get_style(const std::string &name);
00247
00249 void set_style(const std::string &name, const style &style);
00250 }
00251
00252 #endif // STYLE_H