use egui::{Context, Id, Pos2};
use crate::{Style, SurfaceIndex};
use super::drag_and_drop::{DragData, DragDropState, HoverData};
#[derive(Clone, Debug, Default)]
pub(super) struct State {
pub drag_start: Option<Pos2>,
pub last_hover_pos: Option<Pos2>,
pub dnd: Option<DragDropState>,
pub window_fade: Option<(f64, SurfaceIndex)>,
}
impl State {
#[inline(always)]
pub(super) fn load(ctx: &Context, id: Id) -> Self {
ctx.data_mut(|d| d.get_temp(id)).unwrap_or(Self {
drag_start: None,
last_hover_pos: None,
dnd: None,
window_fade: None,
})
}
#[inline(always)]
pub(super) fn store(self, ctx: &Context, id: Id) {
ctx.data_mut(|d| d.insert_temp(id, self));
}
pub(super) fn reset_drag(&mut self) {
self.dnd = None;
self.window_fade = None;
self.drag_start = None;
}
pub(super) fn set_drag_and_drop(
&mut self,
drag: DragData,
drop: HoverData,
ctx: &Context,
style: &Style,
) {
if !self.is_drag_drop_locked(ctx, style) {
self.dnd = Some(DragDropState {
hover: drop,
drag,
pointer: ctx.pointer_hover_pos().unwrap_or(Pos2::ZERO),
locked: None,
})
}
}
#[inline(always)]
fn is_drag_drop_locked(&self, ctx: &Context, style: &Style) -> bool {
self.dnd
.as_ref()
.is_some_and(|drag_drop_state| drag_drop_state.is_locked(style, ctx))
}
}