use super::{Marked, PickerState};
use crate::model_pick::WORKER_ROLE;
pub(super) fn select_role(
ui: &mut egui::Ui,
picker: &mut PickerState,
marked: &[Marked],
) -> String {
let fallback = marked
.iter()
.find(|(r, _)| r.role == WORKER_ROLE)
.or_else(|| marked.first())
.map_or_else(String::new, |(r, _)| r.role.clone());
let selected = picker.role.clone().unwrap_or(fallback);
let mut chosen = selected.clone();
ui.horizontal(|ui| {
ui.label("role");
for (role, fault) in marked {
let mark = if fault.is_some() { " ⚠" } else { "" };
let label = format!("{} · {}{mark}", role.role, role.model);
if ui
.selectable_label(role.role == selected, label)
.on_hover_text(
"Choose which role the dropdowns above are changing — the model \
it runs on now is shown beside its name. Typed, it is the first \
word of `/model <role> <provider> <model-id>`.",
)
.clicked()
{
chosen.clone_from(&role.role);
}
}
});
if chosen != selected {
picker.role = Some(chosen.clone());
picker.forget_choice();
}
chosen
}