use egui::Color32;
use egui::FontId;
use egui::Painter;
pub(crate) fn find_name_candidate(name: &str, width: f32, painter: &Painter, font_id: &FontId) -> String {
let galley = painter.layout_no_wrap(name.to_owned(), font_id.clone(), Color32::BLACK);
if galley.size().x <= width || name.is_empty() {
return name.to_owned();
}
let chars: Vec<char> = name.chars().collect();
let mut min_candidate = chars[0].to_string();
min_candidate.push_str("...");
let galley = painter.layout_no_wrap(min_candidate.clone(), font_id.clone(), Color32::BLACK);
if galley.size().x > width {
return String::new();
}
let mut low = 1;
let mut high = chars.len();
let mut best = String::new();
while low <= high {
let mid = usize::midpoint(low, high);
let mut candidate: String = chars[..mid].iter().collect();
candidate.push_str("...");
let candidate_width = painter
.layout_no_wrap(candidate.clone(), font_id.clone(), Color32::BLACK)
.size()
.x;
if candidate_width <= width {
best = candidate;
low = mid + 1;
} else {
high = mid.saturating_sub(1);
if high == 0 {
break;
}
}
}
best
}
#[cfg(test)]
pub(crate) fn init_test_logger() {
use std::io::Write as _;
let _result: Result<(), log::SetLoggerError> = env_logger::builder()
.is_test(true)
.format(|buf, record| {
let level_style = buf.default_level_style(record.level());
writeln!(
buf,
"[{level_style}{}{level_style:#} {}:{}] {}",
record.level(),
record.file().unwrap_or("unknown"),
record.line().unwrap_or(0),
record.args()
)
})
.try_init();
}