aethermap-gui 1.5.0

GUI client for aethermap input remapper
Documentation
use crate::gui::{Message, State};
use aethermap_common::LedZone;
use iced::Command;

pub fn open(state: &mut State, device_id: String) -> Command<Message> {
    state.led_config_device = Some(device_id.clone());
    state.selected_led_zone = Some(LedZone::Logo);
    Command::batch([
        Command::none(),
        Command::perform(async move { device_id }, |device_id| {
            Message::RefreshLedState(device_id)
        }),
    ])
}

pub fn close(state: &mut State) -> Command<Message> {
    state.led_config_device = None;
    state.selected_led_zone = None;
    state.pending_led_color = None;
    Command::none()
}

pub fn select_zone(state: &mut State, zone: LedZone) -> Command<Message> {
    state.selected_led_zone = Some(zone);
    Command::none()
}

pub fn refresh(state: &State, device_id: String) -> Command<Message> {
    let socket_path = state.socket_path.clone();
    let device_id_clone = device_id.clone();
    Command::perform(
        async move {
            let client = crate::ipc::IpcClient::new(socket_path);
            client.get_all_led_colors(&device_id_clone).await
        },
        move |result| match result {
            Ok(colors) => Message::LedStateLoaded(device_id, Ok(colors)),
            Err(e) => Message::LedStateLoaded(device_id, Err(e)),
        },
    )
}

pub fn state_loaded(
    state: &mut State,
    device_id: String,
    result: Result<std::collections::HashMap<LedZone, (u8, u8, u8)>, String>,
) -> Command<Message> {
    match result {
        Ok(colors) => {
            let led_state = state.led_states.entry(device_id).or_default();
            led_state.zone_colors = colors;
            Command::none()
        }
        Err(e) => {
            eprintln!("Failed to load LED state: {}", e);
            Command::none()
        }
    }
}

pub fn set_color(
    state: &State,
    device_id: String,
    zone: LedZone,
    red: u8,
    green: u8,
    blue: u8,
) -> Command<Message> {
    let socket_path = state.socket_path.clone();
    let device_id_clone = device_id.clone();
    Command::perform(
        async move {
            let client = crate::ipc::IpcClient::new(socket_path);
            client
                .set_led_color(&device_id_clone, zone, red, green, blue)
                .await
        },
        move |result| match result {
            Ok(_) => Message::LedColorSet(Ok(())),
            Err(e) => Message::LedColorSet(Err(e)),
        },
    )
}

pub fn color_set(state: &mut State, result: Result<(), String>) -> Command<Message> {
    if let Err(e) = result {
        eprintln!("Failed to set LED color: {}", e);
        state.add_notification(&format!("Failed to set LED color: {}", e), true);
    }
    Command::none()
}

pub fn set_brightness(
    state: &State,
    device_id: String,
    zone: Option<LedZone>,
    brightness: u8,
) -> Command<Message> {
    let socket_path = state.socket_path.clone();
    Command::perform(
        async move {
            let client = crate::ipc::IpcClient::new(socket_path);
            client
                .set_led_brightness(&device_id, zone, brightness)
                .await
        },
        |result| match result {
            Ok(_) => Message::LedBrightnessSet(Ok(())),
            Err(e) => Message::LedBrightnessSet(Err(e)),
        },
    )
}

pub fn brightness_set(state: &mut State, result: Result<(), String>) -> Command<Message> {
    if let Err(e) = result {
        eprintln!("Failed to set LED brightness: {}", e);
        state.add_notification(&format!("Failed to set LED brightness: {}", e), true);
    }
    Command::none()
}

pub fn set_pattern(
    state: &State,
    device_id: String,
    pattern: aethermap_common::LedPattern,
) -> Command<Message> {
    let socket_path = state.socket_path.clone();
    Command::perform(
        async move {
            let client = crate::ipc::IpcClient::new(socket_path);
            client.set_led_pattern(&device_id, pattern).await
        },
        |result| match result {
            Ok(_) => Message::LedPatternSet(Ok(())),
            Err(e) => Message::LedPatternSet(Err(e)),
        },
    )
}

pub fn pattern_set(state: &mut State, result: Result<(), String>) -> Command<Message> {
    if let Err(e) = result {
        eprintln!("Failed to set LED pattern: {}", e);
        state.add_notification(&format!("Failed to set LED pattern: {}", e), true);
    }
    Command::none()
}

pub fn slider_changed(state: &mut State, red: u8, green: u8, blue: u8) -> Command<Message> {
    state.pending_led_color = Some((red, green, blue));
    if let (Some(ref device_id), Some(zone)) = (&state.led_config_device, state.selected_led_zone) {
        let device_id = device_id.clone();
        return Command::perform(
            async move { (device_id, zone, red, green, blue) },
            |(device_id, zone, red, green, blue)| {
                Message::SetLedColor(device_id, zone, red, green, blue)
            },
        );
    }
    Command::none()
}