mirror of
https://github.com/fdehau/tui-rs.git
synced 2024-11-11 01:10:24 +00:00
Rebase and include necessary curses changes
This commit is contained in:
parent
a25bbea555
commit
21e79ca078
@ -44,12 +44,11 @@ impl Backend for CursesBackend {
|
|||||||
let mut style = Style {
|
let mut style = Style {
|
||||||
fg: Color::Reset,
|
fg: Color::Reset,
|
||||||
bg: Color::Reset,
|
bg: Color::Reset,
|
||||||
modifier: Modifier::Reset,
|
modifier: Modifier::empty(),
|
||||||
};
|
};
|
||||||
let mut curses_style = CursesStyle {
|
let mut curses_style = CursesStyle {
|
||||||
fg: easycurses::Color::White,
|
fg: easycurses::Color::White,
|
||||||
bg: easycurses::Color::Black,
|
bg: easycurses::Color::Black,
|
||||||
attribute: pancurses::Attribute::Normal,
|
|
||||||
};
|
};
|
||||||
let mut update_color = false;
|
let mut update_color = false;
|
||||||
for (col, row, cell) in content {
|
for (col, row, cell) in content {
|
||||||
@ -60,12 +59,7 @@ impl Backend for CursesBackend {
|
|||||||
last_col = col;
|
last_col = col;
|
||||||
last_row = row;
|
last_row = row;
|
||||||
if cell.style.modifier != style.modifier {
|
if cell.style.modifier != style.modifier {
|
||||||
if curses_style.attribute != pancurses::Attribute::Normal {
|
apply_modifier_diff(&mut self.curses.win, style.modifier, cell.style.modifier);
|
||||||
self.curses.win.attroff(curses_style.attribute);
|
|
||||||
}
|
|
||||||
let attribute: pancurses::Attribute = cell.style.modifier.into();
|
|
||||||
self.curses.win.attron(attribute);
|
|
||||||
curses_style.attribute = attribute;
|
|
||||||
style.modifier = cell.style.modifier;
|
style.modifier = cell.style.modifier;
|
||||||
};
|
};
|
||||||
if cell.style.fg != style.fg {
|
if cell.style.fg != style.fg {
|
||||||
@ -138,7 +132,6 @@ impl Backend for CursesBackend {
|
|||||||
struct CursesStyle {
|
struct CursesStyle {
|
||||||
fg: easycurses::Color,
|
fg: easycurses::Color,
|
||||||
bg: easycurses::Color,
|
bg: easycurses::Color,
|
||||||
attribute: pancurses::Attribute,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
@ -224,22 +217,67 @@ impl From<Color> for Option<easycurses::Color> {
|
|||||||
Color::Cyan | Color::LightCyan => Some(easycurses::Color::Cyan),
|
Color::Cyan | Color::LightCyan => Some(easycurses::Color::Cyan),
|
||||||
Color::White | Color::Gray | Color::DarkGray => Some(easycurses::Color::White),
|
Color::White | Color::Gray | Color::DarkGray => Some(easycurses::Color::White),
|
||||||
Color::Blue | Color::LightBlue => Some(easycurses::Color::Blue),
|
Color::Blue | Color::LightBlue => Some(easycurses::Color::Blue),
|
||||||
|
Color::Indexed(_) => None,
|
||||||
Color::Rgb(_, _, _) => None,
|
Color::Rgb(_, _, _) => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Modifier> for pancurses::Attribute {
|
fn apply_modifier_diff(win: &mut pancurses::Window, from: Modifier, to: Modifier) {
|
||||||
fn from(modifier: Modifier) -> pancurses::Attribute {
|
remove_modifier(win, from - to);
|
||||||
match modifier {
|
add_modifier(win, to - from);
|
||||||
Modifier::Blink => pancurses::Attribute::Blink,
|
}
|
||||||
Modifier::Bold => pancurses::Attribute::Bold,
|
|
||||||
Modifier::CrossedOut => pancurses::Attribute::Strikeout,
|
fn remove_modifier(win: &mut pancurses::Window, remove: Modifier) {
|
||||||
Modifier::Faint => pancurses::Attribute::Dim,
|
if remove.contains(Modifier::BOLD) {
|
||||||
Modifier::Invert => pancurses::Attribute::Reverse,
|
win.attroff(pancurses::Attribute::Bold);
|
||||||
Modifier::Italic => pancurses::Attribute::Italic,
|
|
||||||
Modifier::Underline => pancurses::Attribute::Underline,
|
|
||||||
_ => pancurses::Attribute::Normal,
|
|
||||||
}
|
}
|
||||||
|
if remove.contains(Modifier::DIM) {
|
||||||
|
win.attroff(pancurses::Attribute::Dim);
|
||||||
|
}
|
||||||
|
if remove.contains(Modifier::ITALIC) {
|
||||||
|
win.attroff(pancurses::Attribute::Italic);
|
||||||
|
}
|
||||||
|
if remove.contains(Modifier::UNDERLINED) {
|
||||||
|
win.attroff(pancurses::Attribute::Underline);
|
||||||
|
}
|
||||||
|
if remove.contains(Modifier::SLOW_BLINK) || remove.contains(Modifier::RAPID_BLINK) {
|
||||||
|
win.attroff(pancurses::Attribute::Blink);
|
||||||
|
}
|
||||||
|
if remove.contains(Modifier::REVERSED) {
|
||||||
|
win.attroff(pancurses::Attribute::Reverse);
|
||||||
|
}
|
||||||
|
if remove.contains(Modifier::HIDDEN) {
|
||||||
|
win.attroff(pancurses::Attribute::Invisible);
|
||||||
|
}
|
||||||
|
if remove.contains(Modifier::CROSSED_OUT) {
|
||||||
|
win.attroff(pancurses::Attribute::Strikeout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_modifier(win: &mut pancurses::Window, add: Modifier) {
|
||||||
|
if add.contains(Modifier::BOLD) {
|
||||||
|
win.attron(pancurses::Attribute::Bold);
|
||||||
|
}
|
||||||
|
if add.contains(Modifier::DIM) {
|
||||||
|
win.attron(pancurses::Attribute::Dim);
|
||||||
|
}
|
||||||
|
if add.contains(Modifier::ITALIC) {
|
||||||
|
win.attron(pancurses::Attribute::Italic);
|
||||||
|
}
|
||||||
|
if add.contains(Modifier::UNDERLINED) {
|
||||||
|
win.attron(pancurses::Attribute::Underline);
|
||||||
|
}
|
||||||
|
if add.contains(Modifier::SLOW_BLINK) || add.contains(Modifier::RAPID_BLINK) {
|
||||||
|
win.attron(pancurses::Attribute::Blink);
|
||||||
|
}
|
||||||
|
if add.contains(Modifier::REVERSED) {
|
||||||
|
win.attron(pancurses::Attribute::Reverse);
|
||||||
|
}
|
||||||
|
if add.contains(Modifier::HIDDEN) {
|
||||||
|
win.attron(pancurses::Attribute::Invisible);
|
||||||
|
}
|
||||||
|
if add.contains(Modifier::CROSSED_OUT) {
|
||||||
|
win.attron(pancurses::Attribute::Strikeout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user