From b549b509c9454944dc629c4510b7f7e92ec21085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Fri, 10 Apr 2020 01:34:22 +0200 Subject: [PATCH 1/2] Align text in `iced_wgpu` on a case-by-case basis --- core/src/rectangle.rs | 26 ++++++++++++++++++++++++++ wgpu/src/renderer.rs | 25 ++++--------------------- wgpu/src/renderer/widget/checkbox.rs | 6 +++++- wgpu/src/renderer/widget/text.rs | 14 +++++++++++++- wgpu/src/renderer/widget/text_input.rs | 1 + 5 files changed, 49 insertions(+), 23 deletions(-) diff --git a/core/src/rectangle.rs b/core/src/rectangle.rs index 7ed3d2dfdd..aead6e9a55 100644 --- a/core/src/rectangle.rs +++ b/core/src/rectangle.rs @@ -17,6 +17,32 @@ pub struct Rectangle { } impl Rectangle { + /// Returns the [`Point`] at the center of the [`Rectangle`]. + /// + /// [`Point`]: struct.Point.html + /// [`Rectangle`]: struct.Rectangle.html + pub fn center(&self) -> Point { + Point::new(self.center_x(), self.center_y()) + } + + /// Returns the X coordinate of the [`Point`] at the center of the + /// [`Rectangle`]. + /// + /// [`Point`]: struct.Point.html + /// [`Rectangle`]: struct.Rectangle.html + pub fn center_x(&self) -> f32 { + self.x + self.width / 2.0 + } + + /// Returns the Y coordinate of the [`Point`] at the center of the + /// [`Rectangle`]. + /// + /// [`Point`]: struct.Point.html + /// [`Rectangle`]: struct.Rectangle.html + pub fn center_y(&self) -> f32 { + self.y + self.height / 2.0 + } + /// Returns true if the given [`Point`] is contained in the [`Rectangle`]. /// /// [`Point`]: struct.Point.html diff --git a/wgpu/src/renderer.rs b/wgpu/src/renderer.rs index e847cb64ed..c886bed006 100644 --- a/wgpu/src/renderer.rs +++ b/wgpu/src/renderer.rs @@ -152,31 +152,14 @@ impl Renderer { horizontal_alignment, vertical_alignment, } => { - let x = match horizontal_alignment { - iced_native::HorizontalAlignment::Left => bounds.x, - iced_native::HorizontalAlignment::Center => { - bounds.x + bounds.width / 2.0 - } - iced_native::HorizontalAlignment::Right => { - bounds.x + bounds.width - } - }; - - let y = match vertical_alignment { - iced_native::VerticalAlignment::Top => bounds.y, - iced_native::VerticalAlignment::Center => { - bounds.y + bounds.height / 2.0 - } - iced_native::VerticalAlignment::Bottom => { - bounds.y + bounds.height - } - }; - let layer = layers.last_mut().unwrap(); layer.text.push(wgpu_glyph::Section { text: &content, - screen_position: (x + translation.x, y + translation.y), + screen_position: ( + bounds.x + translation.x, + bounds.y + translation.y, + ), bounds: (bounds.width, bounds.height), scale: wgpu_glyph::Scale { x: *size, y: *size }, color: color.into_linear(), diff --git a/wgpu/src/renderer/widget/checkbox.rs b/wgpu/src/renderer/widget/checkbox.rs index ecacf1dea9..c0f1bf2159 100644 --- a/wgpu/src/renderer/widget/checkbox.rs +++ b/wgpu/src/renderer/widget/checkbox.rs @@ -38,7 +38,11 @@ impl checkbox::Renderer for Renderer { content: crate::text::CHECKMARK_ICON.to_string(), font: crate::text::BUILTIN_ICONS, size: bounds.height * 0.7, - bounds, + bounds: Rectangle { + x: bounds.center_x(), + y: bounds.center_y(), + ..bounds + }, color: style.checkmark_color, horizontal_alignment: HorizontalAlignment::Center, vertical_alignment: VerticalAlignment::Center, diff --git a/wgpu/src/renderer/widget/text.rs b/wgpu/src/renderer/widget/text.rs index 33e549cd40..80bff574ce 100644 --- a/wgpu/src/renderer/widget/text.rs +++ b/wgpu/src/renderer/widget/text.rs @@ -31,11 +31,23 @@ impl text::Renderer for Renderer { horizontal_alignment: HorizontalAlignment, vertical_alignment: VerticalAlignment, ) -> Self::Output { + let x = match horizontal_alignment { + iced_native::HorizontalAlignment::Left => bounds.x, + iced_native::HorizontalAlignment::Center => bounds.center_x(), + iced_native::HorizontalAlignment::Right => bounds.x + bounds.width, + }; + + let y = match vertical_alignment { + iced_native::VerticalAlignment::Top => bounds.y, + iced_native::VerticalAlignment::Center => bounds.center_y(), + iced_native::VerticalAlignment::Bottom => bounds.y + bounds.height, + }; + ( Primitive::Text { content: content.to_string(), size: f32::from(size), - bounds, + bounds: Rectangle { x, y, ..bounds }, color: color.unwrap_or(defaults.text.color), font, horizontal_alignment, diff --git a/wgpu/src/renderer/widget/text_input.rs b/wgpu/src/renderer/widget/text_input.rs index 1f804a1a8f..6f72db68e6 100644 --- a/wgpu/src/renderer/widget/text_input.rs +++ b/wgpu/src/renderer/widget/text_input.rs @@ -109,6 +109,7 @@ impl text_input::Renderer for Renderer { }, font, bounds: Rectangle { + y: text_bounds.center_y(), width: f32::INFINITY, ..text_bounds }, From 47d44af348db79735233e408b1560661b9f96960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Fri, 10 Apr 2020 02:49:04 +0200 Subject: [PATCH 2/2] Fix `bezier_tool` placeholder text alignment --- examples/bezier_tool/src/main.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/examples/bezier_tool/src/main.rs b/examples/bezier_tool/src/main.rs index c3fbf2762a..fcb7733c14 100644 --- a/examples/bezier_tool/src/main.rs +++ b/examples/bezier_tool/src/main.rs @@ -12,8 +12,8 @@ mod bezier { // implemented by `iced_wgpu` and other renderers. use iced_native::{ input, layout, Clipboard, Color, Element, Event, Font, Hasher, - HorizontalAlignment, Layout, Length, MouseCursor, Point, Size, Vector, - VerticalAlignment, Widget, + HorizontalAlignment, Layout, Length, MouseCursor, Point, Rectangle, + Size, Vector, VerticalAlignment, Widget, }; use iced_wgpu::{ triangle::{Mesh2D, Vertex2D}, @@ -189,7 +189,11 @@ mod bezier { && self.state.pending.is_none() { let instructions = Primitive::Text { - bounds, + bounds: Rectangle { + x: bounds.center_x(), + y: bounds.center_y(), + ..bounds + }, color: Color { a: defaults.text.color.a * 0.7, ..defaults.text.color