use crate::{MainWindow, VerdictModel, VerdictReasonData};
use indicatrix_editor::verdict::{FixAction, Verdict};
use slint::{ComponentHandle, ModelRc, VecModel};
#[derive(Debug, Clone, PartialEq, Eq)]
pub(super) struct ReasonRow {
pub(super) level: i32,
pub(super) text: String,
pub(super) tier: i32,
pub(super) fix_label: String,
pub(super) fix_hint: String,
}
pub(super) fn rows_of(verdict: &Verdict) -> Vec<ReasonRow> {
verdict
.reasons
.iter()
.map(|reason| ReasonRow {
level: reason.level.code(),
text: reason.text.clone(),
tier: reason
.tier
.and_then(|tier| i32::try_from(tier).ok())
.unwrap_or(-1),
fix_label: reason
.fix
.as_ref()
.map(FixAction::label)
.unwrap_or_default()
.to_string(),
fix_hint: reason
.fix
.as_ref()
.map(FixAction::hint)
.unwrap_or_default()
.to_string(),
})
.collect()
}
pub(super) fn push_verdict(ui: &MainWindow, verdict: &Verdict) {
let model = ui.global::<VerdictModel>();
let rows: Vec<VerdictReasonData> = rows_of(verdict)
.into_iter()
.map(|row| VerdictReasonData {
level: row.level,
text: row.text.into(),
tier: row.tier,
fix_label: row.fix_label.into(),
fix_hint: row.fix_hint.into(),
})
.collect();
model.set_level(verdict.level.code());
model.set_word(verdict.level.word().into());
model.set_headline(verdict.headline.as_str().into());
model.set_reasons(ModelRc::new(VecModel::from(rows)));
model.set_stale(false);
}
pub(super) fn push_hidden(ui: &MainWindow) {
let model = ui.global::<VerdictModel>();
model.set_level(-1);
model.set_word("".into());
model.set_headline("".into());
model.set_reasons(ModelRc::new(
VecModel::from(Vec::<VerdictReasonData>::new()),
));
model.set_stale(false);
model.set_busy(false);
}
pub(super) fn set_stale(ui: &MainWindow, stale: bool) {
ui.global::<VerdictModel>().set_stale(stale);
}
pub(super) fn set_busy(ui: &MainWindow, busy: bool) {
ui.global::<VerdictModel>().set_busy(busy);
}