From c0bf888247050114f7dc845b419af56fb6416902 Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Thu, 10 Aug 2023 17:32:42 +0800 Subject: [PATCH] refactor: rework width calculation --- Cargo.lock | 1 + app/Cargo.toml | 1 + app/src/header/tabs.rs | 24 +++++++++++++++++++++--- config/preset/theme.toml | 2 +- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e99e9f20..4ca59c32 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -134,6 +134,7 @@ dependencies = [ "tracing", "tracing-appender", "tracing-subscriber", + "unicode-width", ] [[package]] diff --git a/app/Cargo.toml b/app/Cargo.toml index 239afaed..099f2ce1 100644 --- a/app/Cargo.toml +++ b/app/Cargo.toml @@ -18,6 +18,7 @@ libc = "^0" ratatui = "^0" signal-hook-tokio = { version = "^0", features = [ "futures-v0_3" ] } tokio = { version = "^1", features = [ "parking_lot" ] } +unicode-width = "^0" # Logging tracing = "^0" diff --git a/app/src/header/tabs.rs b/app/src/header/tabs.rs index 58cfa94f..497708fd 100644 --- a/app/src/header/tabs.rs +++ b/app/src/header/tabs.rs @@ -1,5 +1,8 @@ +use std::ops::ControlFlow; + use config::THEME; use ratatui::{buffer::Buffer, layout::{Alignment, Rect}, text::{Line, Span}, widgets::{Paragraph, Widget}}; +use unicode_width::UnicodeWidthStr; use crate::Ctx; @@ -21,9 +24,24 @@ impl<'a> Widget for Tabs<'a> { .enumerate() .map(|(i, tab)| { let mut text = format!(" {} ", i + 1); - if THEME.tab.max_width > 0 { - text - .push_str(&tab.current_name().chars().take(THEME.tab.max_width).collect::()); + if let Some(dir_name) = tab.current_name() { + text.push_str(dir_name); + } + + let threshold = THEME.tab.max_width.max(3) - 1; + let truncated = text.chars().try_fold(String::with_capacity(threshold), |mut text, c| { + if text.width() > threshold { + ControlFlow::Break(text) + } else { + text.push(c); + ControlFlow::Continue(text) + } + }); + let mut text = match truncated { + ControlFlow::Break(text) => text, + ControlFlow::Continue(text) => text, + }; + if !text.ends_with(' ') { text.push(' '); } diff --git a/config/preset/theme.toml b/config/preset/theme.toml index 3dde6bd6..b04f8ff8 100644 --- a/config/preset/theme.toml +++ b/config/preset/theme.toml @@ -1,7 +1,7 @@ [tab] active = { fg = "#1E2031", bg = "#80AEFA" } inactive = { fg = "#C8D3F8", bg = "#484D66" } -max_width = 0 +max_width = 3 [status] primary = { normal = "#80AEFA", select = "#CD9EFC", unset = "#FFA577" }