kr580 1.0.0

Desktop KR580VM80 / Intel 8080 emulator.
Documentation
use crate::backend::NetworkMode;
use iced::widget::{Space, button, column, container, mouse_area, opaque, row, stack};
use iced::{Element, Length, alignment};

use super::icons;
use super::network::{NetworkViewState, center};
use super::storage::chrome::icon_button;
use super::styles::{
    modal_backdrop_style, modal_field_button_style, modal_tab_button_style, panel_style,
};
use super::theme::{TOKYO_MUTED, TOKYO_RED, TOKYO_TEXT, ui_text};
use super::widgets::{modal_footer_button, text_input_shell};
use crate::app::Message;
use crate::i18n::{Key, NetworkKey};

pub(super) fn settings_overlay(view: NetworkViewState<'_>) -> Element<'_, Message> {
    let backdrop = mouse_area(
        container(Space::new())
            .width(Length::Fill)
            .height(Length::Fill)
            .style(modal_backdrop_style),
    )
    .on_press(Message::CloseNetworkSettings);
    let error: Element<'_, Message> = view.error.map_or_else(
        || Space::new().height(Length::Fixed(12.0)).into(),
        |error| ui_text(error, 12, TOKYO_RED).into(),
    );
    let inputs = row![
        column![
            ui_text(view.lang.t(Key::Network(NetworkKey::Host)), 12, TOKYO_MUTED),
            text_input_shell(
                "127.0.0.1",
                view.host,
                Message::NetworkHostChanged,
                Length::Fill,
            ),
        ]
        .spacing(4)
        .width(Length::Fill),
        column![
            ui_text(view.lang.t(Key::Network(NetworkKey::Port)), 12, TOKYO_MUTED),
            text_input_shell("5800", view.port, Message::NetworkPortChanged, Length::Fill,),
        ]
        .spacing(4)
        .width(Length::Fixed(110.0)),
    ]
    .spacing(10);
    let buttons = row![
        Space::new().width(Length::Fill),
        modal_footer_button(
            view.lang.t(Key::Network(NetworkKey::Cancel)),
            Message::CloseNetworkSettings,
            modal_field_button_style,
        ),
        modal_footer_button(
            view.lang.t(Key::Network(NetworkKey::Apply)),
            Message::ApplyNetworkSettings,
            modal_field_button_style,
        ),
    ]
    .spacing(8);
    let dialog = container(
        column![
            row![
                ui_text(
                    view.lang.t(Key::Network(NetworkKey::SettingsTitle)),
                    16,
                    TOKYO_TEXT
                ),
                Space::new().width(Length::Fill),
                icon_button(
                    icons::window_close(),
                    Some(Message::CloseNetworkSettings),
                    view.lang.t(Key::MonitorClose),
                    false,
                    None,
                ),
            ]
            .align_y(alignment::Vertical::Center),
            row![
                ui_text(view.lang.t(Key::Network(NetworkKey::Mode)), 13, TOKYO_MUTED),
                mode_button(
                    view.lang.t(Key::Network(NetworkKey::ModeClient)),
                    NetworkMode::Client,
                    view.mode == NetworkMode::Client,
                ),
                mode_button(
                    view.lang.t(Key::Network(NetworkKey::ModeServer)),
                    NetworkMode::Server,
                    view.mode == NetworkMode::Server,
                ),
            ]
            .spacing(8)
            .align_y(alignment::Vertical::Center),
            column![inputs, error, buttons].spacing(4),
        ]
        .spacing(12),
    )
    .padding(16)
    .width(Length::Fixed(440.0))
    .style(panel_style);

    stack![opaque(backdrop), center(opaque(dialog))]
        .width(Length::Fill)
        .height(Length::Fill)
        .into()
}

fn mode_button(
    label: &'static str,
    mode: NetworkMode,
    selected: bool,
) -> Element<'static, Message> {
    button(container(ui_text(label, 13, TOKYO_TEXT)).padding([6, 14]))
        .on_press(Message::NetworkModeChanged(mode))
        .padding(0)
        .style(move |_theme, status| modal_tab_button_style(status, selected))
        .into()
}