use crate::Scheme;
use rat_widget::button::ButtonStyle;
use rat_widget::file_dialog::FileDialogStyle;
use rat_widget::line_number::LineNumberStyle;
use rat_widget::list::ListStyle;
use rat_widget::menu::MenuStyle;
use rat_widget::msgdialog::MsgDialogStyle;
use rat_widget::scrolled::ScrollStyle;
use rat_widget::splitter::SplitStyle;
use rat_widget::tabbed::TabbedStyle;
use rat_widget::table::TableStyle;
use rat_widget::text_input::TextInputStyle;
use rat_widget::textarea::TextAreaStyle;
use ratatui::prelude::{Style, Stylize};
use ratatui::widgets::Block;
#[derive(Debug, Clone)]
pub struct DarkTheme {
s: Scheme,
name: String,
}
impl DarkTheme {
pub fn new(name: String, s: Scheme) -> Self {
Self { s, name }
}
}
impl DarkTheme {
pub fn name(&self) -> &str {
&self.name
}
pub fn dark_theme(&self) -> bool {
true
}
pub fn scheme(&self) -> &Scheme {
&self.s
}
pub fn white(&self, n: usize) -> Style {
self.s.style(self.s.white[n])
}
pub fn black(&self, n: usize) -> Style {
self.s.style(self.s.black[n])
}
pub fn gray(&self, n: usize) -> Style {
self.s.style(self.s.gray[n])
}
pub fn red(&self, n: usize) -> Style {
self.s.style(self.s.red[n])
}
pub fn orange(&self, n: usize) -> Style {
self.s.style(self.s.orange[n])
}
pub fn yellow(&self, n: usize) -> Style {
self.s.style(self.s.yellow[n])
}
pub fn limegreen(&self, n: usize) -> Style {
self.s.style(self.s.limegreen[n])
}
pub fn green(&self, n: usize) -> Style {
self.s.style(self.s.green[n])
}
pub fn bluegreen(&self, n: usize) -> Style {
self.s.style(self.s.bluegreen[n])
}
pub fn cyan(&self, n: usize) -> Style {
self.s.style(self.s.cyan[n])
}
pub fn blue(&self, n: usize) -> Style {
self.s.style(self.s.blue[n])
}
pub fn deepblue(&self, n: usize) -> Style {
self.s.style(self.s.deepblue[n])
}
pub fn purple(&self, n: usize) -> Style {
self.s.style(self.s.purple[n])
}
pub fn magenta(&self, n: usize) -> Style {
self.s.style(self.s.magenta[n])
}
pub fn redpink(&self, n: usize) -> Style {
self.s.style(self.s.redpink[n])
}
pub fn primary(&self, n: usize) -> Style {
self.s.style(self.s.primary[n])
}
pub fn secondary(&self, n: usize) -> Style {
self.s.style(self.s.secondary[n])
}
pub fn focus(&self) -> Style {
let bg = self.s.primary[2];
Style::default().fg(self.s.text_color(bg)).bg(bg)
}
pub fn select(&self) -> Style {
let bg = self.s.secondary[1];
Style::default().fg(self.s.text_color(bg)).bg(bg)
}
pub fn text_input(&self) -> Style {
Style::default().fg(self.s.black[0]).bg(self.s.gray[3])
}
pub fn text_focus(&self) -> Style {
let bg = self.s.primary[0];
Style::default().fg(self.s.text_color(bg)).bg(bg)
}
pub fn text_select(&self) -> Style {
let bg = self.s.secondary[0];
Style::default().fg(self.s.text_color(bg)).bg(bg)
}
pub fn data(&self) -> Style {
Style::default().fg(self.s.white[0]).bg(self.s.black[1])
}
pub fn dialog_style(&self) -> Style {
Style::default().fg(self.s.white[2]).bg(self.s.gray[1])
}
pub fn status_style(&self) -> Style {
Style::default().fg(self.s.white[0]).bg(self.s.black[2])
}
pub fn line_nr_style(&self) -> LineNumberStyle {
LineNumberStyle {
style: self.data().fg(self.s.gray[0]),
cursor: Some(self.text_select()),
..LineNumberStyle::default()
}
}
pub fn textarea_style(&self) -> TextAreaStyle {
TextAreaStyle {
style: self.data(),
focus: Some(self.focus()),
select: Some(self.text_select()),
..TextAreaStyle::default()
}
}
pub fn input_style(&self) -> TextInputStyle {
TextInputStyle {
style: self.text_input(),
focus: Some(self.text_focus()),
select: Some(self.text_select()),
invalid: Some(Style::default().bg(self.s.red[3])),
..TextInputStyle::default()
}
}
pub fn menu_style(&self) -> MenuStyle {
let menu = Style::default().fg(self.s.white[3]).bg(self.s.black[2]);
MenuStyle {
style: menu,
title: Some(Style::default().fg(self.s.black[0]).bg(self.s.yellow[2])),
select: Some(self.select()),
focus: Some(self.focus()),
right: Some(Style::default().fg(self.s.bluegreen[0])),
disabled: Some(Style::default().fg(self.s.gray[0])),
highlight: Some(Style::default().underlined()),
popup_block: Some(Block::bordered()),
..Default::default()
}
}
pub fn table_style(&self) -> TableStyle {
TableStyle {
style: self.data(),
select_row: Some(self.select()),
show_row_focus: true,
focus_style: Some(self.focus()),
..Default::default()
}
}
pub fn list_style(&self) -> ListStyle {
ListStyle {
style: self.data(),
select: Some(self.select()),
focus: Some(self.focus()),
..Default::default()
}
}
pub fn button_style(&self) -> ButtonStyle {
ButtonStyle {
style: Style::default()
.fg(self.s.text_color(self.s.primary[0]))
.bg(self.s.primary[0]),
focus: Some(
Style::default()
.fg(self.s.text_color(self.s.primary[3]))
.bg(self.s.primary[3]),
),
armed: Some(Style::default().fg(self.s.black[0]).bg(self.s.secondary[0])),
..Default::default()
}
}
pub fn scroll_style(&self) -> ScrollStyle {
let style = Style::default().fg(self.s.gray[0]).bg(self.s.black[1]);
let arrow_style = Style::default().fg(self.s.secondary[0]).bg(self.s.black[1]);
ScrollStyle {
thumb_style: Some(style),
track_style: Some(style),
min_style: Some(style),
begin_style: Some(arrow_style),
end_style: Some(arrow_style),
..Default::default()
}
}
pub fn split_style(&self) -> SplitStyle {
let style = Style::default().fg(self.s.gray[0]).bg(self.s.black[1]);
let arrow_style = Style::default().fg(self.s.secondary[0]).bg(self.s.black[1]);
SplitStyle {
style,
arrow_style: Some(arrow_style),
drag_style: Some(self.focus()),
..Default::default()
}
}
pub fn tabbed_style(&self) -> TabbedStyle {
let style = Style::default().fg(self.s.gray[0]).bg(self.s.black[1]);
TabbedStyle {
style,
tab: Some(self.gray(1)),
select: Some(self.gray(3)),
focus: Some(self.focus()),
..Default::default()
}
}
pub fn statusline_style(&self) -> Vec<Style> {
let s = &self.s;
vec![
self.status_style(),
Style::default().fg(s.text_color(s.white[0])).bg(s.blue[3]),
Style::default().fg(s.text_color(s.white[0])).bg(s.blue[2]),
Style::default().fg(s.text_color(s.white[0])).bg(s.blue[1]),
]
}
pub fn msg_dialog_style(&self) -> MsgDialogStyle {
MsgDialogStyle {
style: self.dialog_style(),
button: self.button_style(),
..Default::default()
}
}
pub fn file_dialog_style(&self) -> FileDialogStyle {
FileDialogStyle {
style: self.dialog_style(),
list: Some(self.data()),
path: Some(self.text_input()),
name: Some(self.text_input()),
new: Some(self.text_input()),
invalid: Some(Style::new().fg(self.s.red[3]).bg(self.s.gray[2])),
select: Some(self.select()),
focus: Some(self.focus()),
button: Some(self.button_style()),
..Default::default()
}
}
}