summaryrefslogtreecommitdiffstats
path: root/wgpu
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-11-05 03:33:24 +0100
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-11-05 03:33:24 +0100
commita2161586dab6837d8c641b6f93ad476f861d8580 (patch)
treef8e5615166a5d5fa820a4d2acd9162e3a542b199 /wgpu
parent470266f54069a1c9b6147026d018b437b6457f7b (diff)
downloadiced-a2161586dab6837d8c641b6f93ad476f861d8580.tar.gz
iced-a2161586dab6837d8c641b6f93ad476f861d8580.tar.bz2
iced-a2161586dab6837d8c641b6f93ad476f861d8580.zip
Implement state-less scrolling in `TextInput`
Diffstat (limited to 'wgpu')
-rw-r--r--wgpu/src/renderer/text_input.rs121
1 files changed, 65 insertions, 56 deletions
diff --git a/wgpu/src/renderer/text_input.rs b/wgpu/src/renderer/text_input.rs
index 95ea964e..cff8bf23 100644
--- a/wgpu/src/renderer/text_input.rs
+++ b/wgpu/src/renderer/text_input.rs
@@ -87,70 +87,79 @@ impl text_input::Renderer for Renderer {
vertical_alignment: VerticalAlignment::Center,
};
- let content = Primitive::Clip {
- bounds: text_bounds,
- offset: Vector::new(0, 0),
- content: Box::new(if text_input.state.is_focused {
- use wgpu_glyph::{GlyphCruncher, Scale, Section};
-
- let text_before_cursor = &text_input
- .value
- .until(text_input.state.cursor_position(&text_input.value))
- .to_string();
-
- let mut text_value_width = self
- .glyph_brush
- .borrow_mut()
- .glyph_bounds(Section {
- text: text_before_cursor,
- 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_before_cursor.len()
- - text_before_cursor.trim_end().len();
-
- if spaces_at_the_end > 0 {
- let space_width = {
- let glyph_brush = self.glyph_brush.borrow();
-
- // TODO: Select appropriate font
- let font = &glyph_brush.fonts()[0];
-
- font.glyph(' ')
- .scaled(Scale { x: size, y: size })
- .h_metrics()
- .advance_width
- };
-
- text_value_width += spaces_at_the_end as f32 * space_width;
- }
-
- 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,
+ let (contents_primitive, offset) = if text_input.state.is_focused {
+ use wgpu_glyph::{GlyphCruncher, Scale, Section};
+
+ let text_before_cursor = &text_input
+ .value
+ .until(text_input.state.cursor_position(&text_input.value))
+ .to_string();
+
+ let mut text_value_width = self
+ .glyph_brush
+ .borrow_mut()
+ .glyph_bounds(Section {
+ text: text_before_cursor,
+ 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_before_cursor.len() - text_before_cursor.trim_end().len();
+
+ if spaces_at_the_end > 0 {
+ let space_width = {
+ let glyph_brush = self.glyph_brush.borrow();
+
+ // TODO: Select appropriate font
+ let font = &glyph_brush.fonts()[0];
+
+ font.glyph(' ')
+ .scaled(Scale { x: size, y: size })
+ .h_metrics()
+ .advance_width
};
+ text_value_width += spaces_at_the_end as f32 * space_width;
+ }
+
+ 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,
+ };
+
+ (
Primitive::Group {
primitives: vec![value, cursor],
- }
- } else {
- value
- }),
+ },
+ Vector::new(
+ ((text_value_width + 5.0) - text_bounds.width).max(0.0)
+ as u32,
+ 0,
+ ),
+ )
+ } else {
+ (value, Vector::new(0, 0))
+ };
+
+ let contents = Primitive::Clip {
+ bounds: text_bounds,
+ offset,
+ content: Box::new(contents_primitive),
};
(
Primitive::Group {
- primitives: vec![border, input, content],
+ primitives: vec![border, input, contents],
},
if is_mouse_over {
MouseCursor::Text