minicrossterm/src/modules/style/styledobject.rs

180 lines
5.6 KiB
Rust
Raw Normal View History

//! This module contains the logic to style an object that contains some state witch can be styled.
2018-07-30 05:30:09 +10:00
use super::{ScreenManager, ObjectStyle, Color};
2018-07-22 22:55:14 +10:00
use std::fmt::{self, Display};
use std::io::Write;
2018-01-28 04:48:49 +11:00
2018-03-04 01:40:51 +11:00
#[cfg(unix)]
2018-07-29 03:46:05 +10:00
use super::Attribute;
#[cfg(windows)]
use super::super::super::manager::WinApiScreenManager;
/// Struct that contains both the style and the content wits can be styled.
pub struct StyledObject<'terminal, D: Display> {
2018-01-04 00:43:54 +11:00
pub object_style: ObjectStyle,
pub content: D,
pub screen_manager: &'terminal ScreenManager,
2018-01-04 00:43:54 +11:00
}
impl<'terminal,D: Display> StyledObject<'terminal,D> {
/// Set the foreground of the styled object to the passed `Color`
///
/// #Example
///
2018-01-04 00:43:54 +11:00
/// ```rust
/// extern crate crossterm;
/// use self::crossterm::style::{paint,Color};
///
/// // create an styled object with the foreground color red.
/// let styledobject = paint("I am colored red").with(Color::Red);
/// // create an styled object with the foreground color blue.
/// let styledobject1 = paint("I am colored blue").with(Color::Blue);
///
/// // print the styledobject to see the result
/// println!("{}", styledobject);
/// println!("{}", styledobject1);
/// // print an styled object directly.
/// println!("{}", paint("I am colored green").with(Color::Green));
2018-07-02 06:43:43 +10:00
///
2018-01-04 00:43:54 +11:00
/// ```
pub fn with(mut self, foreground_color: Color) -> StyledObject<'terminal,D> {
2018-01-04 00:43:54 +11:00
self.object_style = self.object_style.fg(foreground_color);
self
}
/// Set the background of the styled object to the passed `Color`
///
/// #Example
///
2018-07-02 06:43:43 +10:00
/// ```rust
/// extern crate crossterm;
/// use self::crossterm::style::{paint,Color};
///
/// // create an styled object with the background color red.
/// let styledobject = paint("I am colored red").on(Color::Red);
/// // create an styled object with the background color blue.
/// let styledobject1 = paint("I am colored blue").on(Color::Blue);
///
/// // print the styledobjects
/// println!("{}", styledobject);
/// println!("{}", styledobject1);
/// // print an styled object directly.
/// println!("{}", paint("I am colored green").on(Color::Green))
2018-07-02 06:43:43 +10:00
///
2018-01-04 00:43:54 +11:00
/// ```
pub fn on(mut self, background_color: Color) -> StyledObject<'terminal,D> {
2018-01-04 00:43:54 +11:00
self.object_style = self.object_style.bg(background_color);
self
}
/// Set the attribute of an styled object to the passed `Attribute`
///
/// #Example
///
/// ```rust
2018-07-02 06:43:43 +10:00
///
/// extern crate crossterm;
/// use self::crossterm::style::{paint,Attribute};
///
/// println!("{}", paint("Bold").attr(Attribute::Bold));
2018-07-02 06:43:43 +10:00
///
/// ```
#[cfg(unix)]
pub fn attr(mut self, attr: Attribute) -> StyledObject<'terminal,D> {
&self.object_style.add_attr(attr);
self
}
/// Increase the font intensity.
2018-07-02 06:43:43 +10:00
#[cfg(unix)]
#[inline(always)]
2018-07-29 03:46:05 +10:00
pub fn bold(self) -> StyledObject<'terminal,D> {
2018-07-02 06:43:43 +10:00
self.attr(Attribute::Bold)
}
/// Faint (decreased intensity) (Not widely supported).
2018-07-02 06:43:43 +10:00
#[cfg(unix)]
#[inline(always)]
2018-07-29 03:46:05 +10:00
pub fn dim(self) -> StyledObject<'terminal,D> {
2018-07-02 06:43:43 +10:00
self.attr(Attribute::Dim)
}
/// Make the font italic (Not widely supported; Sometimes treated as inverse).
2018-07-02 06:43:43 +10:00
#[cfg(unix)]
#[inline(always)]
2018-07-29 03:46:05 +10:00
pub fn italic(self) -> StyledObject<'terminal,D> {
2018-07-02 06:43:43 +10:00
self.attr(Attribute::Italic)
}
/// Underline font.
2018-07-02 06:43:43 +10:00
#[cfg(unix)]
#[inline(always)]
2018-07-29 03:46:05 +10:00
pub fn underlined(self) -> StyledObject<'terminal,D> {
2018-07-02 06:43:43 +10:00
self.attr(Attribute::Underlined)
}
/// Slow Blink (less than 150 per minute; not widely supported).
2018-07-02 06:43:43 +10:00
#[cfg(unix)]
#[inline(always)]
2018-07-29 03:46:05 +10:00
pub fn slow_blink(self) -> StyledObject<'terminal,D> {
2018-07-02 06:43:43 +10:00
self.attr(Attribute::SlowBlink)
}
/// Rapid Blink (MS-DOS ANSI.SYS; 150+ per minute; not widely supported).
2018-07-02 06:43:43 +10:00
#[cfg(unix)]
#[inline(always)]
2018-07-29 03:46:05 +10:00
pub fn rapid_blink(self) -> StyledObject<'terminal,D> {
2018-07-02 06:43:43 +10:00
self.attr(Attribute::RapidBlink)
}
/// Swap foreground and background colors.
#[cfg(unix)]
#[inline(always)]
2018-07-29 03:46:05 +10:00
pub fn reverse(self) -> StyledObject<'terminal,D> {
2018-07-02 06:43:43 +10:00
self.attr(Attribute::Reverse)
}
/// Hide text (Not widely supported).
2018-07-02 06:43:43 +10:00
#[cfg(unix)]
#[inline(always)]
2018-07-29 03:46:05 +10:00
pub fn hidden(self) -> StyledObject<'terminal,D> {
2018-07-02 06:43:43 +10:00
self.attr(Attribute::Hidden)
}
/// Characters legible, but marked for deletion. Not widely supported.
2018-07-02 06:43:43 +10:00
#[cfg(unix)]
#[inline(always)]
2018-07-29 03:46:05 +10:00
pub fn crossed_out(self) -> StyledObject<'terminal,D> {
2018-07-02 06:43:43 +10:00
self.attr(Attribute::CrossedOut)
}
2018-01-04 00:43:54 +11:00
}
impl<'terminal, D: Display> Display for StyledObject<'terminal,D> {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
2018-07-30 05:30:09 +10:00
let mut colored_terminal = super::super::super::style::color::color(self.screen_manager);
let mut reset = true;
if let Some(bg) = self.object_style.bg_color {
colored_terminal.set_bg(bg);
reset = true;
}
if let Some(fg) = self.object_style.fg_color {
colored_terminal.set_fg(fg);
reset = true;
}
#[cfg(unix)]
2018-07-22 22:55:14 +10:00
for attr in self.object_style.attrs.iter() {
self.screen_manager.write_string(format!(csi!("{}m"), *attr as i16));
reset = true;
}
2018-01-04 00:43:54 +11:00
use std::fmt::Write;
let mut string = String::new();
write!(string, "{}", self.content).unwrap();
self.screen_manager.write_string(string);
self.screen_manager.flush();
if reset {
colored_terminal.reset();
}
Ok(())
}
}