summaryrefslogtreecommitdiffstats
path: root/wgpu
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-10-30 05:20:41 +0100
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-10-30 05:20:41 +0100
commit43f348dc4abc44baa3794ffd12cf080396aa958d (patch)
treeefc25a743c8627879a620db510ffc81f9c1c55fa /wgpu
parent1505d8f9413c3b0371b9735c3e2a465c1ec0ae92 (diff)
downloadiced-43f348dc4abc44baa3794ffd12cf080396aa958d.tar.gz
iced-43f348dc4abc44baa3794ffd12cf080396aa958d.tar.bz2
iced-43f348dc4abc44baa3794ffd12cf080396aa958d.zip
Show text cursor in `TextInput`
Diffstat (limited to 'wgpu')
-rw-r--r--wgpu/src/renderer/text_input.rs42
1 files changed, 40 insertions, 2 deletions
diff --git a/wgpu/src/renderer/text_input.rs b/wgpu/src/renderer/text_input.rs
index f7a93465..30e06878 100644
--- a/wgpu/src/renderer/text_input.rs
+++ b/wgpu/src/renderer/text_input.rs
@@ -54,6 +54,8 @@ impl text_input::Renderer for Renderer {
border_radius: 5,
};
+ let size = f32::from(text_input.size.unwrap_or(self.default_size()));
+
let value = Primitive::Clip {
bounds: text_bounds,
offset: 0,
@@ -82,7 +84,7 @@ impl text_input::Renderer for Renderer {
width: f32::INFINITY,
..text_bounds
},
- size: f32::from(text_input.size.unwrap_or(self.default_size())),
+ size,
horizontal_alignment: HorizontalAlignment::Left,
vertical_alignment: VerticalAlignment::Center,
}),
@@ -90,7 +92,43 @@ impl text_input::Renderer for Renderer {
(
Primitive::Group {
- primitives: vec![border, input, value],
+ primitives: if text_input.state.is_focused {
+ use wgpu_glyph::{GlyphCruncher, Scale, Section};
+
+ let mut text_value_width = self
+ .glyph_brush
+ .borrow_mut()
+ .glyph_bounds(Section {
+ text: &text_input.value,
+ bounds: (f32::INFINITY, text_bounds.height),
+ scale: Scale { x: size, y: size },
+ ..Default::default()
+ })
+ .map(|bounds| bounds.width().round())
+ .unwrap_or(0.0);
+
+ let spaces_at_the_end = text_input.value.len()
+ - text_input.value.trim_end().len();
+
+ if spaces_at_the_end > 0 {
+ text_value_width += spaces_at_the_end as f32 * 5.0;
+ }
+
+ let cursor = Primitive::Quad {
+ bounds: Rectangle {
+ x: text_bounds.x + text_value_width,
+ y: text_bounds.y,
+ width: 1.0,
+ height: text_bounds.height,
+ },
+ background: Background::Color(Color::BLACK),
+ border_radius: 0,
+ };
+
+ vec![border, input, value, cursor]
+ } else {
+ vec![border, input, value]
+ },
},
if is_mouse_over {
MouseCursor::Text