mirror of
https://github.com/emilk/egui.git
synced 2026-09-02 06:40:06 -04:00
Fix: problems pointed out by Copilot
https://github.com/emilk/egui/pull/8083#pullrequestreview-4364725473
This commit is contained in:
@@ -105,19 +105,17 @@ impl TextAgent {
|
|||||||
active_range_chars,
|
active_range_chars,
|
||||||
});
|
});
|
||||||
runner.input.raw.events.push(event);
|
runner.input.raw.events.push(event);
|
||||||
runner.needs_repaint.repaint_asap();
|
|
||||||
} else {
|
} else {
|
||||||
if text.is_empty() {
|
if text.is_empty() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if !event.is_composing() {
|
input.set_value("");
|
||||||
input.set_value("");
|
let event = egui::Event::Text(text);
|
||||||
let event = egui::Event::Text(text);
|
runner.input.raw.events.push(event);
|
||||||
runner.input.raw.events.push(event);
|
|
||||||
runner.needs_repaint.repaint_asap();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
runner.needs_repaint.repaint_asap();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -689,16 +689,25 @@ impl State {
|
|||||||
// See <https://github.com/rust-windowing/winit/issues/2498>
|
// See <https://github.com/rust-windowing/winit/issues/2498>
|
||||||
winit::event::Ime::Enabled | winit::event::Ime::Disabled => {}
|
winit::event::Ime::Enabled | winit::event::Ime::Disabled => {}
|
||||||
winit::event::Ime::Preedit(text, active_range_bytes) => {
|
winit::event::Ime::Preedit(text, active_range_bytes) => {
|
||||||
|
let active_range_chars = match active_range_bytes.clone() {
|
||||||
|
Some((start_bytes, end_bytes)) => {
|
||||||
|
let (Some(start_chars), Some(middle_chars)) = (
|
||||||
|
text.get(..start_bytes).map(|s| s.chars().count()),
|
||||||
|
text.get(start_bytes..end_bytes).map(|s| s.chars().count()),
|
||||||
|
) else {
|
||||||
|
log::warn!("{ime:?} is ignored due to invalid range");
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
Some(start_chars..start_chars + middle_chars)
|
||||||
|
}
|
||||||
|
None => None,
|
||||||
|
};
|
||||||
|
|
||||||
self.egui_input
|
self.egui_input
|
||||||
.events
|
.events
|
||||||
.push(egui::Event::Ime(egui::ImeEvent::Preedit {
|
.push(egui::Event::Ime(egui::ImeEvent::Preedit {
|
||||||
text: text.clone(),
|
text: text.clone(),
|
||||||
active_range_chars: active_range_bytes.map(|(start_bytes, end_bytes)| {
|
active_range_chars,
|
||||||
let start_char = text[..start_bytes].chars().count();
|
|
||||||
let end_char =
|
|
||||||
start_char + text[start_bytes..end_bytes].chars().count();
|
|
||||||
start_char..end_char
|
|
||||||
}),
|
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
winit::event::Ime::Commit(text) => {
|
winit::event::Ime::Commit(text) => {
|
||||||
|
|||||||
@@ -1641,7 +1641,7 @@ impl ImeComposition {
|
|||||||
color: active_underline_stroke.color.linear_multiply(0.5),
|
color: active_underline_stroke.color.linear_multiply(0.5),
|
||||||
};
|
};
|
||||||
Self {
|
Self {
|
||||||
active_underline_stroke: Stroke::new(2.0, Color32::from_rgb(192, 222, 255)),
|
active_underline_stroke,
|
||||||
inactive_underline_stroke,
|
inactive_underline_stroke,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -140,10 +140,27 @@ pub(crate) fn paint_ime_preedit_text_visuals(
|
|||||||
mut relative_active_range: Option<std::ops::Range<CCursor>>,
|
mut relative_active_range: Option<std::ops::Range<CCursor>>,
|
||||||
time_since_last_interaction: f64,
|
time_since_last_interaction: f64,
|
||||||
) {
|
) {
|
||||||
if preedit_range.is_empty() {
|
/// Instead of implementing [`PartialOrd`] and [`Ord`] for [`CCursor`] to
|
||||||
|
/// make [`std::ops::Range::is_empty`] available, we use this helper
|
||||||
|
/// function instead.
|
||||||
|
///
|
||||||
|
/// These traits are intentionally not implemented because
|
||||||
|
/// [`CCursor::prefer_next_row`] makes it difficult to define a clear
|
||||||
|
/// ordering between two [`CCursor`]s.
|
||||||
|
fn is_cursor_range_empty(range: &std::ops::Range<CCursor>) -> bool {
|
||||||
|
range.start.index == range.end.index
|
||||||
|
}
|
||||||
|
|
||||||
|
if is_cursor_range_empty(&preedit_range) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(relative_active_range) = &mut relative_active_range
|
||||||
|
&& relative_active_range.end.index > preedit_range.end.index - preedit_range.start.index
|
||||||
|
{
|
||||||
|
relative_active_range.end.index = preedit_range.end.index - preedit_range.start.index;
|
||||||
|
}
|
||||||
|
|
||||||
if matches!(ui.ctx().os(), crate::os::OperatingSystem::Windows)
|
if matches!(ui.ctx().os(), crate::os::OperatingSystem::Windows)
|
||||||
&& let Some(r) = &relative_active_range
|
&& let Some(r) = &relative_active_range
|
||||||
&& r.start.index == 0
|
&& r.start.index == 0
|
||||||
@@ -163,7 +180,7 @@ pub(crate) fn paint_ime_preedit_text_visuals(
|
|||||||
let inactive_underline_stroke = visuals.ime_composition.inactive_underline_stroke;
|
let inactive_underline_stroke = visuals.ime_composition.inactive_underline_stroke;
|
||||||
|
|
||||||
if let Some(relative_active_range) = &relative_active_range
|
if let Some(relative_active_range) = &relative_active_range
|
||||||
&& !relative_active_range.is_empty()
|
&& !is_cursor_range_empty(relative_active_range)
|
||||||
{
|
{
|
||||||
if relative_active_range.start.index > 0 {
|
if relative_active_range.start.index > 0 {
|
||||||
paint_underlines(
|
paint_underlines(
|
||||||
@@ -185,7 +202,9 @@ pub(crate) fn paint_ime_preedit_text_visuals(
|
|||||||
active_underline_stroke,
|
active_underline_stroke,
|
||||||
);
|
);
|
||||||
|
|
||||||
if relative_active_range.end < preedit_range.end - preedit_range.start.index {
|
if !is_cursor_range_empty(
|
||||||
|
&(relative_active_range.end..(preedit_range.end - preedit_range.start.index)),
|
||||||
|
) {
|
||||||
paint_underlines(
|
paint_underlines(
|
||||||
pos,
|
pos,
|
||||||
painter,
|
painter,
|
||||||
@@ -207,7 +226,7 @@ pub(crate) fn paint_ime_preedit_text_visuals(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(relative_active_range) = relative_active_range
|
if let Some(relative_active_range) = relative_active_range
|
||||||
&& relative_active_range.is_empty()
|
&& is_cursor_range_empty(&relative_active_range)
|
||||||
{
|
{
|
||||||
let active_cursor = preedit_range.start + relative_active_range.start.index;
|
let active_cursor = preedit_range.start + relative_active_range.start.index;
|
||||||
let cursor_rect = cursor_rect(galley, &active_cursor, row_height);
|
let cursor_rect = cursor_rect(galley, &active_cursor, row_height);
|
||||||
|
|||||||
Reference in New Issue
Block a user