use smithay_client_toolkit::reexports::client::QueueHandle;
use super::app_data::AppData;
use super::surface::SurfaceFocus;
use crate::app::{ App, OverlayId };
use crate::tree::find_handlers;
use crate::types::Point;
use crate::widget::WidgetHandlers;
impl<A: App> AppData<A>
{
pub( crate ) fn dismiss_main_outside_popups( &mut self, pos: Point )
{
if self.overlays.is_empty() { return; }
let specs = self.app.overlays();
for spec in specs
{
let Some( anchor_id ) = spec.anchor_widget_id else { continue; };
let anchor_rect = self.main.frame.widget_rects.iter()
.find( | w | w.id == Some( anchor_id ) )
.map( | w | w.rect );
let on_anchor = anchor_rect
.map( | r | pos.x >= r.x && pos.x < r.x + r.width
&& pos.y >= r.y && pos.y < r.y + r.height )
.unwrap_or( false );
if !on_anchor
{
if let Some( msg ) = spec.on_dismiss
{
self.pending_msgs.push( msg );
}
}
}
}
pub( crate ) fn dismiss_all_popups( &mut self )
{
if self.overlays.is_empty() { return; }
let specs = self.app.overlays();
for spec in specs
{
if spec.anchor_widget_id.is_some()
{
if let Some( msg ) = spec.on_dismiss
{
self.pending_msgs.push( msg );
}
}
}
}
pub( crate ) fn overlay_dismiss_msg( &self, id: OverlayId ) -> Option<A::Message>
{
self.app.overlays().into_iter()
.find( |s| s.id == id )
.and_then( |s| s.on_dismiss )
}
pub( crate ) fn set_focus( &mut self, focus: SurfaceFocus, idx: Option<usize>, qh: &QueueHandle<Self> )
{
let was_text_input;
let is_text_input;
let secure;
{
let ss = self.surface_mut( focus );
is_text_input = idx
.and_then( |i| find_handlers( &ss.frame.widget_rects, i ) )
.map( |h| h.is_text_input() )
.unwrap_or( false );
secure = idx
.and_then( |i| find_handlers( &ss.frame.widget_rects, i ) )
.map( |h| matches!( h, WidgetHandlers::TextEdit { secure: true, .. } ) )
.unwrap_or( false );
was_text_input = ss.focused_idx
.and_then( |i| find_handlers( &ss.frame.widget_rects, i ) )
.map( |h| h.is_text_input() )
.unwrap_or( false );
if let Some( prev_idx ) = ss.focused_idx
{
if idx != Some( prev_idx )
{
ss.pending_text_values.remove( &prev_idx );
}
}
ss.focused_idx = idx;
ss.focused_id = idx.and_then( |i|
{
ss.frame.widget_rects.iter()
.find( |w| w.flat_idx == i )
.and_then( |w| w.id )
} );
ss.request_redraw();
if is_text_input
{
if let Some( i ) = idx
{
let handler = find_handlers( &ss.frame.widget_rects, i );
let cursor = handler
.and_then( |h| h.current_value() )
.map( |v| v.len() )
.unwrap_or( 0 );
let anchor = match handler
{
Some( WidgetHandlers::TextEdit { select_on_focus: true, .. } ) => 0,
_ => cursor,
};
ss.frame.cursor_state.insert( i, cursor );
ss.frame.selection_anchor.insert( i, anchor );
}
}
}
if was_text_input && !is_text_input
{
self.deactivate_text_input();
self.app.on_text_input_focused( false );
self.dirty_caches();
}
else if is_text_input && !was_text_input
{
self.activate_text_input( qh, secure );
self.app.on_text_input_focused( true );
self.dirty_caches();
}
else if is_text_input
{
self.activate_text_input( qh, secure );
}
}
}