use super::app_data::AppData;
use super::surface::{ SurfaceFocus, SurfaceState };
use crate::app::App;
use crate::types::Point;
use crate::platform::Platform;
impl<A: App, P: Platform> AppData<A, P>
{
pub( crate ) fn check_long_press_deadlines( &mut self )
{
let dur = self.app.long_press_duration();
let now = crate::time::Instant::now();
let fire = |ss: &mut SurfaceState<A::Message, P::Surface>|
-> Option<( Option<A::Message>, Option<A::Message>, Point, Option<usize> )>
{
let start = ss.gesture.long_press_start?;
if now.duration_since( start ) < dur { return None; }
ss.gesture.long_press_start = None;
let origin = ss.gesture.long_press_origin.unwrap_or_default();
let lp_msg = ss.gesture.long_press_msg.take();
let ds_msg = ss.gesture.drag_start_msg.take();
let text_idx = ss.gesture.long_press_text_idx.take();
if lp_msg.is_none() && ds_msg.is_none() && text_idx.is_none() { return None; }
if ds_msg.is_some() { ss.gesture.long_press_fired = true; }
if lp_msg.is_some() { ss.gesture.long_press_msg_fired = true; }
ss.request_redraw();
Some( ( lp_msg, ds_msg, origin, text_idx ) )
};
let main_fire = fire( &mut self.main ).map( |x| ( SurfaceFocus::Main, x ) );
let overlay_fires: Vec<_> = self.overlays.iter_mut()
.filter_map( |( id, ss )| fire( ss ).map( |x| ( SurfaceFocus::Overlay( *id ), x ) ) )
.collect();
let mut consumed_anything = false;
for ( focus, ( lp_msg, ds_msg, origin, text_idx ) ) in main_fire.into_iter().chain( overlay_fires )
{
if let Some( m ) = lp_msg
{
self.pending_msgs.push( m );
consumed_anything = true;
}
if let Some( m ) = ds_msg
{
self.pending_msgs.push( m );
let ( ox, oy ) = self.surface_offset_for( focus );
let global = Point { x: origin.x + ox, y: origin.y + oy };
self.pending_drag_inits.push( global );
self.stop_button_repeat();
consumed_anything = true;
}
let on_scrollbar = |idx: usize| self.text_scrollbar_grab.is_some_and( |( f, i, _ )| f == focus && i == idx );
if let Some( idx ) = text_idx.filter( |&idx| !on_scrollbar( idx ) )
{
self.show_context_menu( focus, idx, origin );
}
}
if consumed_anything { self.dirty_caches(); }
}
pub( crate ) fn has_active_long_press_drag( &self ) -> bool
{
self.main.gesture.long_press_fired
|| self.overlays.values().any( |ss| ss.gesture.long_press_fired )
}
pub( crate ) fn clear_long_press_drag( &mut self )
{
let clear = |ss: &mut SurfaceState<A::Message, P::Surface>|
{
ss.gesture.long_press_start = None;
ss.gesture.long_press_origin = None;
ss.gesture.long_press_msg = None;
ss.gesture.drag_start_msg = None;
ss.gesture.long_press_text_idx = None;
ss.gesture.long_press_fired = false;
ss.gesture.mouse_press = false;
};
clear( &mut self.main );
for ss in self.overlays.values_mut()
{
clear( ss );
}
}
}