ltk/input/pointer/
press.rsuse crate::app::App;
use crate::event_loop::{ AppData, SurfaceFocus };
use crate::platform::Platform;
use crate::tree::{ find_handlers, find_widget_at };
use crate::widget::WidgetHandlers;
use super::super::event::PointerInput;
impl<A: App, P: Platform> AppData<A, P>
{
pub( super ) fn on_pointer_right_click( &mut self, input: &PointerInput )
{
let focus = input.focus;
let pos = self.surface( focus ).to_physical( input.position.0, input.position.1 );
self.pointer_pos = pos;
self.app.on_pointer_move( pos.x, pos.y );
let hit_idx = find_widget_at( &self.surface( focus ).frame.widget_rects, pos );
let lp_msg = hit_idx.and_then( |idx|
find_handlers( &self.surface( focus ).frame.widget_rects, idx )
.and_then( |h| h.long_press_msg() ) );
if let Some( msg ) = lp_msg
{
self.pending_msgs.push( msg );
self.surface_mut( focus ).request_redraw();
} else {
let is_text = hit_idx.and_then( |idx|
find_handlers( &self.surface( focus ).frame.widget_rects, idx )
.map( |h| h.is_text_input() ) ).unwrap_or( false );
if is_text
{
let idx = hit_idx.unwrap();
if self.surface( focus ).focused_idx != Some( idx )
{
self.set_focus( focus, hit_idx );
}
self.show_context_menu( focus, idx, pos );
} else {
self.hide_context_menu( focus );
self.app.on_pointer_secondary( pos.x, pos.y );
}
}
}
pub( super ) fn on_pointer_middle_press( &mut self, input: &PointerInput )
{
let focus = input.focus;
let pos = self.surface( focus ).to_physical( input.position.0, input.position.1 );
self.pointer_pos = pos;
let rects = &self.surface( focus ).frame.widget_rects;
let field = find_widget_at( rects, pos ).filter( |&idx| find_handlers( rects, idx ).is_some_and( |h| h.is_text_input() ) );
let Some( idx ) = field else { return self.app.on_pointer_middle( pos.x, pos.y ) };
self.press_on_focused = self.surface( focus ).focused_idx == Some( idx );
if !self.press_on_focused { self.set_focus( focus, Some( idx ) ); }
self.handle_text_pointer_down( focus, idx, pos );
self.paste_primary( crate::event_loop::clipboard::PrimaryPaste::Field( focus, idx ) );
}
pub( super ) fn on_pointer_left_press( &mut self, input: &PointerInput )
{
let focus = input.focus;
self.cancel_tooltip();
let pos = self.surface( focus ).to_physical( input.position.0, input.position.1 );
self.pointer_pos = pos;
self.app.on_pointer_move( pos.x, pos.y );
if matches!( focus, SurfaceFocus::Main ) && !self.overlays.is_empty()
{
self.dismiss_main_outside_popups( pos );
}
if self.surface( focus ).context_menu.is_some() && self.handle_context_menu_press( focus, pos ) { return; }
if self.osk_press( focus, pos ) { return; }
let sf = self.surface( focus ).scale_factor;
let tb_h = self.surface( focus ).titlebar_height * sf;
if tb_h > 0.0 && pos.y < tb_h
{
let close_rect = self.surface( focus ).titlebar_close_rect;
if close_rect.contains( pos )
{
self.request_close();
return;
}
}
if let Some( edge ) = self.resize_edge_under_pointer( focus )
{
self.platform.begin_window_resize( &self.main.platform, edge );
return;
}
if tb_h > 0.0 && pos.y < tb_h
{
if matches!( focus, SurfaceFocus::Main ) { self.platform.begin_window_move( &self.main.platform ); }
return;
}
self.app.on_pointer_button( pos.x, pos.y, true );
let outcome =
{
let ss = self.surface_mut( focus );
let result = ss.gesture.on_press( pos, &ss.frame.widget_rects, &ss.frame.scroll_rects );
ss.gesture.mouse_press = true;
ss.needs_redraw = true;
result
};
self.press_on_focused = outcome.hit_idx.is_some() && self.surface( focus ).focused_idx == outcome.hit_idx;
self.focus_pressed( focus, outcome.hit_idx );
self.osk_after_press( focus, outcome.hit_idx );
if let Some( msg ) = outcome.initial_slider_msg
{
self.pending_msgs.push( msg );
}
if let Some( idx ) = outcome.hit_idx
{
let immediate = {
let handlers = find_handlers( &self.surface( focus ).frame.widget_rects, idx );
if matches!( handlers, Some( WidgetHandlers::Button { repeating: true, .. } ) )
{
handlers.and_then( |h| h.press_msg() )
} else { None }
};
if let Some( msg ) = immediate
{
self.pending_msgs.push( msg );
self.start_button_repeat( focus, idx );
}
}
if let Some( idx ) = outcome.hit_idx
{
let is_text = find_handlers( &self.surface( focus ).frame.widget_rects, idx )
.map( |h| h.is_text_input() ).unwrap_or( false );
if is_text
{
if self.handle_password_toggle_press( focus, idx, pos ) || self.handle_text_scrollbar_press( focus, idx, pos )
{
let _ = self.note_press_for_double_click( pos );
}
else
{
let is_double = self.note_press_for_double_click( pos );
if is_double
{
self.handle_text_select_word( focus, idx, pos );
} else {
self.handle_text_pointer_down( focus, idx, pos );
}
}
} else {
let _ = self.note_press_for_double_click( pos );
}
} else {
let _ = self.note_press_for_double_click( pos );
}
self.dispatch_cursor_shape( focus );
}
}