ltk/event_loop/text_editing/
ime.rsuse crate::app::App;
use crate::event_loop::app_data::AppData;
use crate::event_loop::surface::SurfaceFocus;
use crate::platform::Platform;
use crate::tree::find_widget;
use crate::types::Rect;
use crate::widget::text_edit::TextFont;
use crate::widget::WidgetHandlers;
impl<A: App, P: Platform> AppData<A, P>
{
pub( crate ) fn activate_text_input( &mut self, secure: bool, purpose: crate::osk::Purpose )
{
self.text_input_secure = secure;
self.text_input_purpose = purpose;
self.platform.activate_text_input( secure, purpose );
}
pub( crate ) fn deactivate_text_input( &mut self )
{
self.platform.deactivate_text_input();
}
pub( crate ) fn reenable_text_input( &self )
{
self.platform.reenable_text_input( self.text_input_secure, self.text_input_purpose );
}
pub( crate ) fn sync_external_text_input( &mut self )
{
if self.focused_text_input( self.keyboard_focus )
{
self.external_text_input = None;
return;
}
let wanted = self.app.external_text_input();
match ( wanted, self.external_text_input )
{
( Some( _ ), _ ) if !self.platform.text_input_active() =>
{
let purpose = self.app.external_text_purpose();
self.activate_text_input( false, purpose );
}
( Some( new ), Some( old ) ) if new != old =>
{
self.text_input_purpose = self.app.external_text_purpose();
self.reenable_text_input();
}
( None, Some( _ ) ) => self.deactivate_text_input(),
_ => {}
}
let focus = self.keyboard_focus;
match ( wanted, self.external_text_input )
{
( Some( new ), old ) if old != Some( new ) => self.show_osk_for( focus, self.app.external_text_purpose() ),
( None, Some( _ ) ) => self.hide_osk( focus ),
_ => {}
}
self.external_text_input = wanted;
}
pub( crate ) fn text_input_geometry(
&self,
focus: SurfaceFocus,
idx: usize,
) -> Option<( Rect, String, bool, bool, crate::widget::text::TextAlign, TextFont )>
{
let ss = self.surface( focus );
let widget = find_widget( &ss.frame.widget_rects, idx )?;
let ( value_handler, multiline, secure, align, font, line_numbers ) = match &widget.handlers
{
WidgetHandlers::TextEdit { value, multiline, secure, align, font_size, line_numbers, face, .. } =>
( value.clone(), *multiline, *secure, *align, TextFont { size: *font_size, face: face.clone() }, *line_numbers ),
_ => return None,
};
let value = ss.pending_text_values.get( &idx )
.cloned()
.unwrap_or( value_handler );
let rect = match ss.canvas.as_ref()
{
Some( canvas ) => crate::widget::text_edit::gutter::text_rect( canvas, widget.rect, &value, &font, line_numbers ),
None => widget.rect,
};
Some( ( rect, value, multiline, secure, align, font ) )
}
pub( crate ) fn text_input_pad( &self, focus: SurfaceFocus, idx: usize ) -> Option<f32>
{
match &find_widget( &self.surface( focus ).frame.widget_rects, idx )?.handlers
{
WidgetHandlers::TextEdit { pad_h, .. } => *pad_h,
_ => None,
}
}
}