Introduce first-class text module in iced_native

This commit is contained in:
Héctor Ramón Jiménez 2021-10-31 16:13:03 +07:00
parent 0aafcde0ef
commit b3a01973c6
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
16 changed files with 87 additions and 88 deletions

View file

@ -5,7 +5,7 @@ use iced_graphics::font;
use glow_glyph::ab_glyph; use glow_glyph::ab_glyph;
use std::{cell::RefCell, collections::HashMap}; use std::{cell::RefCell, collections::HashMap};
pub use iced_native::widget::text::Hit; pub use iced_native::text::Hit;
#[derive(Debug)] #[derive(Debug)]
pub struct Pipeline { pub struct Pipeline {

View file

@ -1,7 +1,7 @@
//! Write a graphics backend. //! Write a graphics backend.
use iced_native::text;
use iced_native::widget::image; use iced_native::widget::image;
use iced_native::widget::svg; use iced_native::widget::svg;
use iced_native::widget::text;
use iced_native::{Font, Point, Size}; use iced_native::{Font, Point, Size};
/// The graphics backend of a [`Renderer`]. /// The graphics backend of a [`Renderer`].

View file

@ -2,6 +2,7 @@ use crate::backend::{self, Backend};
use crate::{Primitive, Vector}; use crate::{Primitive, Vector};
use iced_native::layout; use iced_native::layout;
use iced_native::renderer; use iced_native::renderer;
use iced_native::text::{self, Text};
use iced_native::{Element, Font, Point, Rectangle, Size}; use iced_native::{Element, Font, Point, Rectangle, Size};
pub use iced_native::renderer::Style; pub use iced_native::renderer::Style;
@ -104,7 +105,7 @@ where
} }
} }
impl<B> renderer::Text for Renderer<B> impl<B> text::Renderer for Renderer<B>
where where
B: Backend + backend::Text, B: Backend + backend::Text,
{ {
@ -137,7 +138,7 @@ where
bounds: Size, bounds: Size,
point: Point, point: Point,
nearest_only: bool, nearest_only: bool,
) -> Option<renderer::text::Hit> { ) -> Option<text::Hit> {
self.backend().hit_test( self.backend().hit_test(
content, content,
size, size,
@ -148,7 +149,7 @@ where
) )
} }
fn fill_text(&mut self, text: renderer::text::Section<'_, Self::Font>) { fn fill_text(&mut self, text: Text<'_, Self::Font>) {
self.primitives.push(Primitive::Text { self.primitives.push(Primitive::Text {
content: text.content.to_string(), content: text.content.to_string(),
bounds: text.bounds, bounds: text.bounds,

View file

@ -43,6 +43,7 @@ pub mod overlay;
pub mod program; pub mod program;
pub mod renderer; pub mod renderer;
pub mod subscription; pub mod subscription;
pub mod text;
pub mod touch; pub mod touch;
pub mod widget; pub mod widget;
pub mod window; pub mod window;

View file

@ -5,7 +5,7 @@ use crate::layout;
use crate::mouse; use crate::mouse;
use crate::overlay; use crate::overlay;
use crate::renderer; use crate::renderer;
use crate::renderer::text; use crate::text::{self, Text};
use crate::touch; use crate::touch;
use crate::widget::scrollable::{self, Scrollable}; use crate::widget::scrollable::{self, Scrollable};
use crate::widget::Container; use crate::widget::Container;
@ -18,7 +18,7 @@ pub use iced_style::menu::Style;
/// A list of selectable options. /// A list of selectable options.
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
pub struct Menu<'a, T, Renderer: renderer::Text> { pub struct Menu<'a, T, Renderer: text::Renderer> {
state: &'a mut State, state: &'a mut State,
options: &'a [T], options: &'a [T],
hovered_option: &'a mut Option<usize>, hovered_option: &'a mut Option<usize>,
@ -33,7 +33,7 @@ pub struct Menu<'a, T, Renderer: renderer::Text> {
impl<'a, T, Renderer> Menu<'a, T, Renderer> impl<'a, T, Renderer> Menu<'a, T, Renderer>
where where
T: ToString + Clone, T: ToString + Clone,
Renderer: renderer::Text + 'a, Renderer: text::Renderer + 'a,
{ {
/// Creates a new [`Menu`] with the given [`State`], a list of options, and /// Creates a new [`Menu`] with the given [`State`], a list of options, and
/// the message to produced when an option is selected. /// the message to produced when an option is selected.
@ -117,14 +117,14 @@ impl State {
} }
} }
struct Overlay<'a, Message, Renderer: renderer::Text> { struct Overlay<'a, Message, Renderer: text::Renderer> {
container: Container<'a, Message, Renderer>, container: Container<'a, Message, Renderer>,
width: u16, width: u16,
target_height: f32, target_height: f32,
style: Style, style: Style,
} }
impl<'a, Message, Renderer: renderer::Text> Overlay<'a, Message, Renderer> impl<'a, Message, Renderer: text::Renderer> Overlay<'a, Message, Renderer>
where where
Message: 'a, Message: 'a,
Renderer: 'a, Renderer: 'a,
@ -169,7 +169,7 @@ where
impl<'a, Message, Renderer> crate::Overlay<Message, Renderer> impl<'a, Message, Renderer> crate::Overlay<Message, Renderer>
for Overlay<'a, Message, Renderer> for Overlay<'a, Message, Renderer>
where where
Renderer: renderer::Text, Renderer: text::Renderer,
{ {
fn layout( fn layout(
&self, &self,
@ -266,7 +266,7 @@ where
} }
} }
struct List<'a, T, Renderer: renderer::Text> { struct List<'a, T, Renderer: text::Renderer> {
options: &'a [T], options: &'a [T],
hovered_option: &'a mut Option<usize>, hovered_option: &'a mut Option<usize>,
last_selection: &'a mut Option<T>, last_selection: &'a mut Option<T>,
@ -280,7 +280,7 @@ impl<'a, T, Message, Renderer> Widget<Message, Renderer>
for List<'a, T, Renderer> for List<'a, T, Renderer>
where where
T: Clone + ToString, T: Clone + ToString,
Renderer: renderer::Text, Renderer: text::Renderer,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
Length::Fill Length::Fill
@ -441,7 +441,7 @@ where
}); });
} }
renderer.fill_text(text::Section { renderer.fill_text(Text {
content: &option.to_string(), content: &option.to_string(),
bounds: Rectangle { bounds: Rectangle {
x: bounds.x + self.padding.left as f32, x: bounds.x + self.padding.left as f32,
@ -468,7 +468,7 @@ impl<'a, T, Message, Renderer> Into<Element<'a, Message, Renderer>>
where where
T: ToString + Clone, T: ToString + Clone,
Message: 'a, Message: 'a,
Renderer: 'a + renderer::Text, Renderer: 'a + text::Renderer,
{ {
fn into(self) -> Element<'a, Message, Renderer> { fn into(self) -> Element<'a, Message, Renderer> {
Element::new(self) Element::new(self)

View file

@ -19,10 +19,6 @@
//! [`text::Renderer`]: crate::widget::text::Renderer //! [`text::Renderer`]: crate::widget::text::Renderer
//! [`Checkbox`]: crate::widget::Checkbox //! [`Checkbox`]: crate::widget::Checkbox
//! [`checkbox::Renderer`]: crate::widget::checkbox::Renderer //! [`checkbox::Renderer`]: crate::widget::checkbox::Renderer
pub mod text;
pub use text::Text;
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
mod null; mod null;
#[cfg(debug_assertions)] #[cfg(debug_assertions)]

View file

@ -1,5 +1,5 @@
use crate::renderer::{self, Renderer}; use crate::renderer::{self, Renderer};
use crate::widget::text; use crate::text::{self, Text};
use crate::{Font, Point, Rectangle, Size, Vector}; use crate::{Font, Point, Rectangle, Size, Vector};
/// A renderer that does nothing. /// A renderer that does nothing.
@ -30,7 +30,7 @@ impl Renderer for Null {
fn fill_rectangle(&mut self, _quad: renderer::Quad) {} fn fill_rectangle(&mut self, _quad: renderer::Quad) {}
} }
impl renderer::Text for Null { impl text::Renderer for Null {
type Font = Font; type Font = Font;
const ICON_FONT: Font = Font::Default; const ICON_FONT: Font = Font::Default;
@ -63,5 +63,5 @@ impl renderer::Text for Null {
None None
} }
fn fill_text(&mut self, _text: renderer::text::Section<'_, Self::Font>) {} fn fill_text(&mut self, _text: Text<'_, Self::Font>) {}
} }

View file

@ -1,9 +1,20 @@
use crate::alignment; use crate::alignment;
use crate::{Color, Point, Rectangle, Renderer, Size}; use crate::{Color, Point, Rectangle, Size};
pub use crate::widget::text::Hit; pub use iced_core::text::Hit;
pub trait Text: Renderer { #[derive(Debug, Clone, Copy)]
pub struct Text<'a, Font> {
pub content: &'a str,
pub bounds: Rectangle,
pub size: f32,
pub color: Color,
pub font: Font,
pub horizontal_alignment: alignment::Horizontal,
pub vertical_alignment: alignment::Vertical,
}
pub trait Renderer: crate::Renderer {
/// The font type used. /// The font type used.
type Font: Default + Copy; type Font: Default + Copy;
@ -56,16 +67,5 @@ pub trait Text: Renderer {
nearest_only: bool, nearest_only: bool,
) -> Option<Hit>; ) -> Option<Hit>;
fn fill_text(&mut self, section: Section<'_, Self::Font>); fn fill_text(&mut self, text: Text<'_, Self::Font>);
}
#[derive(Debug, Clone, Copy)]
pub struct Section<'a, Font> {
pub content: &'a str,
pub bounds: Rectangle,
pub size: f32,
pub color: Color,
pub font: Font,
pub horizontal_alignment: alignment::Horizontal,
pub vertical_alignment: alignment::Vertical,
} }

View file

@ -6,9 +6,9 @@ use crate::event::{self, Event};
use crate::layout; use crate::layout;
use crate::mouse; use crate::mouse;
use crate::renderer; use crate::renderer;
use crate::text;
use crate::touch; use crate::touch;
use crate::widget::text; use crate::widget::{self, Row, Text};
use crate::widget::{Row, Text};
use crate::{ use crate::{
Alignment, Clipboard, Color, Element, Hasher, Layout, Length, Point, Alignment, Clipboard, Color, Element, Hasher, Layout, Length, Point,
Rectangle, Widget, Rectangle, Widget,
@ -34,7 +34,7 @@ pub use iced_style::checkbox::{Style, StyleSheet};
/// ///
/// ![Checkbox drawn by `iced_wgpu`](https://github.com/hecrj/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/checkbox.png?raw=true) /// ![Checkbox drawn by `iced_wgpu`](https://github.com/hecrj/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/checkbox.png?raw=true)
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
pub struct Checkbox<'a, Message, Renderer: renderer::Text> { pub struct Checkbox<'a, Message, Renderer: text::Renderer> {
is_checked: bool, is_checked: bool,
on_toggle: Box<dyn Fn(bool) -> Message>, on_toggle: Box<dyn Fn(bool) -> Message>,
label: String, label: String,
@ -47,7 +47,7 @@ pub struct Checkbox<'a, Message, Renderer: renderer::Text> {
style_sheet: &'a dyn StyleSheet, style_sheet: &'a dyn StyleSheet,
} }
impl<'a, Message, Renderer: renderer::Text> Checkbox<'a, Message, Renderer> { impl<'a, Message, Renderer: text::Renderer> Checkbox<'a, Message, Renderer> {
/// The default size of a [`Checkbox`]. /// The default size of a [`Checkbox`].
const DEFAULT_SIZE: u16 = 20; const DEFAULT_SIZE: u16 = 20;
@ -128,7 +128,7 @@ impl<'a, Message, Renderer: renderer::Text> Checkbox<'a, Message, Renderer> {
impl<'a, Message, Renderer> Widget<Message, Renderer> impl<'a, Message, Renderer> Widget<Message, Renderer>
for Checkbox<'a, Message, Renderer> for Checkbox<'a, Message, Renderer>
where where
Renderer: renderer::Text, Renderer: text::Renderer,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
self.width self.width
@ -232,7 +232,7 @@ where
}); });
if self.is_checked { if self.is_checked {
renderer.fill_text(renderer::text::Section { renderer.fill_text(text::Text {
content: &Renderer::CHECKMARK_ICON.to_string(), content: &Renderer::CHECKMARK_ICON.to_string(),
font: Renderer::ICON_FONT, font: Renderer::ICON_FONT,
size: bounds.height * 0.7, size: bounds.height * 0.7,
@ -251,7 +251,7 @@ where
{ {
let label_layout = children.next().unwrap(); let label_layout = children.next().unwrap();
text::draw( widget::text::draw(
renderer, renderer,
style, style,
label_layout, label_layout,
@ -276,7 +276,7 @@ where
impl<'a, Message, Renderer> From<Checkbox<'a, Message, Renderer>> impl<'a, Message, Renderer> From<Checkbox<'a, Message, Renderer>>
for Element<'a, Message, Renderer> for Element<'a, Message, Renderer>
where where
Renderer: 'a + renderer::Text, Renderer: 'a + text::Renderer,
Message: 'a, Message: 'a,
{ {
fn from( fn from(

View file

@ -7,7 +7,7 @@ use crate::mouse;
use crate::overlay; use crate::overlay;
use crate::overlay::menu::{self, Menu}; use crate::overlay::menu::{self, Menu};
use crate::renderer; use crate::renderer;
use crate::renderer::text; use crate::text::{self, Text};
use crate::touch; use crate::touch;
use crate::{ use crate::{
Clipboard, Element, Hasher, Layout, Length, Padding, Point, Rectangle, Clipboard, Element, Hasher, Layout, Length, Padding, Point, Rectangle,
@ -19,7 +19,7 @@ pub use iced_style::pick_list::{Style, StyleSheet};
/// A widget for selecting a single value from a list of options. /// A widget for selecting a single value from a list of options.
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
pub struct PickList<'a, T, Message, Renderer: renderer::Text> pub struct PickList<'a, T, Message, Renderer: text::Renderer>
where where
[T]: ToOwned<Owned = Vec<T>>, [T]: ToOwned<Owned = Vec<T>>,
{ {
@ -61,7 +61,7 @@ impl<T> Default for State<T> {
} }
} }
impl<'a, T: 'a, Message, Renderer: renderer::Text> impl<'a, T: 'a, Message, Renderer: text::Renderer>
PickList<'a, T, Message, Renderer> PickList<'a, T, Message, Renderer>
where where
T: ToString + Eq, T: ToString + Eq,
@ -151,7 +151,7 @@ where
T: Clone + ToString + Eq, T: Clone + ToString + Eq,
[T]: ToOwned<Owned = Vec<T>>, [T]: ToOwned<Owned = Vec<T>>,
Message: 'static, Message: 'static,
Renderer: renderer::Text + 'a, Renderer: text::Renderer + 'a,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
self.width self.width
@ -368,7 +368,7 @@ where
border_radius: style.border_radius, border_radius: style.border_radius,
}); });
renderer.fill_text(text::Section { renderer.fill_text(Text {
content: &Renderer::ARROW_DOWN_ICON.to_string(), content: &Renderer::ARROW_DOWN_ICON.to_string(),
font: Renderer::ICON_FONT, font: Renderer::ICON_FONT,
size: bounds.height * style.icon_size, size: bounds.height * style.icon_size,
@ -390,7 +390,7 @@ where
.as_ref() .as_ref()
.or_else(|| self.placeholder.as_ref()) .or_else(|| self.placeholder.as_ref())
{ {
renderer.fill_text(text::Section { renderer.fill_text(Text {
content: label, content: label,
size: f32::from( size: f32::from(
self.text_size.unwrap_or(renderer.default_size()), self.text_size.unwrap_or(renderer.default_size()),
@ -444,7 +444,7 @@ impl<'a, T: 'a, Message, Renderer> Into<Element<'a, Message, Renderer>>
where where
T: Clone + ToString + Eq, T: Clone + ToString + Eq,
[T]: ToOwned<Owned = Vec<T>>, [T]: ToOwned<Owned = Vec<T>>,
Renderer: renderer::Text + 'a, Renderer: text::Renderer + 'a,
Message: 'static, Message: 'static,
{ {
fn into(self) -> Element<'a, Message, Renderer> { fn into(self) -> Element<'a, Message, Renderer> {

View file

@ -6,9 +6,9 @@ use crate::event::{self, Event};
use crate::layout; use crate::layout;
use crate::mouse; use crate::mouse;
use crate::renderer; use crate::renderer;
use crate::text;
use crate::touch; use crate::touch;
use crate::widget::text; use crate::widget::{self, Row, Text};
use crate::widget::{Row, Text};
use crate::{ use crate::{
Alignment, Background, Clipboard, Color, Element, Hasher, Layout, Length, Alignment, Background, Clipboard, Color, Element, Hasher, Layout, Length,
Point, Rectangle, Widget, Point, Rectangle, Widget,
@ -43,7 +43,7 @@ pub use iced_style::radio::{Style, StyleSheet};
/// ///
/// ![Radio buttons drawn by `iced_wgpu`](https://github.com/hecrj/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/radio.png?raw=true) /// ![Radio buttons drawn by `iced_wgpu`](https://github.com/hecrj/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/radio.png?raw=true)
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
pub struct Radio<'a, Message, Renderer: renderer::Text> { pub struct Radio<'a, Message, Renderer: text::Renderer> {
is_selected: bool, is_selected: bool,
on_click: Message, on_click: Message,
label: String, label: String,
@ -56,7 +56,7 @@ pub struct Radio<'a, Message, Renderer: renderer::Text> {
style_sheet: &'a dyn StyleSheet, style_sheet: &'a dyn StyleSheet,
} }
impl<'a, Message, Renderer: renderer::Text> Radio<'a, Message, Renderer> impl<'a, Message, Renderer: text::Renderer> Radio<'a, Message, Renderer>
where where
Message: Clone, Message: Clone,
{ {
@ -145,7 +145,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
for Radio<'a, Message, Renderer> for Radio<'a, Message, Renderer>
where where
Message: Clone, Message: Clone,
Renderer: renderer::Text, Renderer: text::Renderer,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
self.width self.width
@ -267,7 +267,7 @@ where
{ {
let label_layout = children.next().unwrap(); let label_layout = children.next().unwrap();
text::draw( widget::text::draw(
renderer, renderer,
style, style,
label_layout, label_layout,
@ -293,7 +293,7 @@ impl<'a, Message, Renderer> From<Radio<'a, Message, Renderer>>
for Element<'a, Message, Renderer> for Element<'a, Message, Renderer>
where where
Message: 'a + Clone, Message: 'a + Clone,
Renderer: 'a + renderer::Text, Renderer: 'a + text::Renderer,
{ {
fn from( fn from(
radio: Radio<'a, Message, Renderer>, radio: Radio<'a, Message, Renderer>,

View file

@ -2,12 +2,11 @@
use crate::alignment; use crate::alignment;
use crate::layout; use crate::layout;
use crate::renderer; use crate::renderer;
use crate::text;
use crate::{ use crate::{
Color, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget, Color, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget,
}; };
pub use iced_core::text::Hit;
use std::hash::Hash; use std::hash::Hash;
/// A paragraph of text. /// A paragraph of text.
@ -24,7 +23,7 @@ use std::hash::Hash;
/// ///
/// ![Text drawn by `iced_wgpu`](https://github.com/hecrj/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/text.png?raw=true) /// ![Text drawn by `iced_wgpu`](https://github.com/hecrj/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/text.png?raw=true)
#[derive(Debug)] #[derive(Debug)]
pub struct Text<Renderer: renderer::Text> { pub struct Text<Renderer: text::Renderer> {
content: String, content: String,
size: Option<u16>, size: Option<u16>,
color: Option<Color>, color: Option<Color>,
@ -35,7 +34,7 @@ pub struct Text<Renderer: renderer::Text> {
vertical_alignment: alignment::Vertical, vertical_alignment: alignment::Vertical,
} }
impl<Renderer: renderer::Text> Text<Renderer> { impl<Renderer: text::Renderer> Text<Renderer> {
/// Create a new fragment of [`Text`] with the given contents. /// Create a new fragment of [`Text`] with the given contents.
pub fn new<T: Into<String>>(label: T) -> Self { pub fn new<T: Into<String>>(label: T) -> Self {
Text { Text {
@ -103,7 +102,7 @@ impl<Renderer: renderer::Text> Text<Renderer> {
impl<Message, Renderer> Widget<Message, Renderer> for Text<Renderer> impl<Message, Renderer> Widget<Message, Renderer> for Text<Renderer>
where where
Renderer: renderer::Text, Renderer: text::Renderer,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
self.width self.width
@ -175,7 +174,7 @@ pub fn draw<Renderer>(
horizontal_alignment: alignment::Horizontal, horizontal_alignment: alignment::Horizontal,
vertical_alignment: alignment::Vertical, vertical_alignment: alignment::Vertical,
) where ) where
Renderer: renderer::Text, Renderer: text::Renderer,
{ {
let bounds = layout.bounds(); let bounds = layout.bounds();
@ -191,7 +190,7 @@ pub fn draw<Renderer>(
alignment::Vertical::Bottom => bounds.y + bounds.height, alignment::Vertical::Bottom => bounds.y + bounds.height,
}; };
renderer.fill_text(renderer::text::Section { renderer.fill_text(crate::text::Text {
content, content,
size: f32::from(size.unwrap_or(renderer.default_size())), size: f32::from(size.unwrap_or(renderer.default_size())),
bounds: Rectangle { x, y, ..bounds }, bounds: Rectangle { x, y, ..bounds },
@ -205,14 +204,14 @@ pub fn draw<Renderer>(
impl<'a, Message, Renderer> From<Text<Renderer>> impl<'a, Message, Renderer> From<Text<Renderer>>
for Element<'a, Message, Renderer> for Element<'a, Message, Renderer>
where where
Renderer: renderer::Text + 'a, Renderer: text::Renderer + 'a,
{ {
fn from(text: Text<Renderer>) -> Element<'a, Message, Renderer> { fn from(text: Text<Renderer>) -> Element<'a, Message, Renderer> {
Element::new(text) Element::new(text)
} }
} }
impl<Renderer: renderer::Text> Clone for Text<Renderer> { impl<Renderer: text::Renderer> Clone for Text<Renderer> {
fn clone(&self) -> Self { fn clone(&self) -> Self {
Self { Self {
content: self.content.clone(), content: self.content.clone(),

View file

@ -17,6 +17,7 @@ use crate::keyboard;
use crate::layout; use crate::layout;
use crate::mouse::{self, click}; use crate::mouse::{self, click};
use crate::renderer; use crate::renderer;
use crate::text::{self, Text};
use crate::touch; use crate::touch;
use crate::{ use crate::{
Background, Clipboard, Color, Element, Hasher, Layout, Length, Padding, Background, Clipboard, Color, Element, Hasher, Layout, Length, Padding,
@ -53,7 +54,7 @@ pub use iced_style::text_input::{Style, StyleSheet};
/// ``` /// ```
/// ![Text input drawn by `iced_wgpu`](https://github.com/hecrj/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/text_input.png?raw=true) /// ![Text input drawn by `iced_wgpu`](https://github.com/hecrj/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/text_input.png?raw=true)
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
pub struct TextInput<'a, Message, Renderer: renderer::Text> { pub struct TextInput<'a, Message, Renderer: text::Renderer> {
state: &'a mut State, state: &'a mut State,
placeholder: String, placeholder: String,
value: Value, value: Value,
@ -71,7 +72,7 @@ pub struct TextInput<'a, Message, Renderer: renderer::Text> {
impl<'a, Message, Renderer> TextInput<'a, Message, Renderer> impl<'a, Message, Renderer> TextInput<'a, Message, Renderer>
where where
Message: Clone, Message: Clone,
Renderer: renderer::Text, Renderer: text::Renderer,
{ {
/// Creates a new [`TextInput`]. /// Creates a new [`TextInput`].
/// ///
@ -166,7 +167,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
for TextInput<'a, Message, Renderer> for TextInput<'a, Message, Renderer>
where where
Message: Clone, Message: Clone,
Renderer: renderer::Text, Renderer: text::Renderer,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
self.width self.width
@ -728,7 +729,7 @@ where
renderer.fill_rectangle(cursor); renderer.fill_rectangle(cursor);
} }
renderer.fill_text(renderer::text::Section { renderer.fill_text(Text {
content: if text.is_empty() { content: if text.is_empty() {
&self.placeholder &self.placeholder
} else { } else {
@ -776,7 +777,7 @@ impl<'a, Message, Renderer> From<TextInput<'a, Message, Renderer>>
for Element<'a, Message, Renderer> for Element<'a, Message, Renderer>
where where
Message: 'a + Clone, Message: 'a + Clone,
Renderer: 'a + renderer::Text, Renderer: 'a + text::Renderer,
{ {
fn from( fn from(
text_input: TextInput<'a, Message, Renderer>, text_input: TextInput<'a, Message, Renderer>,
@ -877,7 +878,7 @@ fn offset<Renderer>(
state: &State, state: &State,
) -> f32 ) -> f32
where where
Renderer: renderer::Text, Renderer: text::Renderer,
{ {
if state.is_focused() { if state.is_focused() {
let cursor = state.cursor(); let cursor = state.cursor();
@ -911,7 +912,7 @@ fn measure_cursor_and_scroll_offset<Renderer>(
font: Renderer::Font, font: Renderer::Font,
) -> (f32, f32) ) -> (f32, f32)
where where
Renderer: renderer::Text, Renderer: text::Renderer,
{ {
let text_before_cursor = value.until(cursor_index).to_string(); let text_before_cursor = value.until(cursor_index).to_string();
@ -935,7 +936,7 @@ fn find_cursor_position<Renderer>(
x: f32, x: f32,
) -> Option<usize> ) -> Option<usize>
where where
Renderer: renderer::Text, Renderer: text::Renderer,
{ {
let size = size.unwrap_or(renderer.default_size()); let size = size.unwrap_or(renderer.default_size());
@ -950,5 +951,5 @@ where
Point::new(x + offset, text_bounds.height / 2.0), Point::new(x + offset, text_bounds.height / 2.0),
true, true,
) )
.map(renderer::text::Hit::cursor) .map(text::Hit::cursor)
} }

View file

@ -6,7 +6,7 @@ use crate::event;
use crate::layout; use crate::layout;
use crate::mouse; use crate::mouse;
use crate::renderer; use crate::renderer;
use crate::widget::text; use crate::text;
use crate::widget::{Row, Text}; use crate::widget::{Row, Text};
use crate::{ use crate::{
Alignment, Clipboard, Element, Event, Hasher, Layout, Length, Point, Alignment, Clipboard, Element, Event, Hasher, Layout, Length, Point,
@ -31,7 +31,7 @@ pub use iced_style::toggler::{Style, StyleSheet};
/// Toggler::new(is_active, String::from("Toggle me!"), |b| Message::TogglerToggled(b)); /// Toggler::new(is_active, String::from("Toggle me!"), |b| Message::TogglerToggled(b));
/// ``` /// ```
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
pub struct Toggler<Message, Renderer: renderer::Text> { pub struct Toggler<Message, Renderer: text::Renderer> {
is_active: bool, is_active: bool,
on_toggle: Box<dyn Fn(bool) -> Message>, on_toggle: Box<dyn Fn(bool) -> Message>,
label: Option<String>, label: Option<String>,
@ -44,7 +44,7 @@ pub struct Toggler<Message, Renderer: renderer::Text> {
style_sheet: Box<dyn StyleSheet>, style_sheet: Box<dyn StyleSheet>,
} }
impl<Message, Renderer: renderer::Text> Toggler<Message, Renderer> { impl<Message, Renderer: text::Renderer> Toggler<Message, Renderer> {
/// The default size of a [`Toggler`]. /// The default size of a [`Toggler`].
pub const DEFAULT_SIZE: u16 = 20; pub const DEFAULT_SIZE: u16 = 20;
@ -126,7 +126,7 @@ impl<Message, Renderer: renderer::Text> Toggler<Message, Renderer> {
impl<Message, Renderer> Widget<Message, Renderer> for Toggler<Message, Renderer> impl<Message, Renderer> Widget<Message, Renderer> for Toggler<Message, Renderer>
where where
Renderer: renderer::Text, Renderer: text::Renderer,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
self.width self.width
@ -223,7 +223,7 @@ where
if let Some(label) = &self.label { if let Some(label) = &self.label {
let label_layout = children.next().unwrap(); let label_layout = children.next().unwrap();
text::draw( crate::widget::text::draw(
renderer, renderer,
style, style,
label_layout, label_layout,
@ -297,7 +297,7 @@ where
impl<'a, Message, Renderer> From<Toggler<Message, Renderer>> impl<'a, Message, Renderer> From<Toggler<Message, Renderer>>
for Element<'a, Message, Renderer> for Element<'a, Message, Renderer>
where where
Renderer: 'a + renderer::Text, Renderer: 'a + text::Renderer,
Message: 'a, Message: 'a,
{ {
fn from( fn from(

View file

@ -6,6 +6,7 @@ use iced_core::Rectangle;
use crate::event; use crate::event;
use crate::layout; use crate::layout;
use crate::renderer; use crate::renderer;
use crate::text;
use crate::widget::container; use crate::widget::container;
use crate::widget::text::Text; use crate::widget::text::Text;
use crate::{ use crate::{
@ -15,7 +16,7 @@ use crate::{
/// An element to display a widget over another. /// An element to display a widget over another.
#[allow(missing_debug_implementations)] #[allow(missing_debug_implementations)]
pub struct Tooltip<'a, Message, Renderer: renderer::Text> { pub struct Tooltip<'a, Message, Renderer: text::Renderer> {
content: Element<'a, Message, Renderer>, content: Element<'a, Message, Renderer>,
tooltip: Text<Renderer>, tooltip: Text<Renderer>,
position: Position, position: Position,
@ -26,7 +27,7 @@ pub struct Tooltip<'a, Message, Renderer: renderer::Text> {
impl<'a, Message, Renderer> Tooltip<'a, Message, Renderer> impl<'a, Message, Renderer> Tooltip<'a, Message, Renderer>
where where
Renderer: renderer::Text, Renderer: text::Renderer,
{ {
/// The default padding of a [`Tooltip`] drawn by this renderer. /// The default padding of a [`Tooltip`] drawn by this renderer.
const DEFAULT_PADDING: u16 = 5; const DEFAULT_PADDING: u16 = 5;
@ -100,7 +101,7 @@ pub enum Position {
impl<'a, Message, Renderer> Widget<Message, Renderer> impl<'a, Message, Renderer> Widget<Message, Renderer>
for Tooltip<'a, Message, Renderer> for Tooltip<'a, Message, Renderer>
where where
Renderer: renderer::Text, Renderer: text::Renderer,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
self.content.width() self.content.width()
@ -260,7 +261,7 @@ where
impl<'a, Message, Renderer> From<Tooltip<'a, Message, Renderer>> impl<'a, Message, Renderer> From<Tooltip<'a, Message, Renderer>>
for Element<'a, Message, Renderer> for Element<'a, Message, Renderer>
where where
Renderer: 'a + renderer::Text, Renderer: 'a + text::Renderer,
Message: 'a, Message: 'a,
{ {
fn from( fn from(

View file

@ -5,7 +5,7 @@ use iced_graphics::font;
use std::{cell::RefCell, collections::HashMap}; use std::{cell::RefCell, collections::HashMap};
use wgpu_glyph::ab_glyph; use wgpu_glyph::ab_glyph;
pub use iced_native::widget::text::Hit; pub use iced_native::text::Hit;
#[derive(Debug)] #[derive(Debug)]
pub struct Pipeline { pub struct Pipeline {