kr580 1.0.0

Desktop KR580VM80 / Intel 8080 emulator.
Documentation
use iced::Theme;
use std::time::{Duration, Instant};

use super::messages::SpeedTier;
use super::state::DesktopApp;
use super::status::StatusKind;
use crate::i18n::Key;

impl DesktopApp {
    pub(crate) fn theme(&self, _window: iced::window::Id) -> Option<Theme> {
        Some(Theme::TokyoNight)
    }

    pub(crate) fn set_status(&mut self, kind: StatusKind) {
        if let Some(rendered) = kind.render(self.lang) {
            self.status = rendered;
            self.status_kind = kind;
        }
    }

    pub(crate) fn set_status_custom(&mut self, text: String) {
        self.status = text;
        self.status_kind = StatusKind::Custom;
    }

    pub(crate) fn refresh_localized_status(&mut self) {
        if let Some(rendered) = self.status_kind.render(self.lang) {
            self.status = rendered;
        }
    }

    pub(crate) fn clear_error_notice(&mut self) {
        self.error_notice = None;
        self.error_notice_dismiss_at = None;
    }

    pub(crate) fn clear_halt_notice(&mut self) {
        self.halt_notice = None;
        self.halt_notice_dismiss_at = None;
    }

    pub(crate) fn raise_halt_notice(&mut self) {
        self.halt_notice = Some(self.lang.t(Key::HaltNotice).to_owned());
        self.halt_notice_dismiss_at = Some(Instant::now() + Duration::from_secs(8));
        self.run_blocked_after_halt = true;
    }

    pub(crate) fn run_new_file(&mut self) {
        self.dispatch(crate::backend::AppCommand::ResetRam);
        self.dispatch(crate::backend::AppCommand::ResetCpu);
        self.running = false;
        self.current_snapshot_path = None;
        self.undo_stack.clear();
        self.mark_saved();
        self.speed_tier = self.default_speed;
        self.set_status(StatusKind::NewFile);
    }

    pub(crate) fn mark_saved(&mut self) {
        self.dirty = false;
        self.saved_cpu = self.snapshot.cpu.clone();
    }

    pub(crate) fn recompute_dirty(&mut self) {
        self.dirty = self.snapshot.cpu != self.saved_cpu;
    }

    pub(crate) fn apply_speed_tier(&mut self, tier: SpeedTier) {
        self.speed_tier = tier;
        let hz = super::tier_hz(tier);
        let interval = Duration::from_micros(1_000_000 / u64::from(hz.max(1)));
        self.dispatch(crate::backend::AppCommand::SetStepInterval(interval));
        let mode = match tier {
            SpeedTier::Max => crate::backend::RunMode::Burst {
                slice: Duration::from_millis(16),
            },
            _ => crate::backend::RunMode::Paced,
        };
        self.dispatch(crate::backend::AppCommand::SetRunMode(mode));
    }
}