diff --git a/app/src/help/bindings.rs b/app/src/help/bindings.rs index 2a0f4fa7..b69958e4 100644 --- a/app/src/help/bindings.rs +++ b/app/src/help/bindings.rs @@ -1,8 +1,8 @@ +use core::Ctx; + use config::THEME; use ratatui::{layout::{self, Constraint}, prelude::{Buffer, Direction, Rect}, widgets::{List, ListItem, Widget}}; -use crate::context::Ctx; - pub(super) struct Bindings<'a> { cx: &'a Ctx, } @@ -21,13 +21,13 @@ impl Widget for Bindings<'_> { // Key let col1 = bindings .iter() - .map(|c| ListItem::new(c.on()).style(THEME.help.key.get())) + .map(|c| ListItem::new(c.on()).style(THEME.help.key.into())) .collect::>(); // Execution let col2 = bindings .iter() - .map(|c| ListItem::new(c.exec()).style(THEME.help.exec.get())) + .map(|c| ListItem::new(c.exec()).style(THEME.help.exec.into())) .collect::>(); // Description @@ -35,7 +35,7 @@ impl Widget for Bindings<'_> { .iter() .map(|c| { ListItem::new(if let Some(ref desc) = c.desc { desc } else { "-" }) - .style(THEME.help.desc.get()) + .style(THEME.help.desc.into()) }) .collect::>(); @@ -47,7 +47,7 @@ impl Widget for Bindings<'_> { let cursor = self.cx.help.rel_cursor() as u16; buf.set_style( Rect { x: area.x, y: area.y + cursor, width: area.width, height: 1 }, - THEME.help.curr.get(), + THEME.help.curr.into(), ); List::new(col1).render(chunks[0], buf); diff --git a/app/src/help/layout.rs b/app/src/help/layout.rs index f0f32cfd..dc1d34bd 100644 --- a/app/src/help/layout.rs +++ b/app/src/help/layout.rs @@ -1,8 +1,9 @@ +use core::Ctx; + use config::THEME; use ratatui::{buffer::Buffer, layout::{self, Rect}, prelude::{Constraint, Direction}, widgets::{Clear, Paragraph, Widget}}; use super::Bindings; -use crate::Ctx; pub(crate) struct Layout<'a> { cx: &'a Ctx, @@ -23,7 +24,7 @@ impl<'a> Widget for Layout<'a> { let help = &self.cx.help; Paragraph::new(help.keyword().unwrap_or_else(|| format!("{}.help", help.layer()))) - .style(THEME.help.btm.get()) + .style(THEME.help.btm.into()) .render(chunks[1], buf); Bindings::new(self.cx).render(chunks[0], buf); diff --git a/app/src/input/input.rs b/app/src/input/input.rs index 0946ddaa..8612523b 100644 --- a/app/src/input/input.rs +++ b/app/src/input/input.rs @@ -31,14 +31,14 @@ impl<'a> Widget for Input<'a> { Block::new() .borders(Borders::ALL) .border_type(BorderType::Rounded) - .border_style(THEME.input.border.get()) + .border_style(THEME.input.border.into()) .title({ let mut line = Line::from(input.title()); - line.patch_style(THEME.input.title.get()); + line.patch_style(THEME.input.title.into()); line }), ) - .style(THEME.input.text.get()) + .style(THEME.input.text.into()) .render(area, buf); if let Some(Range { start, end }) = input.selected() { @@ -47,7 +47,7 @@ impl<'a> Widget for Input<'a> { buf.set_style( Rect { x, y, width: (end - start).min(win.width - x), height: 1.min(win.height - y) }, - THEME.input.visual.get(), + THEME.input.visual.into(), ) } diff --git a/app/src/select/select.rs b/app/src/select/select.rs index 5d7a7c91..f0b9a0dc 100644 --- a/app/src/select/select.rs +++ b/app/src/select/select.rs @@ -1,8 +1,8 @@ +use core::Ctx; + use config::THEME; use ratatui::{buffer::Buffer, layout::Rect, widgets::{Block, BorderType, Borders, Clear, List, ListItem, Widget}}; -use crate::Ctx; - pub(crate) struct Select<'a> { cx: &'a Ctx, } @@ -22,10 +22,10 @@ impl<'a> Widget for Select<'a> { .enumerate() .map(|(i, v)| { if i != select.rel_cursor() { - return ListItem::new(format!(" {v}")).style(THEME.opener.inactive.get()); + return ListItem::new(format!(" {v}")).style(THEME.select.inactive.into()); } - ListItem::new(format!(" {v}")).style(THEME.opener.active.get()) + ListItem::new(format!(" {v}")).style(THEME.select.active.into()) }) .collect::>(); @@ -36,7 +36,7 @@ impl<'a> Widget for Select<'a> { .title(select.title()) .borders(Borders::ALL) .border_type(BorderType::Rounded) - .border_style(THEME.opener.border.get()), + .border_style(THEME.select.border.into()), ) .render(area, buf); } diff --git a/app/src/tasks/layout.rs b/app/src/tasks/layout.rs index 7c61c205..09d62c2d 100644 --- a/app/src/tasks/layout.rs +++ b/app/src/tasks/layout.rs @@ -41,7 +41,7 @@ impl<'a> Widget for Layout<'a> { let block = Block::new() .title({ let mut line = Line::from("Tasks".to_string()); - line.patch_style(THEME.tasks.title.get()); + line.patch_style(THEME.tasks.title.into()); line }) .title_alignment(Alignment::Center) @@ -49,7 +49,7 @@ impl<'a> Widget for Layout<'a> { // Maybe also add these border type in to the later theme system .borders(Borders::ALL) .border_type(BorderType::Rounded) - .border_style(THEME.tasks.border.get()); + .border_style(THEME.tasks.border.into()); block.clone().render(area, buf); let tasks = &self.cx.tasks; @@ -60,7 +60,7 @@ impl<'a> Widget for Layout<'a> { .map(|(i, v)| { let mut item = ListItem::new(v.name.clone()); if i == tasks.cursor { - item = item.style(THEME.tasks.items.get()); + item = item.style(THEME.tasks.items.into()); } item }) diff --git a/app/src/which/layout.rs b/app/src/which/layout.rs index ccc79b37..9f4f66f4 100644 --- a/app/src/which/layout.rs +++ b/app/src/which/layout.rs @@ -1,8 +1,9 @@ +use core::Ctx; + use config::THEME; use ratatui::{layout, prelude::{Buffer, Constraint, Direction, Rect}, widgets::{Block, Clear, Widget}}; use super::Side; -use crate::Ctx; pub(crate) struct Which<'a> { cx: &'a Ctx, @@ -41,7 +42,7 @@ impl Widget for Which<'_> { .split(area); Clear.render(area, buf); - Block::new().style(THEME.which.block.get()).render(area, buf); + Block::new().style(THEME.which.block.into()).render(area, buf); Side::new(which.times, cands.0).render(chunks[0], buf); Side::new(which.times, cands.1).render(chunks[1], buf); Side::new(which.times, cands.2).render(chunks[2], buf); diff --git a/app/src/which/side.rs b/app/src/which/side.rs index 404c68b4..4b11eed5 100644 --- a/app/src/which/side.rs +++ b/app/src/which/side.rs @@ -21,19 +21,19 @@ impl Widget for Side<'_> { // Keys let keys = c.on[self.times..].iter().map(ToString::to_string).collect::>(); spans.push(Span::raw(" ".repeat(10usize.saturating_sub(keys.join("").len())))); - spans.push(Span::styled(keys[0].clone(), THEME.which.key.get())); + spans.push(Span::styled(keys[0].clone(), THEME.which.key.into())); spans.extend( - keys.iter().skip(1).map(|k| Span::styled(k.to_string(), THEME.which.extend.get())), + keys.iter().skip(1).map(|k| Span::styled(k.to_string(), THEME.which.extend.into())), ); // Separator spans.push(Span::styled( THEME.which.separator.separator.to_string(), - Style::new().fg(*THEME.which.separator.color), + Style::new().fg(THEME.which.separator.color.into()), )); // Exec, - spans.push(Span::styled(c.desc_or_exec(), THEME.which.desc.get())); + spans.push(Span::styled(c.desc_or_exec(), THEME.which.desc.into())); ListItem::new(Line::from(spans)) }) diff --git a/config/src/theme/help.rs b/config/src/theme/help.rs new file mode 100644 index 00000000..199297ce --- /dev/null +++ b/config/src/theme/help.rs @@ -0,0 +1,12 @@ +use serde::{Deserialize, Serialize}; + +use super::Style; + +#[derive(Deserialize, Serialize)] +pub struct Help { + pub key: Style, + pub exec: Style, + pub desc: Style, + pub curr: Style, + pub btm: Style, +} diff --git a/config/src/theme/input.rs b/config/src/theme/input.rs new file mode 100644 index 00000000..e252e2fe --- /dev/null +++ b/config/src/theme/input.rs @@ -0,0 +1,11 @@ +use serde::{Deserialize, Serialize}; + +use super::Style; + +#[derive(Deserialize, Serialize)] +pub struct Input { + pub border: Style, + pub title: Style, + pub value: Style, + pub selected: Style, +} diff --git a/config/src/theme/manager.rs b/config/src/theme/manager.rs new file mode 100644 index 00000000..51d2b2af --- /dev/null +++ b/config/src/theme/manager.rs @@ -0,0 +1,33 @@ +use std::path::PathBuf; + +use serde::{Deserialize, Serialize}; +use validator::Validate; + +use super::Style; + +#[derive(Deserialize, Serialize, Validate)] +pub struct Tabs { + pub active: Style, + pub inactive: Style, + pub header: Style, + #[validate(range(min = 1, message = "Must be greater than 0"))] + pub max_width: u8, +} + +#[derive(Deserialize, Serialize)] +pub struct Files { + pub hovered: Style, +} + +#[derive(Deserialize, Serialize)] +pub struct Marker { + pub selected: Style, + pub copied: Style, + pub cut: Style, +} + +#[derive(Deserialize, Serialize)] +pub struct Preview { + pub hovered: Style, + pub syntect_theme: PathBuf, +} diff --git a/config/src/theme/select.rs b/config/src/theme/select.rs new file mode 100644 index 00000000..856f239e --- /dev/null +++ b/config/src/theme/select.rs @@ -0,0 +1,10 @@ +use serde::{Deserialize, Serialize}; + +use super::Style; + +#[derive(Deserialize, Serialize)] +pub struct Select { + pub border: Style, + pub active: Style, + pub inactive: Style, +} diff --git a/config/src/theme/tasks.rs b/config/src/theme/tasks.rs new file mode 100644 index 00000000..96198e79 --- /dev/null +++ b/config/src/theme/tasks.rs @@ -0,0 +1,10 @@ +use serde::{Deserialize, Serialize}; + +use super::Style; + +#[derive(Deserialize, Serialize)] +pub struct Tasks { + pub border: Style, + pub title: Style, + pub hovered: Style, +} diff --git a/config/src/theme/which.rs b/config/src/theme/which.rs new file mode 100644 index 00000000..fc274fb3 --- /dev/null +++ b/config/src/theme/which.rs @@ -0,0 +1,25 @@ +use serde::{Deserialize, Serialize}; + +use super::{Color, Style}; + +#[derive(Deserialize, Serialize)] +pub struct Which { + pub block: Style, + pub key: Style, + pub separator: WhichSeparator, + pub extend: Style, + pub desc: Style, +} + +#[derive(Deserialize, Serialize)] +pub struct WhichItem { + pub key: Color, + pub extend: Color, + pub description: Color, +} + +#[derive(Deserialize, Serialize)] +pub struct WhichSeparator { + pub separator: String, + pub color: Color, +}