diff --git a/yazi-config/preset/theme-dark.toml b/yazi-config/preset/theme-dark.toml index 56f46344..6533e6e8 100644 --- a/yazi-config/preset/theme-dark.toml +++ b/yazi-config/preset/theme-dark.toml @@ -20,6 +20,9 @@ light = "" [app] overall = {} +parent = {} +current = {} +preview = {} # : }}} diff --git a/yazi-config/preset/theme-light.toml b/yazi-config/preset/theme-light.toml index d6aef72b..a823d0c2 100644 --- a/yazi-config/preset/theme-light.toml +++ b/yazi-config/preset/theme-light.toml @@ -20,6 +20,9 @@ light = "" [app] overall = {} +parent = {} +current = {} +preview = {} # : }}} diff --git a/yazi-config/src/theme/theme.rs b/yazi-config/src/theme/theme.rs index 57eb2a46..dac2cb76 100644 --- a/yazi-config/src/theme/theme.rs +++ b/yazi-config/src/theme/theme.rs @@ -10,33 +10,39 @@ use crate::{Style, normalize_path}; #[derive(Deserialize, DeserializeOver1)] pub struct Theme { - pub flavor: Flavor, - pub app: App, - pub mgr: Mgr, - pub tabs: Tabs, - pub mode: Mode, + pub flavor: Flavor, + pub app: App, + pub mgr: Mgr, + pub tabs: Tabs, + pub mode: Mode, pub indicator: Indicator, - pub status: Status, - pub which: Which, - pub confirm: Confirm, - pub spot: Spot, - pub notify: Notify, - pub pick: Pick, - pub input: Input, - pub cmp: Cmp, - pub tasks: Tasks, - pub help: Help, + pub status: Status, + pub which: Which, + pub confirm: Confirm, + pub spot: Spot, + pub notify: Notify, + pub pick: Pick, + pub input: Input, + pub cmp: Cmp, + pub tasks: Tasks, + pub help: Help, // File-specific styles #[serde(skip_serializing)] pub filetype: Filetype, #[serde(skip_serializing)] - pub icon: Icon, + pub icon: Icon, } #[derive(Deserialize, DeserializeOver2)] pub struct App { pub overall: Style, + #[serde(default)] + pub parent: Style, + #[serde(default)] + pub current: Style, + #[serde(default)] + pub preview: Style, } #[derive(Deserialize, DeserializeOver2)] @@ -44,26 +50,26 @@ pub struct Mgr { pub cwd: Style, // Find - pub find_keyword: Style, + pub find_keyword: Style, pub find_position: Style, // Symlink pub symlink_target: Style, // Marker - pub marker_copied: Style, - pub marker_cut: Style, - pub marker_marked: Style, + pub marker_copied: Style, + pub marker_cut: Style, + pub marker_marked: Style, pub marker_selected: Style, // Count - pub count_copied: Style, - pub count_cut: Style, + pub count_copied: Style, + pub count_cut: Style, pub count_selected: Style, // Border pub border_symbol: String, - pub border_style: Style, + pub border_style: Style, // Highlighting pub syntect_theme: PathBuf, @@ -71,7 +77,7 @@ pub struct Mgr { #[derive(Deserialize, DeserializeOver2)] pub struct Tabs { - pub active: Style, + pub active: Style, pub inactive: Style, pub sep_inner: TabsSep, @@ -80,25 +86,25 @@ pub struct Tabs { #[derive(Deserialize, DeserializeOver2)] pub struct TabsSep { - pub open: String, + pub open: String, pub close: String, } #[derive(Deserialize, DeserializeOver2)] pub struct Mode { pub normal_main: Style, - pub normal_alt: Style, + pub normal_alt: Style, pub select_main: Style, - pub select_alt: Style, + pub select_alt: Style, pub unset_main: Style, - pub unset_alt: Style, + pub unset_alt: Style, } #[derive(Deserialize, DeserializeOver2)] pub struct Indicator { - pub parent: Style, + pub parent: Style, pub current: Style, pub preview: Style, pub padding: IndicatorPadding, @@ -106,32 +112,32 @@ pub struct Indicator { #[derive(Deserialize, DeserializeOver2)] pub struct IndicatorPadding { - pub open: String, + pub open: String, pub close: String, } #[derive(Deserialize, DeserializeOver2)] pub struct Status { - pub overall: Style, - pub sep_left: StatusSep, + pub overall: Style, + pub sep_left: StatusSep, pub sep_right: StatusSep, // Permissions - pub perm_sep: Style, - pub perm_type: Style, - pub perm_read: Style, + pub perm_sep: Style, + pub perm_type: Style, + pub perm_read: Style, pub perm_write: Style, - pub perm_exec: Style, + pub perm_exec: Style, // Progress - pub progress_label: Style, + pub progress_label: Style, pub progress_normal: Style, - pub progress_error: Style, + pub progress_error: Style, } #[derive(Deserialize, DeserializeOver2)] pub struct StatusSep { - pub open: String, + pub open: String, pub close: String, } @@ -143,83 +149,83 @@ pub struct Which { pub rest: Style, pub desc: Style, - pub separator: String, + pub separator: String, pub separator_style: Style, } #[derive(Deserialize, DeserializeOver2)] pub struct Confirm { pub border: Style, - pub title: Style, - pub body: Style, - pub list: Style, + pub title: Style, + pub body: Style, + pub list: Style, - pub btn_yes: Style, - pub btn_no: Style, + pub btn_yes: Style, + pub btn_no: Style, pub btn_labels: [String; 2], } #[derive(Deserialize, DeserializeOver2)] pub struct Spot { pub border: Style, - pub title: Style, + pub title: Style, - pub tbl_col: Style, + pub tbl_col: Style, pub tbl_cell: Style, } #[derive(Deserialize, DeserializeOver2)] pub struct Notify { - pub title_info: Style, - pub title_warn: Style, + pub title_info: Style, + pub title_warn: Style, pub title_error: Style, - pub icon_info: String, - pub icon_warn: String, + pub icon_info: String, + pub icon_warn: String, pub icon_error: String, } #[derive(Deserialize, DeserializeOver2)] pub struct Pick { - pub border: Style, - pub active: Style, + pub border: Style, + pub active: Style, pub inactive: Style, } #[derive(Deserialize, DeserializeOver2)] pub struct Input { - pub border: Style, - pub title: Style, - pub value: Style, + pub border: Style, + pub title: Style, + pub value: Style, pub selected: Style, } #[derive(Deserialize, DeserializeOver2)] pub struct Cmp { - pub border: Style, - pub active: Style, + pub border: Style, + pub active: Style, pub inactive: Style, - pub icon_file: String, - pub icon_folder: String, + pub icon_file: String, + pub icon_folder: String, pub icon_command: String, } #[derive(Deserialize, DeserializeOver2)] pub struct Tasks { - pub border: Style, - pub title: Style, + pub border: Style, + pub title: Style, pub hovered: Style, } #[derive(Deserialize, DeserializeOver2)] pub struct Help { - pub on: Style, - pub run: Style, + pub on: Style, + pub run: Style, pub desc: Style, pub hovered: Style, - pub footer: Style, + pub footer: Style, } impl Theme { @@ -247,5 +253,19 @@ impl Theme { } impl App { - pub fn bg_color(&self) -> String { self.overall.bg.map(|c| c.to_string()).unwrap_or_default() } + pub fn bg_color(&self) -> String { + self.overall.bg.map(|c| c.to_string()).unwrap_or_default() + } + + pub fn parent_bg(&self) -> String { + self.parent.bg.map(|c| c.to_string()).unwrap_or_default() + } + + pub fn current_bg(&self) -> String { + self.current.bg.map(|c| c.to_string()).unwrap_or_default() + } + + pub fn preview_bg(&self) -> String { + self.preview.bg.map(|c| c.to_string()).unwrap_or_default() + } } diff --git a/yazi-fm/src/bg_render.rs b/yazi-fm/src/bg_render.rs index 054ed959..e130de66 100644 --- a/yazi-fm/src/bg_render.rs +++ b/yazi-fm/src/bg_render.rs @@ -1,5 +1,37 @@ use ratatui::{buffer::Buffer, layout::Rect, style::Color}; +/// Apply background color to a pane, skipping borders on all sides +#[inline] +pub fn apply_pane_bg_with_borders(buf: &mut Buffer, pane: Rect, bg_color: Color) { + let start_y = pane.top() + 1; + let end_y = if pane.bottom() > 0 { pane.bottom() - 1 } else { pane.bottom() }; + let start_x = pane.left() + 1; + let end_x = if pane.right() > 0 { pane.right() - 1 } else { pane.right() }; + + if start_y < end_y && start_x < end_x { + for y in start_y..end_y { + for x in start_x..end_x { + buf[(x, y)].set_bg(bg_color); + } + } + } +} + +/// Apply background color to a pane, skipping only top/bottom borders +#[inline] +pub fn apply_pane_bg_no_vertical_borders(buf: &mut Buffer, pane: Rect, bg_color: Color) { + let start_y = pane.top() + 1; + let end_y = if pane.bottom() > 0 { pane.bottom() - 1 } else { pane.bottom() }; + + if start_y < end_y { + for y in start_y..end_y { + for x in pane.left()..pane.right() { + buf[(x, y)].set_bg(bg_color); + } + } + } +} + /// Apply background color to entire area, excluding header and status bar #[inline] pub fn apply_overall_bg(buf: &mut Buffer, area: Rect, bg_color: Color) { diff --git a/yazi-fm/src/root.rs b/yazi-fm/src/root.rs index 31df492e..d2113cef 100644 --- a/yazi-fm/src/root.rs +++ b/yazi-fm/src/root.rs @@ -1,8 +1,12 @@ use mlua::{ObjectLike, Table}; -use ratatui::{buffer::Buffer, layout::Rect, widgets::Widget}; +use ratatui::{ + buffer::Buffer, + layout::{Constraint, Direction, Layout, Rect}, + widgets::Widget, +}; use tracing::error; use yazi_binding::elements::render_once; -use yazi_config::THEME; +use yazi_config::{THEME, YAZI}; use yazi_core::Core; use yazi_plugin::LUA; @@ -13,7 +17,9 @@ pub(super) struct Root<'a> { } impl<'a> Root<'a> { - pub(super) fn new(core: &'a Core) -> Self { Self { core } } + pub(super) fn new(core: &'a Core) -> Self { + Self { core } + } pub(super) fn reflow(area: Rect) -> mlua::Result