#[allow(clippy::wildcard_imports)]
use super::*;
pub(in crate::app) fn filter_band_height(app: &App) -> u16 {
let filter = if app.filter.is_some() || app.structured.has_active_criteria() {
FILTER_HEIGHT
} else {
0
};
filter + u16::from(app.view_indicator().is_some())
}
pub(in crate::app) fn render_view_row(app: &App, f: &mut ratatui::Frame, area: Rect) {
let Some(indicator) = app.view_indicator() else {
return;
};
let style = if app
.view_divergence()
.is_some_and(|report| !report.in_sync())
{
Style::default().fg(Color::Yellow)
} else {
Style::default().fg(Color::Green)
};
let para = Paragraph::new(Line::from(Span::styled(indicator, style)));
f.render_widget(para, area);
}
pub(in crate::app) fn render_hover_line(app: &App, f: &mut ratatui::Frame, area: Rect) {
let tab_h: u16 = if app.tabs.needs_bar() { TAB_HEIGHT } else { 0 };
let hover_area = Rect {
y: area.y + tab_h,
height: HOVER_HEIGHT,
..area
};
let line = match app.board.get_selected_card() {
Some(card) => Line::from(vec![
Span::styled(
format!("#{}", card.number),
Style::default().fg(Color::Cyan),
),
Span::raw(" "),
Span::styled(card.title.clone(), Style::default()),
]),
None => Line::from(Span::styled("—", Style::default().fg(Color::DarkGray))),
};
f.render_widget(Paragraph::new(line), hover_area);
}
pub(in crate::app) fn render_config_or_board(app: &App, f: &mut ratatui::Frame, area: Rect) {
if app.settings.is_some() {
let (cycles, milestones) = app.planning_rows();
let viewer = app.viewer_label();
crate::ui::settings::render_config(
app,
f,
area,
crate::ui::settings::DashboardView {
name: app.active_board_name(),
board: app.active_board_config(),
editor: app.store.config.editor.as_deref(),
viewer: &viewer,
},
&cycles,
&milestones,
);
} else {
render_board(app, f, area, commandbar::MODE_BOARD);
}
}
pub(in crate::app) fn open_in_browser(url: &str) -> std::io::Result<()> {
let mut last = None;
for opener in ["xdg-open", "open"] {
match std::process::Command::new(opener)
.arg(url)
.stdin(std::process::Stdio::null())
.stdout(std::process::Stdio::null())
.stderr(std::process::Stdio::null())
.spawn()
{
Ok(_child) => return Ok(()),
Err(e) => last = Some(e),
}
}
Err(last.unwrap_or_else(|| {
std::io::Error::new(std::io::ErrorKind::NotFound, "no browser launcher found")
}))
}