aboutsummaryrefslogtreecommitdiff
path: root/src/widgets
diff options
context:
space:
mode:
authorpablu <me@pablu.de>2026-06-03 14:10:49 +0200
committerpablu <me@pablu.de>2026-06-03 14:10:49 +0200
commiteaa1b915da8480bf3a86960c94f3667f386aa0f4 (patch)
treeb85e1d2edb0a507ba480926d12fab074d52bb961 /src/widgets
parent81cc9a0b347255629d411323e7ff8fee4d5ec61d (diff)
wip: browser screen implementation
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/helpers.rs6
-rw-r--r--src/widgets/package_metadata.rs66
-rw-r--r--src/widgets/use_flags.rs25
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()