use super::{
launch,
runtime::{self, UiFacts},
};
use crate::{
EditorModel, GuideModel, MainWindow, SolidPreviewModel, gui::editor::state::EditorState,
};
use indicatrix_cut_core::Design;
use indicatrix_editor::guide::NEW_DESIGN_CREATED;
use slint::ComponentHandle;
use std::time::Duration;
pub(super) fn guide_event(ui: &MainWindow, name: &str) {
runtime::record_event(name);
if name == NEW_DESIGN_CREATED {
runtime::mark_new_design_arrived();
launch::evaluate_launch(ui);
}
check_now(ui);
}
pub(in crate::gui::editor) fn notify(ui: &MainWindow, key: &str) {
guide_event(ui, key);
}
pub(in crate::gui::editor) fn check_progress(ui: &MainWindow, state: &EditorState) {
check_design_progress(ui, &state.design);
}
pub(in crate::gui::editor) fn check_design_progress(ui: &MainWindow, design: &Design) {
let guide = ui.global::<GuideModel>();
if !guide.get_open() || guide.get_step_done() {
return;
}
let Ok(index) = usize::try_from(guide.get_step_index()) else {
return;
};
let model = ui.global::<EditorModel>();
let facts = UiFacts {
solved_closed: model.get_solve_state() == "solved" && !model.get_status_is_problem(),
view_mode: ui.global::<SolidPreviewModel>().get_view_mode(),
inspector_tab: model.get_inspector_tab(),
};
if runtime::goal_is_met(guide.get_guide_id().as_str(), index, design, facts) {
guide.invoke_notify(guide.get_current().completion);
}
}
pub(super) fn check_now(ui: &MainWindow) {
if !try_check(ui) {
let ui_weak = ui.as_weak();
slint::Timer::single_shot(Duration::from_millis(50), move || {
if let Some(ui) = ui_weak.upgrade() {
try_check(&ui);
}
});
}
}
fn try_check(ui: &MainWindow) -> bool {
let Some(state) = runtime::state() else {
return true;
};
let Ok(st) = state.try_borrow() else {
return false;
};
check_progress(ui, &st);
true
}