mod accumulator;
mod context;
mod dispatch;
mod state;
mod systems;
pub use accumulator::{DragAccumulator, DragAccumulatorResource, DragTransition, FlushResult};
pub use context::{WindowDragContext, WindowDragContextResource};
pub use dispatch::{
DragEndEvent, DragEvent, DragStartEvent, OnDrag, OnDragEnd, OnDragStart, dispatch_drag_events,
};
pub use state::{
DragState, cancel_dragging, check_threshold, end_dragging, read_drag_state, reset_to_idle,
start_dragging, start_preparing, update_drag_state, update_dragging,
};
pub use systems::cleanup_drag_state;
use crate::ecs::pointer::PhysicalPoint;
use bevy_ecs::prelude::*;
#[derive(Component, Clone, Debug)]
#[component(storage = "SparseSet")]
pub struct DragConfig {
pub threshold: i32,
pub enabled: bool,
pub move_window: bool,
pub left_button: bool,
pub right_button: bool,
pub middle_button: bool,
}
impl Default for DragConfig {
fn default() -> Self {
Self {
threshold: 5,
enabled: true,
move_window: true,
left_button: true,
right_button: false,
middle_button: false,
}
}
}
#[derive(Component, Debug, Clone, Copy)]
#[component(storage = "SparseSet")]
pub struct DraggingState {
pub drag_start_pos: PhysicalPoint,
pub initial_inset: (f32, f32),
pub prev_frame_pos: PhysicalPoint,
}
#[derive(Component, Clone, Copy, Debug)]
#[component(storage = "SparseSet")]
pub struct DragConstraint {
pub min_x: Option<i32>,
pub max_x: Option<i32>,
pub min_y: Option<i32>,
pub max_y: Option<i32>,
}
impl DragConstraint {
pub fn apply(&self, x: i32, y: i32) -> (i32, i32) {
let x = self.min_x.map_or(x, |min| x.max(min));
let x = self.max_x.map_or(x, |max| x.min(max));
let y = self.min_y.map_or(y, |min| y.max(min));
let y = self.max_y.map_or(y, |max| y.min(max));
(x, y)
}
}
#[derive(Component)]
#[component(storage = "SparseSet")]
pub struct WindowDragging;