Introduce first-class text module in iced_native
This commit is contained in:
parent
0aafcde0ef
commit
b3a01973c6
16 changed files with 87 additions and 88 deletions
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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`].
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)]
|
||||||
|
|
|
||||||
|
|
@ -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>) {}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
|
||||||
}
|
}
|
||||||
|
|
@ -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};
|
||||||
///
|
///
|
||||||
/// 
|
/// 
|
||||||
#[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(
|
||||||
|
|
|
||||||
|
|
@ -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> {
|
||||||
|
|
|
||||||
|
|
@ -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};
|
||||||
///
|
///
|
||||||
/// 
|
/// 
|
||||||
#[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>,
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
///
|
///
|
||||||
/// 
|
/// 
|
||||||
#[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(),
|
||||||
|
|
|
||||||
|
|
@ -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};
|
||||||
/// ```
|
/// ```
|
||||||
/// 
|
/// 
|
||||||
#[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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue