use crate::color::Color;
use crate::cursor::Cursor;
use crate::keyboard::KeyboardEnhancements;
use crate::model::Cmd;
use crate::mouse::MouseMsg;
use std::sync::Arc;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum MouseMode {
#[default]
MouseModeNone = 0,
MouseModeCellMotion = 1,
MouseModeAllMotion = 2,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ProgressBarState {
ProgressBarNone = 0,
ProgressBarDefault,
ProgressBarError,
ProgressBarIndeterminate,
ProgressBarWarning,
}
impl ProgressBarState {
pub fn to_string(&self) -> &'static str {
match self {
ProgressBarState::ProgressBarNone => "None",
ProgressBarState::ProgressBarDefault => "Default",
ProgressBarState::ProgressBarError => "Error",
ProgressBarState::ProgressBarIndeterminate => "Indeterminate",
ProgressBarState::ProgressBarWarning => "Warning",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ProgressBar {
pub state: ProgressBarState,
pub value: usize,
}
pub fn new_progress_bar(state: ProgressBarState, value: usize) -> ProgressBar {
ProgressBar {
state,
value: value.clamp(0, 100),
}
}
pub type OnMouseFn = Arc<dyn Fn(MouseMsg) -> Cmd + Send + Sync>;
pub struct View {
pub content: String,
pub on_mouse: Option<OnMouseFn>,
pub cursor: Option<Cursor>,
pub background_color: Option<Color>,
pub foreground_color: Option<Color>,
pub window_title: String,
pub alt_screen: bool,
pub report_focus: bool,
pub disable_bracketed_paste_mode: bool,
pub mouse_mode: MouseMode,
pub keyboard_enhancements: KeyboardEnhancements,
pub progress_bar: Option<ProgressBar>,
}
impl Clone for View {
fn clone(&self) -> View {
View {
content: self.content.clone(),
on_mouse: self.on_mouse.clone(),
cursor: self.cursor.clone(),
background_color: self.background_color,
foreground_color: self.foreground_color,
window_title: self.window_title.clone(),
alt_screen: self.alt_screen,
report_focus: self.report_focus,
disable_bracketed_paste_mode: self.disable_bracketed_paste_mode,
mouse_mode: self.mouse_mode,
keyboard_enhancements: self.keyboard_enhancements,
progress_bar: self.progress_bar,
}
}
}
impl PartialEq for View {
fn eq(&self, other: &View) -> bool {
self.content == other.content
&& self.cursor == other.cursor
&& self.background_color == other.background_color
&& self.foreground_color == other.foreground_color
&& self.window_title == other.window_title
&& self.alt_screen == other.alt_screen
&& self.report_focus == other.report_focus
&& self.disable_bracketed_paste_mode == other.disable_bracketed_paste_mode
&& self.mouse_mode == other.mouse_mode
&& self.keyboard_enhancements == other.keyboard_enhancements
&& self.progress_bar == other.progress_bar
}
}
impl Default for View {
fn default() -> Self {
Self {
content: String::new(),
on_mouse: None,
cursor: None,
background_color: None,
foreground_color: None,
window_title: String::new(),
alt_screen: false,
report_focus: false,
disable_bracketed_paste_mode: false,
mouse_mode: MouseMode::MouseModeNone,
keyboard_enhancements: KeyboardEnhancements::default(),
progress_bar: None,
}
}
}
impl View {
pub fn new(content: &str) -> Self {
let mut v = Self::default();
v.set_content(content);
v
}
pub fn set_content(&mut self, s: &str) {
self.content = s.to_string();
}
}
impl View {
pub fn equals(&self, o: &View) -> bool {
self.content == o.content
&& self.alt_screen == o.alt_screen
&& self.report_focus == o.report_focus
&& self.disable_bracketed_paste_mode == o.disable_bracketed_paste_mode
&& self.window_title == o.window_title
&& self.mouse_mode == o.mouse_mode
&& self.background_color == o.background_color
&& self.foreground_color == o.foreground_color
&& self.keyboard_enhancements == o.keyboard_enhancements
&& self.cursor == o.cursor
&& self.progress_bar == o.progress_bar
}
}