aboutsummaryrefslogtreecommitdiff
path: root/src/widgets
diff options
context:
space:
mode:
authorpablu <me@pablu.de>2026-06-03 00:59:42 +0200
committerpablu <me@pablu.de>2026-06-03 00:59:42 +0200
commitbb7178262d721d61062b151df17bc2ba9f327366 (patch)
tree25a6fbf900019f538dee372e5893a30ac7c72bae /src/widgets
parent9a0d2b1c0e7b31ace9f3477622ef907f8d11ad7c (diff)
increment version in cargo.toml to v0.2.0, add filtering of worldset to installed_packages view, make use flags actually readable for packages with alot of useflags
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/use_flags.rs76
1 files changed, 47 insertions, 29 deletions
diff --git a/src/widgets/use_flags.rs b/src/widgets/use_flags.rs
index 711a45a..59e5781 100644
--- a/src/widgets/use_flags.rs
+++ b/src/widgets/use_flags.rs
@@ -2,7 +2,8 @@ use ratatui::{
Frame,
layout::Rect,
style::{Color, Modifier},
- widgets::{Block, Borders, List, ListItem, ListState},
+ text::{Line, Span},
+ widgets::{Block, Borders, List, ListItem, ListState, Paragraph},
};
use crate::{gentoo::InstalledPackage, theme::Theme};
@@ -12,36 +13,53 @@ pub fn render_use_flags(frame: &mut Frame, area: Rect, package: Option<&Installe
return;
};
- let items = package.iuse.iter().map(|x| {
- let text_style = if package.enabled_use_flags.contains(&x.name) {
- Theme::success()
- } else if x.default {
- Theme::info()
- } else {
- Theme::error()
- };
+ let flags: Vec<_> = package.iuse.iter().collect();
- let text_style = if x.default {
- text_style.add_modifier(Modifier::ITALIC)
- } else {
- text_style
- };
+ let max_len = flags.iter().map(|f| f.name.len()).max().unwrap_or(1);
- ListItem::new(x.name.clone()).style(text_style)
- });
- let list = List::new(items)
- .style(Color::White)
- .scroll_padding(1)
- .direction(ratatui::widgets::ListDirection::TopToBottom)
- .block(
- Block::default()
- .borders(Borders::ALL)
- .title("USE Flags")
- .border_style(Theme::block()),
- );
+ // width per column (+ padding between columns)
+ let col_width = max_len as u16 + 3;
- let mut list_state = ListState::default();
- list_state.select_first();
+ let columns = (area.width / col_width).max(1) as usize;
+ let rows = flags.len().div_ceil(columns);
- frame.render_stateful_widget(list, area, &mut list_state);
+ let mut lines = Vec::new();
+
+ for row in 0..rows {
+ let mut spans = Vec::new();
+
+ for col in 0..columns {
+ let idx = row * columns + col;
+
+ if let Some(flag) = flags.get(idx) {
+ let mut style = if package.enabled_use_flags.contains(&flag.name) {
+ Theme::success()
+ } else if flag.default {
+ Theme::info()
+ } else {
+ Theme::error()
+ };
+
+ if flag.default {
+ style = style.add_modifier(Modifier::ITALIC);
+ }
+
+ spans.push(Span::styled(
+ format!("{:<width$}", flag.name, width = max_len + 2),
+ style,
+ ));
+ }
+ }
+
+ lines.push(Line::from(spans));
+ }
+
+ let paragraph = Paragraph::new(lines).block(
+ Block::default()
+ .borders(Borders::ALL)
+ .title("USE Flags")
+ .border_style(Theme::block()),
+ );
+
+ frame.render_widget(paragraph, area);
}