use std::collections::{HashMap, HashSet};
use crate::state::PackageItem;
pub(super) fn compute_display_items_len(
items: &[PackageItem],
dependency_info: &[crate::state::modal::DependencyInfo],
dep_tree_expanded: &HashSet<String>,
) -> usize {
let mut grouped: HashMap<String, Vec<&crate::state::modal::DependencyInfo>> = HashMap::new();
for dep in dependency_info {
for req_by in &dep.required_by {
grouped.entry(req_by.clone()).or_default().push(dep);
}
}
let mut count = 0;
for pkg_name in items.iter().map(|p| &p.name) {
count += 1;
if dep_tree_expanded.contains(pkg_name)
&& let Some(pkg_deps) = grouped.get(pkg_name)
{
let mut seen_deps = HashSet::new();
for dep in pkg_deps {
if seen_deps.insert(dep.name.as_str()) {
count += 1;
}
}
}
}
count
}
pub(super) fn compute_sandbox_display_items_len(
items: &[PackageItem],
sandbox_info: &[crate::logic::sandbox::SandboxInfo],
sandbox_tree_expanded: &HashSet<String>,
) -> usize {
let mut count = 0;
for item in items {
count += 1; if matches!(item.source, crate::state::Source::Aur)
&& sandbox_tree_expanded.contains(&item.name)
&& let Some(info) = sandbox_info.iter().find(|s| s.package_name == item.name)
{
count += info.depends.len();
count += info.makedepends.len();
count += info.checkdepends.len();
count += info.optdepends.len();
}
}
count
}
pub fn compute_file_display_items_len(
items: &[PackageItem],
file_info: &[crate::state::modal::PackageFileInfo],
file_tree_expanded: &HashSet<String>,
) -> usize {
let file_info_map: HashMap<String, &crate::state::modal::PackageFileInfo> = file_info
.iter()
.map(|info| (info.name.clone(), info))
.collect();
let mut count = 0;
for item in items {
count += 1; if file_tree_expanded.contains(&item.name) {
if let Some(pkg_info) = file_info_map.get(&item.name) {
count += pkg_info.files.len();
}
}
}
count
}
pub fn build_file_display_items(
items: &[PackageItem],
file_info: &[crate::state::modal::PackageFileInfo],
file_tree_expanded: &HashSet<String>,
) -> Vec<(bool, String)> {
let file_info_map: HashMap<String, &crate::state::modal::PackageFileInfo> = file_info
.iter()
.map(|info| (info.name.clone(), info))
.collect();
let mut display_items: Vec<(bool, String)> = Vec::new();
for item in items {
let pkg_name = &item.name;
display_items.push((true, pkg_name.clone()));
if file_tree_expanded.contains(pkg_name) {
if let Some(pkg_info) = file_info_map.get(pkg_name) {
display_items.extend(pkg_info.files.iter().map(|_| (false, String::new())));
}
}
}
display_items
}