Rename Output::text_cursor to text_cursor_pos
This commit is contained in:
parent
8cce09687f
commit
6a576f4c34
|
|
@ -24,8 +24,8 @@ pub struct Output {
|
||||||
/// Events that may be useful to e.g. a screen reader.
|
/// Events that may be useful to e.g. a screen reader.
|
||||||
pub events: Vec<OutputEvent>,
|
pub events: Vec<OutputEvent>,
|
||||||
|
|
||||||
/// Position of text widgts' cursor
|
/// Position of text edit cursor (used for IME).
|
||||||
pub text_cursor: Option<crate::Pos2>,
|
pub text_cursor_pos: Option<crate::Pos2>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Output {
|
impl Output {
|
||||||
|
|
|
||||||
|
|
@ -152,7 +152,7 @@ impl Button {
|
||||||
|
|
||||||
if ui.clip_rect().intersects(rect) {
|
if ui.clip_rect().intersects(rect) {
|
||||||
let visuals = ui.style().interact(&response);
|
let visuals = ui.style().interact(&response);
|
||||||
let text_cursor = ui
|
let text_pos = ui
|
||||||
.layout()
|
.layout()
|
||||||
.align_size_within_rect(galley.size, rect.shrink2(button_padding))
|
.align_size_within_rect(galley.size, rect.shrink2(button_padding))
|
||||||
.min;
|
.min;
|
||||||
|
|
@ -170,7 +170,7 @@ impl Button {
|
||||||
let text_color = text_color
|
let text_color = text_color
|
||||||
.or(ui.visuals().override_text_color)
|
.or(ui.visuals().override_text_color)
|
||||||
.unwrap_or_else(|| visuals.text_color());
|
.unwrap_or_else(|| visuals.text_color());
|
||||||
ui.painter().galley(text_cursor, galley, text_color);
|
ui.painter().galley(text_pos, galley, text_color);
|
||||||
}
|
}
|
||||||
|
|
||||||
response
|
response
|
||||||
|
|
@ -277,7 +277,7 @@ impl<'a> Widget for Checkbox<'a> {
|
||||||
|
|
||||||
// let visuals = ui.style().interact_selectable(&response, *checked); // too colorful
|
// let visuals = ui.style().interact_selectable(&response, *checked); // too colorful
|
||||||
let visuals = ui.style().interact(&response);
|
let visuals = ui.style().interact(&response);
|
||||||
let text_cursor = pos2(
|
let text_pos = pos2(
|
||||||
rect.min.x + button_padding.x + icon_width + icon_spacing,
|
rect.min.x + button_padding.x + icon_width + icon_spacing,
|
||||||
rect.center().y - 0.5 * galley.size.y,
|
rect.center().y - 0.5 * galley.size.y,
|
||||||
);
|
);
|
||||||
|
|
@ -304,7 +304,7 @@ impl<'a> Widget for Checkbox<'a> {
|
||||||
let text_color = text_color
|
let text_color = text_color
|
||||||
.or(ui.visuals().override_text_color)
|
.or(ui.visuals().override_text_color)
|
||||||
.unwrap_or_else(|| visuals.text_color());
|
.unwrap_or_else(|| visuals.text_color());
|
||||||
ui.painter().galley(text_cursor, galley, text_color);
|
ui.painter().galley(text_pos, galley, text_color);
|
||||||
response
|
response
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -392,7 +392,7 @@ impl Widget for RadioButton {
|
||||||
response
|
response
|
||||||
.widget_info(|| WidgetInfo::selected(WidgetType::RadioButton, checked, &galley.text));
|
.widget_info(|| WidgetInfo::selected(WidgetType::RadioButton, checked, &galley.text));
|
||||||
|
|
||||||
let text_cursor = pos2(
|
let text_pos = pos2(
|
||||||
rect.min.x + button_padding.x + icon_width + icon_spacing,
|
rect.min.x + button_padding.x + icon_width + icon_spacing,
|
||||||
rect.center().y - 0.5 * galley.size.y,
|
rect.center().y - 0.5 * galley.size.y,
|
||||||
);
|
);
|
||||||
|
|
@ -424,7 +424,7 @@ impl Widget for RadioButton {
|
||||||
let text_color = text_color
|
let text_color = text_color
|
||||||
.or(ui.visuals().override_text_color)
|
.or(ui.visuals().override_text_color)
|
||||||
.unwrap_or_else(|| visuals.text_color());
|
.unwrap_or_else(|| visuals.text_color());
|
||||||
painter.galley(text_cursor, galley, text_color);
|
painter.galley(text_pos, galley, text_color);
|
||||||
response
|
response
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -73,7 +73,7 @@ impl Widget for SelectableLabel {
|
||||||
WidgetInfo::selected(WidgetType::SelectableLabel, selected, &galley.text)
|
WidgetInfo::selected(WidgetType::SelectableLabel, selected, &galley.text)
|
||||||
});
|
});
|
||||||
|
|
||||||
let text_cursor = ui
|
let text_pos = ui
|
||||||
.layout()
|
.layout()
|
||||||
.align_size_within_rect(galley.size, rect.shrink2(button_padding))
|
.align_size_within_rect(galley.size, rect.shrink2(button_padding))
|
||||||
.min;
|
.min;
|
||||||
|
|
@ -93,7 +93,7 @@ impl Widget for SelectableLabel {
|
||||||
.visuals
|
.visuals
|
||||||
.override_text_color
|
.override_text_color
|
||||||
.unwrap_or_else(|| visuals.text_color());
|
.unwrap_or_else(|| visuals.text_color());
|
||||||
ui.painter().galley(text_cursor, galley, text_color);
|
ui.painter().galley(text_pos, galley, text_color);
|
||||||
response
|
response
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -678,7 +678,7 @@ impl<'t, S: TextBuffer> TextEdit<'t, S> {
|
||||||
if ui.memory().has_focus(id) {
|
if ui.memory().has_focus(id) {
|
||||||
{
|
{
|
||||||
let mut output = ui.ctx().output();
|
let mut output = ui.ctx().output();
|
||||||
output.text_cursor = text_cursor.map(|c| {
|
output.text_cursor_pos = text_cursor.map(|c| {
|
||||||
galley
|
galley
|
||||||
.pos_from_cursor(&c.primary)
|
.pos_from_cursor(&c.primary)
|
||||||
.translate(response.rect.min.to_vec2())
|
.translate(response.rect.min.to_vec2())
|
||||||
|
|
|
||||||
|
|
@ -381,7 +381,7 @@ pub fn handle_output(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(egui::Pos2 { x, y }) = output.text_cursor {
|
if let Some(egui::Pos2 { x, y }) = output.text_cursor_pos {
|
||||||
display
|
display
|
||||||
.gl_window()
|
.gl_window()
|
||||||
.window()
|
.window()
|
||||||
|
|
|
||||||
|
|
@ -141,7 +141,7 @@ pub struct AppRunner {
|
||||||
screen_reader: crate::screen_reader::ScreenReader,
|
screen_reader: crate::screen_reader::ScreenReader,
|
||||||
#[cfg(feature = "http")]
|
#[cfg(feature = "http")]
|
||||||
http: Arc<http::WebHttp>,
|
http: Arc<http::WebHttp>,
|
||||||
pub(crate) text_cursor: Option<egui::Pos2>,
|
pub(crate) last_text_cursor_pos: Option<egui::Pos2>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AppRunner {
|
impl AppRunner {
|
||||||
|
|
@ -160,7 +160,7 @@ impl AppRunner {
|
||||||
screen_reader: Default::default(),
|
screen_reader: Default::default(),
|
||||||
#[cfg(feature = "http")]
|
#[cfg(feature = "http")]
|
||||||
http: Arc::new(http::WebHttp {}),
|
http: Arc::new(http::WebHttp {}),
|
||||||
text_cursor: None,
|
last_text_cursor_pos: None,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -299,7 +299,7 @@ pub fn handle_output(output: &egui::Output, runner: &mut AppRunner) {
|
||||||
copied_text,
|
copied_text,
|
||||||
needs_repaint: _, // handled elsewhere
|
needs_repaint: _, // handled elsewhere
|
||||||
events: _, // we ignore these (TODO: accessibility screen reader)
|
events: _, // we ignore these (TODO: accessibility screen reader)
|
||||||
text_cursor: cursor,
|
text_cursor_pos,
|
||||||
} = output;
|
} = output;
|
||||||
|
|
||||||
set_cursor_icon(*cursor_icon);
|
set_cursor_icon(*cursor_icon);
|
||||||
|
|
@ -315,9 +315,9 @@ pub fn handle_output(output: &egui::Output, runner: &mut AppRunner) {
|
||||||
#[cfg(not(web_sys_unstable_apis))]
|
#[cfg(not(web_sys_unstable_apis))]
|
||||||
let _ = copied_text;
|
let _ = copied_text;
|
||||||
|
|
||||||
if &runner.text_cursor != cursor {
|
if &runner.last_text_cursor_pos != text_cursor_pos {
|
||||||
move_text_cursor(cursor, runner.canvas_id());
|
move_text_cursor(text_cursor_pos, runner.canvas_id());
|
||||||
runner.text_cursor = *cursor;
|
runner.last_text_cursor_pos = *text_cursor_pos;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1119,12 +1119,13 @@ fn is_mobile() -> Option<bool> {
|
||||||
Some(is_mobile)
|
Some(is_mobile)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move angnt to text cursor's position, on desktop/laptop, candidate window moves following text elemt(agent),
|
// Move text agent to text cursor's position, on desktop/laptop,
|
||||||
|
// candidate window moves following text element (agent),
|
||||||
// so it appears that the IME candidate window moves with text cursor.
|
// so it appears that the IME candidate window moves with text cursor.
|
||||||
// On mobile devices, there is no need to do that.
|
// On mobile devices, there is no need to do that.
|
||||||
fn move_text_cursor(cursor: &Option<egui::Pos2>, canvas_id: &str) -> Option<()> {
|
fn move_text_cursor(cursor: &Option<egui::Pos2>, canvas_id: &str) -> Option<()> {
|
||||||
let style = text_agent().style();
|
let style = text_agent().style();
|
||||||
// Note: movint agent on mobile devices will lead to unpreditable scroll.
|
// Note: movint agent on mobile devices will lead to unpredictable scroll.
|
||||||
if is_mobile() == Some(false) {
|
if is_mobile() == Some(false) {
|
||||||
cursor.as_ref().and_then(|&egui::Pos2 { x, y }| {
|
cursor.as_ref().and_then(|&egui::Pos2 { x, y }| {
|
||||||
let canvas = canvas_element(canvas_id)?;
|
let canvas = canvas_element(canvas_id)?;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue