refactor(tui): child widget can provide constraint to container
All checks were successful
Rust / build (push) Successful in 7m13s
ci/woodpecker/push/cron-docker-builder Pipeline was successful
ci/woodpecker/push/push-next Pipeline was successful
ci/woodpecker/push/tag-created Pipeline was successful
Release Please / Release-plz (push) Successful in 1m16s
All checks were successful
Rust / build (push) Successful in 7m13s
ci/woodpecker/push/cron-docker-builder Pipeline was successful
ci/woodpecker/push/push-next Pipeline was successful
ci/woodpecker/push/tag-created Pipeline was successful
Release Please / Release-plz (push) Successful in 1m16s
This commit is contained in:
parent
4517fe62e4
commit
f85cbce4c6
3 changed files with 49 additions and 34 deletions
|
@ -1,13 +1,21 @@
|
||||||
use git_next_core::git::graph::Log;
|
use git_next_core::git::graph::Log;
|
||||||
//
|
//
|
||||||
use ratatui::{
|
use ratatui::{
|
||||||
|
prelude::Constraint,
|
||||||
text::{Line, Text},
|
text::{Line, Text},
|
||||||
widgets::{Paragraph, Widget},
|
widgets::{Paragraph, Widget},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use super::HeightConstraint;
|
||||||
|
|
||||||
pub struct CommitLog<'a> {
|
pub struct CommitLog<'a> {
|
||||||
pub log: &'a Log,
|
pub log: &'a Log,
|
||||||
}
|
}
|
||||||
|
impl<'a> HeightConstraint for CommitLog<'a> {
|
||||||
|
fn height_constraint(&self) -> Constraint {
|
||||||
|
Constraint::Length(u16::try_from(self.log.len()).unwrap_or(u16::MAX))
|
||||||
|
}
|
||||||
|
}
|
||||||
impl<'a> Widget for CommitLog<'a> {
|
impl<'a> Widget for CommitLog<'a> {
|
||||||
fn render(self, area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer)
|
fn render(self, area: ratatui::prelude::Rect, buf: &mut ratatui::prelude::Buffer)
|
||||||
where
|
where
|
||||||
|
|
|
@ -6,3 +6,11 @@ mod repo;
|
||||||
|
|
||||||
pub use configured_app::ConfiguredAppWidget;
|
pub use configured_app::ConfiguredAppWidget;
|
||||||
pub use history::CommitLog;
|
pub use history::CommitLog;
|
||||||
|
use ratatui::layout::Constraint;
|
||||||
|
|
||||||
|
pub trait HeightConstraint {
|
||||||
|
fn height_constraint(&self) -> Constraint;
|
||||||
|
}
|
||||||
|
// pub trait WidthConstraints {
|
||||||
|
// fn width_constraint(&self) -> Constraint;
|
||||||
|
// }
|
||||||
|
|
|
@ -14,34 +14,30 @@ use identity::Identity;
|
||||||
|
|
||||||
use ratatui::{
|
use ratatui::{
|
||||||
buffer::Buffer,
|
buffer::Buffer,
|
||||||
layout::{Constraint, Direction, Layout, Rect},
|
layout::{Constraint, Rect},
|
||||||
widgets::{Block, Borders, Widget},
|
widgets::{Block, Borders, Widget},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use super::HeightConstraint;
|
||||||
|
|
||||||
pub struct RepoWidget<'a> {
|
pub struct RepoWidget<'a> {
|
||||||
pub repo_state: &'a RepoState,
|
pub repo_state: &'a RepoState,
|
||||||
}
|
}
|
||||||
impl<'a> Widget for RepoWidget<'a> {
|
impl<'a> RepoWidget<'a> {
|
||||||
fn render(self, area: Rect, buf: &mut Buffer)
|
fn inner(&self) -> InnerRepoWidget {
|
||||||
where
|
|
||||||
Self: Sized,
|
|
||||||
{
|
|
||||||
match self.repo_state {
|
match self.repo_state {
|
||||||
RepoState::Identified {
|
RepoState::Identified {
|
||||||
repo_alias,
|
repo_alias,
|
||||||
message,
|
message,
|
||||||
alert,
|
alert,
|
||||||
} => {
|
} => InnerRepoWidget {
|
||||||
InnerRepoWidget {
|
|
||||||
label: "identified",
|
label: "identified",
|
||||||
repo_alias,
|
repo_alias,
|
||||||
message,
|
message,
|
||||||
alert: alert.as_ref().map(String::as_str),
|
alert: alert.as_ref().map(String::as_str),
|
||||||
branches: None,
|
branches: None,
|
||||||
log: None,
|
log: None,
|
||||||
}
|
},
|
||||||
.render(area, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
RepoState::Configured {
|
RepoState::Configured {
|
||||||
repo_alias,
|
repo_alias,
|
||||||
|
@ -56,8 +52,7 @@ impl<'a> Widget for RepoWidget<'a> {
|
||||||
alert: alert.as_ref().map(String::as_str),
|
alert: alert.as_ref().map(String::as_str),
|
||||||
branches: Some(branches),
|
branches: Some(branches),
|
||||||
log: Some(log),
|
log: Some(log),
|
||||||
}
|
},
|
||||||
.render(area, buf),
|
|
||||||
|
|
||||||
RepoState::Ready {
|
RepoState::Ready {
|
||||||
repo_alias,
|
repo_alias,
|
||||||
|
@ -81,12 +76,18 @@ impl<'a> Widget for RepoWidget<'a> {
|
||||||
// main,
|
// main,
|
||||||
// next,
|
// next,
|
||||||
// dev,
|
// dev,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
.render(area, buf),
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
impl<'a> Widget for RepoWidget<'a> {
|
||||||
|
fn render(self, area: Rect, buf: &mut Buffer)
|
||||||
|
where
|
||||||
|
Self: Sized,
|
||||||
|
{
|
||||||
|
self.inner().render(area, buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct InnerRepoWidget<'a> {
|
struct InnerRepoWidget<'a> {
|
||||||
pub label: &'a str,
|
pub label: &'a str,
|
||||||
|
@ -100,6 +101,13 @@ struct InnerRepoWidget<'a> {
|
||||||
// pub next: &'a Commit,
|
// pub next: &'a Commit,
|
||||||
// pub dev: &'a Commit,
|
// pub dev: &'a Commit,
|
||||||
}
|
}
|
||||||
|
impl<'a> HeightConstraint for InnerRepoWidget<'a> {
|
||||||
|
fn height_constraint(&self) -> ratatui::prelude::Constraint {
|
||||||
|
self.log
|
||||||
|
.map(|log| CommitLog { log })
|
||||||
|
.map_or(Constraint::Length(0), |w| w.height_constraint())
|
||||||
|
}
|
||||||
|
}
|
||||||
impl<'a> Widget for InnerRepoWidget<'a> {
|
impl<'a> Widget for InnerRepoWidget<'a> {
|
||||||
fn render(self, area: Rect, buf: &mut Buffer)
|
fn render(self, area: Rect, buf: &mut Buffer)
|
||||||
where
|
where
|
||||||
|
@ -114,18 +122,9 @@ impl<'a> Widget for InnerRepoWidget<'a> {
|
||||||
self.branches,
|
self.branches,
|
||||||
))
|
))
|
||||||
.borders(Borders::ALL);
|
.borders(Borders::ALL);
|
||||||
let log_len: u16 = self.log.map_or_else(
|
|
||||||
|| 0,
|
|
||||||
|log| u16::try_from(log.len()).map_or(u16::MAX, |len| len),
|
|
||||||
);
|
|
||||||
let layout_repo = Layout::default()
|
|
||||||
.direction(Direction::Vertical)
|
|
||||||
.constraints(vec![Constraint::Length(log_len)])
|
|
||||||
.split(block.inner(area));
|
|
||||||
block.render(area, buf);
|
|
||||||
|
|
||||||
if let Some(log) = self.log {
|
if let Some(log) = self.log {
|
||||||
CommitLog { log }.render(layout_repo[0], buf);
|
(CommitLog { log }).render(block.inner(area), buf);
|
||||||
}
|
}
|
||||||
|
block.render(area, buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue