use super::DragEndEvent;
use bevy_ecs::message::MessageReader;
use bevy_ecs::prelude::*;
pub fn cleanup_drag_state(
mut commands: Commands,
mut drag_end_events: MessageReader<DragEndEvent>,
) {
for event in drag_end_events.read() {
commands
.entity(event.target)
.remove::<crate::ecs::drag::DraggingState>();
tracing::debug!(
target = ?event.target,
"[cleanup_drag_state] DraggingState removed"
);
}
}
pub fn rearm_tick_while_dragging(dragging: Query<(), With<crate::ecs::drag::DraggingState>>) {
if !dragging.is_empty() {
crate::ecs::world::tick_wake::mark(crate::ecs::world::tick_wake::DRAG);
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::ecs::drag::DraggingState;
use crate::ecs::types::Point;
use crate::ecs::world::tick_wake;
use std::time::Instant;
fn run_once(with_dragging: bool) -> u32 {
let mut world = World::new();
if with_dragging {
world.spawn(DraggingState {
drag_start_pos: Point::new(10, 20),
initial_inset: (0.0, 0.0),
});
}
let mut schedule = Schedule::default();
schedule.add_systems(rearm_tick_while_dragging);
let _ = tick_wake::take(Instant::now());
schedule.run(&mut world);
tick_wake::take(Instant::now()).bits
}
#[test]
fn dragging_entity_rearms_the_next_frame() {
let _guard = crate::ecs::world::TICK_WAKE_TEST_LOCK
.lock()
.unwrap_or_else(|p| p.into_inner());
assert_eq!(
run_once(true) & tick_wake::DRAG.bits(),
tick_wake::DRAG.bits(),
"ドラッグ中は次の画面更新を予約する"
);
}
#[test]
fn no_dragging_entity_leaves_the_flag_down() {
let _guard = crate::ecs::world::TICK_WAKE_TEST_LOCK
.lock()
.unwrap_or_else(|p| p.into_inner());
assert_eq!(
run_once(false) & tick_wake::DRAG.bits(),
0,
"ドラッグしていなければ旗は立たない"
);
}
}