famiq 0.3.1

Experimental GUI library, powered by Bevy engine.
Documentation
use bevy::prelude::*;
use super::*;

pub(crate) fn on_mouse_over(
    mut over: Trigger<Pointer<Over>>,
    mut tooltip_q: Query<(&mut Node, &mut Transform), With<IsFamiqTooltip>>,
    mut commands: Commands,
    mut writer: EventWriter<FaMouseEvent>,
    button_q: Query<
        (&GlobalTransform, Option<&TooltipEntity>, Option<&WidgetId>),
        With<IsFamiqButton>
    >,
    window: Single<Entity, With<Window>>,
    cursor_icons: Res<CursorIcons>,
) {
    _change_cursor_icon(&mut commands, &cursor_icons, *window, CursorType::Pointer);

    if let Ok((transform, tooltip_entity, id)) = button_q.get(over.target()) {
        show_tooltip(
            tooltip_entity,
            &mut tooltip_q,
            transform.translation()
        );
        FaMouseEvent::send_event(&mut writer, EventType::Over, WidgetType::Button, over.target(), id);
    }
    over.propagate(false);
}

pub(crate) fn on_mouse_down(
    mut down: Trigger<Pointer<Pressed>>,
    mut famiq_res: ResMut<FamiqResource>,
    mut button_q: Query<
        (&mut BackgroundColor, &mut ButtonColorBeforePressed, Option<&WidgetId>),
        With<IsFamiqButton>
    >,
    mut writer: EventWriter<FaMouseEvent>
) {
    if let Ok((mut bg_color, mut before_pressed_color, id)) = button_q.get_mut(down.target()) {
        before_pressed_color.0 = Some(bg_color.0);
        famiq_res.update_all_focus_states(false);
        famiq_res.update_or_insert_focus_state(down.target(), true);

        if let Some(darkened_color) = darken_color(20.0, &bg_color.0) {
            bg_color.0 = darkened_color;
        }
        if down.event().button == PointerButton::Secondary {
            FaMouseEvent::send_event(&mut writer, EventType::DownRight, WidgetType::Button, down.target(), id);
        } else {
            FaMouseEvent::send_event(&mut writer, EventType::DownLeft, WidgetType::Button, down.target(), id);
        }
    }
    down.propagate(false);
}

pub(crate) fn on_mouse_up(
    mut up: Trigger<Pointer<Released>>,
    mut button_q: Query<(&mut BackgroundColor, &ButtonColorBeforePressed, Option<&WidgetId>), With<IsFamiqButton>>,
    mut writer: EventWriter<FaMouseEvent>
) {
    if let Ok((mut bg_color, before_pressed_color, id)) = button_q.get_mut(up.target()) {
        if let Some(color) = before_pressed_color.0 {
            bg_color.0 = color;
        }
        FaMouseEvent::send_event(&mut writer, EventType::Up, WidgetType::Button, up.target(), id);
    }
    up.propagate(false);
}

pub(crate) fn on_mouse_out(
    mut out: Trigger<Pointer<Out>>,
    mut tooltip_q: Query<(&mut Node, &mut Transform), With<IsFamiqTooltip>>,
    mut button_q: Query<
        (Option<&TooltipEntity>, Option<&WidgetId>, &mut BackgroundColor, &ButtonColorBeforePressed),
        With<IsFamiqButton>
    >,
    mut commands: Commands,
    mut writer: EventWriter<FaMouseEvent>,
    window: Single<Entity, With<Window>>,
    cursor_icons: Res<CursorIcons>,
) {
    _change_cursor_icon(&mut commands, &cursor_icons, *window, CursorType::Default);

    if let Ok((tooltip_entity, id, mut bg_color, before_pressed_color)) = button_q.get_mut(out.target()) {
        if let Some(color) = before_pressed_color.0 {
            bg_color.0 = color;
        }
        hide_tooltip(tooltip_entity, &mut tooltip_q);
        FaMouseEvent::send_event(&mut writer, EventType::Out, WidgetType::Button, out.target(), id);
    }
    out.propagate(false);
}