diff options
Diffstat (limited to 'src/widgets')
| -rw-r--r-- | src/widgets/helpers.rs | 6 | ||||
| -rw-r--r-- | src/widgets/package_metadata.rs | 66 | ||||
| -rw-r--r-- | src/widgets/use_flags.rs | 25 |
3 files changed, 52 insertions, 45 deletions
diff --git a/src/widgets/helpers.rs b/src/widgets/helpers.rs index 0bde326..1e76b5f 100644 --- a/src/widgets/helpers.rs +++ b/src/widgets/helpers.rs @@ -4,7 +4,7 @@ use ratatui::{ text::{Line, Span}, }; -use crate::gentoo::InstalledPackage; +use crate::gentoo::{InstalledPackage, package::Metadata}; pub fn search_popup_rect(percent_x: u16, r: Rect) -> Rect { // Cut the given rectangle into three vertical pieces @@ -24,14 +24,14 @@ pub fn search_popup_rect(percent_x: u16, r: Rect) -> Rect { .split(popup_layout[1])[1] // Return the middle chunk } -pub fn homepage_lines(pkg: &InstalledPackage, bold_style: Style) -> Vec<Line<'_>> { +pub fn homepage_lines(metadata: &Metadata, bold_style: Style) -> Vec<Line<'_>> { let mut lines = Vec::new(); lines.push(Line::from(vec![ Span::styled("Homepage: ", bold_style), Span::raw(""), ])); - for url in pkg.metadata.homepage.iter().filter(|s| !s.is_empty()) { + for url in metadata.homepage.iter().filter(|s| !s.is_empty()) { lines.push(Line::from(vec![ Span::raw(" - "), // indentation Span::styled( diff --git a/src/widgets/package_metadata.rs b/src/widgets/package_metadata.rs index ee46f62..d6c82cd 100644 --- a/src/widgets/package_metadata.rs +++ b/src/widgets/package_metadata.rs @@ -1,3 +1,4 @@ +use chrono::{DateTime, Utc}; use ratatui::{ Frame, layout::Rect, @@ -6,64 +7,69 @@ use ratatui::{ }; use crate::{ - gentoo::InstalledPackage, + gentoo::{ + InstalledPackage, + package::{Metadata, PackageKey}, + }, theme::Theme, widgets::helpers::{homepage_lines, human_size}, }; -pub fn render_package_metadata(frame: &mut Frame, area: Rect, pkg: Option<&InstalledPackage>) { - let Some(pkg) = pkg else { - return; - }; - +pub fn render_package_metadata( + frame: &mut Frame, + area: Rect, + pkg_version: &String, + metadata: &Metadata, + size: Option<usize>, + build_time: Option<DateTime<Utc>>, +) { let bold_style = Theme::title(); //Style::default().add_modifier(Modifier::BOLD); let maintainer = Line::from_iter([ Span::styled("Maintainer: ", bold_style), - Span::raw(pkg.metadata.maintainer.as_deref().unwrap_or("Unknown")), + Span::raw(metadata.maintainer.as_deref().unwrap_or("Unknown")), ]); let version = Line::from_iter([ Span::styled("Version: ", bold_style), - Span::raw(&pkg.version), + Span::raw(pkg_version), ]); let repository = Line::from_iter([ Span::styled("Repository: ", bold_style), - Span::raw(&pkg.metadata.repository), + Span::raw(&metadata.repository), ]); let license = Line::from_iter([ Span::styled("License: ", bold_style), - Span::raw(pkg.metadata.license.as_deref().unwrap_or("Unknown")), + Span::raw(metadata.license.as_deref().unwrap_or("Unknown")), ]); let description = Line::from_iter([ Span::styled("Description: ", bold_style), - Span::raw(pkg.metadata.description.as_deref().unwrap_or("Unknown")), + Span::raw(metadata.description.as_deref().unwrap_or("Unknown")), ]); - let size = Line::from_iter([ - Span::styled("Size: ", bold_style), - Span::raw(human_size(pkg.size)), - ]); + let mut lines = vec![maintainer, version, repository, license, description]; - let build_time = Line::from_iter([ - Span::styled("Build time: ", bold_style), - Span::raw(pkg.build_time.to_string()), - ]); + let mut homepage = homepage_lines(metadata, bold_style); + lines.append(&mut homepage); - let mut lines = vec![ - maintainer, - version, - repository, - build_time, - license, - description, - size, - ]; + if let Some(size) = size { + let size = Line::from_iter([ + Span::styled("Size: ", bold_style), + Span::raw(human_size(size)), + ]); + lines.push(size); + } - let mut homepage = homepage_lines(pkg, bold_style); - lines.append(&mut homepage); + if let Some(build_time) = build_time { + let build_time = Line::from_iter([ + Span::styled("Build time: ", bold_style), + Span::raw(build_time.to_string()), + ]); + + lines.push(build_time); + } let paragraph = Paragraph::new(lines) .block( diff --git a/src/widgets/use_flags.rs b/src/widgets/use_flags.rs index 5017160..76e314b 100644 --- a/src/widgets/use_flags.rs +++ b/src/widgets/use_flags.rs @@ -1,3 +1,5 @@ +use std::collections::HashSet; + use ratatui::{ Frame, layout::Rect, @@ -6,22 +8,21 @@ use ratatui::{ widgets::{Block, Borders, Paragraph}, }; -use crate::{gentoo::InstalledPackage, theme::Theme}; - -pub fn render_use_flags(frame: &mut Frame, area: Rect, package: Option<&InstalledPackage>) { - let Some(package) = package else { - return; - }; - - let flags: Vec<_> = package.iuse.iter().collect(); +use crate::{gentoo::UseFlag, theme::Theme}; - let max_len = flags.iter().map(|f| f.name.len()).max().unwrap_or(1); +pub fn render_use_flags( + frame: &mut Frame, + area: Rect, + use_flags: Vec<&UseFlag>, + enabled_use_flags: HashSet<String>, +) { + let max_len = use_flags.iter().map(|f| f.name.len()).max().unwrap_or(1); // width per column (+ padding between columns) let col_width = max_len as u16 + 3; let columns = (area.width / col_width).max(1) as usize; - let rows = flags.len().div_ceil(columns); + let rows = use_flags.len().div_ceil(columns); let mut lines = Vec::new(); @@ -31,8 +32,8 @@ pub fn render_use_flags(frame: &mut Frame, area: Rect, package: Option<&Installe 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) { + if let Some(flag) = use_flags.get(idx) { + let mut style = if enabled_use_flags.contains(&flag.name) { Theme::success() } else if flag.default { Theme::info() |
