use bevy::prelude::*;
use super::*;
pub fn on_hover_system(
scroll_q: Query<(Entity, &Interaction), (With<IsFamiqScroll>, Changed<Interaction>)>,
mut can_be_scrolled: ResMut<CanBeScrolled>
) {
for (entity, interaction) in scroll_q.iter() {
if *interaction == Interaction::Hovered {
can_be_scrolled.entity = Some(entity);
break;
}
}
}
pub fn on_scroll_system(
mut mouse_wheel_events: EventReader<MouseWheel>,
mut scroll_q: Query<
(&mut Node, &ComputedNode, &ScrollMovePanelEntity, Option<&WidgetId>),
Without<ScrollList>
>,
mut panel_q: Query<(&mut Node, &ComputedNode, &mut ScrollList, &mut DefaultWidgetConfig)>,
mut mouse_event_writer: EventWriter<FaMouseEvent>,
can_be_scrolled: ResMut<CanBeScrolled>,
) {
for e in mouse_wheel_events.read() {
if let Some(hovered) = can_be_scrolled.entity {
if let Ok((_, scroll_c_node, panel_entity, scroll_id)) = scroll_q.get_mut(hovered) {
if let Ok((mut panel_node, panel_c_node, mut scroll_list, mut default_style)) = panel_q.get_mut(panel_entity.0) {
let dy = match e.unit {
MouseScrollUnit::Line => e.y * scroll_list.scroll_height,
MouseScrollUnit::Pixel => e.y,
};
let max_scroll = ScrollBuilder::calculate_max_scroll(panel_c_node, scroll_c_node);
scroll_list.position = (scroll_list.position + dy).clamp(-max_scroll, 0.0);
panel_node.top = Val::Px(scroll_list.position);
default_style.node.top = Val::Px(scroll_list.position);
FaMouseEvent::send_event(
&mut mouse_event_writer,
EventType::Scroll,
WidgetType::Scroll,
hovered,
scroll_id
);
}
}
}
}
}
pub fn detect_new_scroll_system(
listview_q: Query<&ScrollMovePanelEntity, Added<IsFamiqScroll>>,
mut panel_q: Query<&mut Node, With<IsFamiqScrollMovePanel>>
) {
for panel_entity in listview_q.iter() {
if let Ok(mut panel_node) = panel_q.get_mut(panel_entity.0) {
panel_node.padding = UiRect::all(Val::Px(0.0));
}
}
}