use ratatui::{prelude::Rect, text::Span};
use crate::state::AppState;
use super::{FilterStates, MenuStates, OptionalRepos, RenderContext};
mod i18n;
mod layout;
mod rects;
mod rendering;
mod top_bar_menu;
mod types;
mod width;
use i18n::build_title_i18n_strings;
use layout::calculate_title_layout_info;
use rects::record_title_rects;
use rendering::{
render_artix_filter, render_artix_specific_filters, render_blackarch_filter,
render_core_filters, render_custom_repos_dynamic_chip, render_manjaro_filter,
render_optional_eos_cachyos_filters, render_sort_button, render_title_prefix,
};
pub use top_bar_menu::{
clear_top_bar_menu_rects, render_top_bar_menu_cluster, top_bar_menu_cluster_width,
};
pub(super) fn custom_repos_chip_label(
app: &AppState,
filter_custom_repos_label: &str,
) -> Option<String> {
if app.results_filter_dynamic.is_empty() {
return None;
}
Some(format!("[{filter_custom_repos_label}] v"))
}
pub fn build_title_spans_from_context(
app: &AppState,
ctx: &RenderContext,
area: Rect,
) -> Vec<Span<'static>> {
let inner_width = area.width.saturating_sub(2); build_title_spans_from_values(
app,
ctx.results_len,
inner_width,
&ctx.optional_repos,
&ctx.menu_states,
&ctx.filter_states,
)
}
fn build_title_spans_from_values(
app: &AppState,
results_len: usize,
inner_width: u16,
optional_repos: &OptionalRepos,
menu_states: &MenuStates,
filter_states: &FilterStates,
) -> Vec<Span<'static>> {
let i18n = build_title_i18n_strings(app);
let layout_info = calculate_title_layout_info(
&i18n,
results_len,
inner_width,
optional_repos,
custom_repos_chip_label(app, &i18n.filter_custom_repos),
false,
);
let mut title_spans = render_title_prefix(&i18n, results_len);
title_spans.push(Span::raw(" "));
title_spans.extend(render_sort_button(&i18n, menu_states.sort_menu_open));
title_spans.push(Span::raw(" "));
title_spans.extend(render_core_filters(&i18n, filter_states));
title_spans.extend(render_optional_eos_cachyos_filters(
&i18n,
optional_repos,
filter_states,
));
title_spans.extend(render_artix_filter(
&i18n,
optional_repos,
filter_states,
layout_info.show_artix_specific_repos,
));
if layout_info.show_artix_specific_repos {
title_spans.extend(render_artix_specific_filters(
&i18n,
optional_repos,
filter_states,
));
}
title_spans.extend(render_blackarch_filter(
&i18n,
optional_repos,
filter_states,
));
title_spans.extend(render_manjaro_filter(&i18n, optional_repos, filter_states));
title_spans.extend(render_custom_repos_dynamic_chip(
app,
layout_info.custom_repos_chip_label.as_deref(),
));
title_spans
}
pub fn record_title_rects_from_context(app: &mut AppState, ctx: &RenderContext, area: Rect) {
record_title_rects(app, area, &ctx.optional_repos);
}