kr580 1.0.0

Desktop KR580VM80 / Intel 8080 emulator.
Documentation
use iced::widget::{button, container, row};
use iced::{Element, Length, alignment};

use super::super::theme::{TOKYO_TEXT, ui_text};
use super::consts::SPEED_SEGMENT_WIDTH;
use super::setting_row::setting_row;
use super::styles::segmented_button_style;
use crate::app::{ContentFocus, Message, SettingsDialog, SettingsSection, SpeedTier};
use crate::i18n::{Key, Lang};

pub(super) fn speed_setting_row<'a>(
    dialog: &'a SettingsDialog,
    lang: Lang,
) -> Element<'a, Message> {
    let kb_focus = (dialog.section == SettingsSection::Content)
        .then_some(dialog.content_focus)
        .flatten();
    let kb_focused_for = |c: ContentFocus| kb_focus == Some(c);

    let segments = row![
        segmented_button(
            lang.t(Key::SpeedSlow),
            dialog.draft_speed == SpeedTier::Slow,
            kb_focused_for(ContentFocus::SpeedSlow),
            Message::SettingsDraftSpeedChanged(SpeedTier::Slow),
        ),
        segmented_button(
            lang.t(Key::SpeedMedium),
            dialog.draft_speed == SpeedTier::Medium,
            kb_focused_for(ContentFocus::SpeedMedium),
            Message::SettingsDraftSpeedChanged(SpeedTier::Medium),
        ),
        segmented_button(
            lang.t(Key::SpeedHigh),
            dialog.draft_speed == SpeedTier::High,
            kb_focused_for(ContentFocus::SpeedFast),
            Message::SettingsDraftSpeedChanged(SpeedTier::High),
        ),
        segmented_button(
            lang.t(Key::SpeedMax),
            dialog.draft_speed == SpeedTier::Max,
            kb_focused_for(ContentFocus::SpeedMax),
            Message::SettingsDraftSpeedChanged(SpeedTier::Max),
        ),
    ]
    .spacing(6);

    setting_row(
        lang.t(Key::SettingsSpeedLabel),
        lang.t(Key::SettingsSpeedHint),
        segments.into(),
    )
}

pub(super) fn segmented_button(
    label: &'static str,
    active: bool,
    keyboard_focused: bool,
    action: Message,
) -> Element<'static, Message> {
    segmented_button_width(label, active, keyboard_focused, action, SPEED_SEGMENT_WIDTH)
}

pub(super) fn segmented_button_width(
    label: &'static str,
    active: bool,
    keyboard_focused: bool,
    action: Message,
    width: f32,
) -> Element<'static, Message> {
    button(
        container(ui_text(label, 13, TOKYO_TEXT))
            .padding([6, 0])
            .width(Length::Fixed(width))
            .align_x(alignment::Horizontal::Center),
    )
    .on_press(action)
    .padding(0)
    .style(move |_theme, status| segmented_button_style(status, active, keyboard_focused))
    .into()
}