Introduce StyleSheet for Text widget

This commit is contained in:
Héctor Ramón Jiménez 2022-06-29 10:51:01 +02:00
parent c807abdfd7
commit 1dd1a2f97f
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
28 changed files with 183 additions and 87 deletions

View file

@ -54,7 +54,7 @@ mod numeric_input {
use iced_native::text; use iced_native::text;
use iced_native::widget::button::{self, Button}; use iced_native::widget::button::{self, Button};
use iced_native::widget::text_input::{self, TextInput}; use iced_native::widget::text_input::{self, TextInput};
use iced_native::widget::{Row, Text}; use iced_native::widget::{self, Row, Text};
use iced_native::{Element, Length}; use iced_native::{Element, Length};
pub struct NumericInput<'a, Message> { pub struct NumericInput<'a, Message> {
@ -95,7 +95,9 @@ mod numeric_input {
for NumericInput<'a, Message> for NumericInput<'a, Message>
where where
Renderer: 'a + text::Renderer, Renderer: 'a + text::Renderer,
Renderer::Theme: button::StyleSheet + text_input::StyleSheet, Renderer::Theme: button::StyleSheet
+ text_input::StyleSheet
+ widget::text::StyleSheet,
{ {
type Event = Event; type Event = Event;
@ -173,7 +175,9 @@ mod numeric_input {
where where
Message: 'a, Message: 'a,
Renderer: text::Renderer + 'a, Renderer: text::Renderer + 'a,
Renderer::Theme: button::StyleSheet + text_input::StyleSheet, Renderer::Theme: button::StyleSheet
+ text_input::StyleSheet
+ widget::text::StyleSheet,
{ {
fn from(numeric_input: NumericInput<'a, Message>) -> Self { fn from(numeric_input: NumericInput<'a, Message>) -> Self {
component::view(numeric_input) component::view(numeric_input)

View file

@ -89,13 +89,13 @@ impl Program for Controls {
.spacing(10) .spacing(10)
.push( .push(
Text::new("Background color") Text::new("Background color")
.color(Color::WHITE), .style(Color::WHITE),
) )
.push(sliders) .push(sliders)
.push( .push(
Text::new(format!("{:?}", background_color)) Text::new(format!("{:?}", background_color))
.size(14) .size(14)
.color(Color::WHITE), .style(Color::WHITE),
), ),
), ),
) )

View file

@ -100,13 +100,13 @@ impl Program for Controls {
.spacing(10) .spacing(10)
.push( .push(
Text::new("Background color") Text::new("Background color")
.color(Color::WHITE), .style(Color::WHITE),
) )
.push(sliders) .push(sliders)
.push( .push(
Text::new(format!("{:?}", background_color)) Text::new(format!("{:?}", background_color))
.size(14) .size(14)
.color(Color::WHITE), .style(Color::WHITE),
) )
.push(TextInput::new( .push(TextInput::new(
t, t,

View file

@ -180,7 +180,7 @@ impl Application for Example {
pin_button.into(), pin_button.into(),
Text::new("Pane").into(), Text::new("Pane").into(),
Text::new(content.id.to_string()) Text::new(content.id.to_string())
.color(if is_focused { .style(if is_focused {
PANE_ID_COLOR_FOCUSED PANE_ID_COLOR_FOCUSED
} else { } else {
PANE_ID_COLOR_UNFOCUSED PANE_ID_COLOR_UNFOCUSED

View file

@ -2,7 +2,7 @@ use iced::button;
use iced::futures; use iced::futures;
use iced::image; use iced::image;
use iced::{ use iced::{
Alignment, Application, Button, Column, Command, Container, Element, Alignment, Application, Button, Color, Column, Command, Container, Element,
Length, Row, Settings, Text, Theme, Length, Row, Settings, Text, Theme,
}; };
@ -143,7 +143,7 @@ impl Pokemon {
.push( .push(
Text::new(format!("#{}", self.number)) Text::new(format!("#{}", self.number))
.size(20) .size(20)
.color([0.5, 0.5, 0.5]), .style(Color::from([0.5, 0.5, 0.5])),
), ),
) )
.push(Text::new(&self.description)), .push(Text::new(&self.description)),

View file

@ -89,8 +89,9 @@ mod numeric_input {
impl<Message, Renderer> Component<Message, Renderer> for NumericInput<Message> impl<Message, Renderer> Component<Message, Renderer> for NumericInput<Message>
where where
Renderer: text::Renderer + 'static, Renderer: text::Renderer + 'static,
Renderer::Theme: Renderer::Theme: widget::button::StyleSheet
widget::button::StyleSheet + widget::text_input::StyleSheet, + widget::text_input::StyleSheet
+ widget::text::StyleSheet,
{ {
type State = (); type State = ();
type Event = Event; type Event = Event;
@ -161,8 +162,9 @@ mod numeric_input {
where where
Message: 'a, Message: 'a,
Renderer: 'static + text::Renderer, Renderer: 'static + text::Renderer,
Renderer::Theme: Renderer::Theme: widget::button::StyleSheet
widget::button::StyleSheet + widget::text_input::StyleSheet, + widget::text_input::StyleSheet
+ widget::text::StyleSheet,
{ {
fn from(numeric_input: NumericInput<Message>) -> Self { fn from(numeric_input: NumericInput<Message>) -> Self {
pure::component(numeric_input) pure::component(numeric_input)

View file

@ -168,7 +168,7 @@ impl Application for Example {
let title = row() let title = row()
.push(pin_button) .push(pin_button)
.push("Pane") .push("Pane")
.push(text(pane.id.to_string()).color(if is_focused { .push(text(pane.id.to_string()).style(if is_focused {
PANE_ID_COLOR_FOCUSED PANE_ID_COLOR_FOCUSED
} else { } else {
PANE_ID_COLOR_UNFOCUSED PANE_ID_COLOR_UNFOCUSED

View file

@ -6,7 +6,7 @@ use iced::pure::{
}; };
use iced::theme::{self, Theme}; use iced::theme::{self, Theme};
use iced::window; use iced::window;
use iced::{Command, Font, Length, Settings}; use iced::{Color, Command, Font, Length, Settings};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
pub fn main() -> iced::Result { pub fn main() -> iced::Result {
@ -155,7 +155,7 @@ impl Application for Todos {
let title = text("todos") let title = text("todos")
.width(Length::Fill) .width(Length::Fill)
.size(100) .size(100)
.color([0.5, 0.5, 0.5]) .style(Color::from([0.5, 0.5, 0.5]))
.horizontal_alignment(alignment::Horizontal::Center); .horizontal_alignment(alignment::Horizontal::Center);
let input = text_input( let input = text_input(
@ -406,7 +406,7 @@ fn empty_message(message: &str) -> Element<'_, Message> {
.width(Length::Fill) .width(Length::Fill)
.size(25) .size(25)
.horizontal_alignment(alignment::Horizontal::Center) .horizontal_alignment(alignment::Horizontal::Center)
.color([0.7, 0.7, 0.7]), .style(Color::from([0.7, 0.7, 0.7])),
) )
.width(Length::Fill) .width(Length::Fill)
.height(Length::Units(200)) .height(Length::Units(200))

View file

@ -433,7 +433,7 @@ impl<'a> Step {
.padding(20) .padding(20)
.spacing(20) .spacing(20)
.push("And its color:") .push("And its color:")
.push(text(format!("{:?}", color)).color(color)) .push(text(format!("{:?}", color)).style(color))
.push(color_sliders); .push(color_sliders);
Self::container("Text") Self::container("Text")
@ -576,7 +576,7 @@ impl<'a> Step {
.push(if cfg!(target_arch = "wasm32") { .push(if cfg!(target_arch = "wasm32") {
Element::new( Element::new(
text("Not available on web yet!") text("Not available on web yet!")
.color([0.7, 0.7, 0.7]) .style(Color::from([0.7, 0.7, 0.7]))
.horizontal_alignment(alignment::Horizontal::Center), .horizontal_alignment(alignment::Horizontal::Center),
) )
} else { } else {

View file

@ -1,7 +1,8 @@
use iced::qr_code::{self, QRCode}; use iced::qr_code::{self, QRCode};
use iced::text_input::{self, TextInput}; use iced::text_input::{self, TextInput};
use iced::{ use iced::{
Alignment, Column, Container, Element, Length, Sandbox, Settings, Text, Alignment, Color, Column, Container, Element, Length, Sandbox, Settings,
Text,
}; };
pub fn main() -> iced::Result { pub fn main() -> iced::Result {
@ -48,7 +49,7 @@ impl Sandbox for QRGenerator {
fn view(&mut self) -> Element<Message> { fn view(&mut self) -> Element<Message> {
let title = Text::new("QR Code Generator") let title = Text::new("QR Code Generator")
.size(70) .size(70)
.color([0.5, 0.5, 0.5]); .style(Color::from([0.5, 0.5, 0.5]));
let input = TextInput::new( let input = TextInput::new(
&mut self.input, &mut self.input,

View file

@ -4,8 +4,8 @@ use iced::scrollable::{self, Scrollable};
use iced::text_input::{self, TextInput}; use iced::text_input::{self, TextInput};
use iced::theme::{self, Theme}; use iced::theme::{self, Theme};
use iced::{ use iced::{
Application, Checkbox, Column, Command, Container, Element, Font, Length, Application, Checkbox, Color, Column, Command, Container, Element, Font,
Row, Settings, Text, Length, Row, Settings, Text,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -155,7 +155,7 @@ impl Application for Todos {
let title = Text::new("todos") let title = Text::new("todos")
.width(Length::Fill) .width(Length::Fill)
.size(100) .size(100)
.color([0.5, 0.5, 0.5]) .style(Color::from([0.5, 0.5, 0.5]))
.horizontal_alignment(alignment::Horizontal::Center); .horizontal_alignment(alignment::Horizontal::Center);
let input = TextInput::new( let input = TextInput::new(
@ -453,7 +453,7 @@ fn empty_message<'a>(message: &str) -> Element<'a, Message> {
.width(Length::Fill) .width(Length::Fill)
.size(25) .size(25)
.horizontal_alignment(alignment::Horizontal::Center) .horizontal_alignment(alignment::Horizontal::Center)
.color([0.7, 0.7, 0.7]), .style(Color::from([0.7, 0.7, 0.7])),
) )
.width(Length::Fill) .width(Length::Fill)
.height(Length::Units(200)) .height(Length::Units(200))

View file

@ -584,7 +584,7 @@ impl<'a> Step {
.padding(20) .padding(20)
.spacing(20) .spacing(20)
.push(Text::new("And its color:")) .push(Text::new("And its color:"))
.push(Text::new(format!("{:?}", color)).color(color)) .push(Text::new(format!("{:?}", color)).style(color))
.push(color_sliders); .push(color_sliders);
Self::container("Text") Self::container("Text")
@ -766,7 +766,7 @@ impl<'a> Step {
.push(if cfg!(target_arch = "wasm32") { .push(if cfg!(target_arch = "wasm32") {
Element::new( Element::new(
Text::new("Not available on web yet!") Text::new("Not available on web yet!")
.color([0.7, 0.7, 0.7]) .style(Color::from([0.7, 0.7, 0.7]))
.horizontal_alignment(alignment::Horizontal::Center), .horizontal_alignment(alignment::Horizontal::Center),
) )
} else { } else {

View file

@ -92,7 +92,7 @@ impl Application for WebSocket {
let message_log = if self.messages.is_empty() { let message_log = if self.messages.is_empty() {
Container::new( Container::new(
Text::new("Your messages will appear here...") Text::new("Your messages will appear here...")
.color(Color::from_rgb8(0x88, 0x88, 0x88)), .style(Color::from_rgb8(0x88, 0x88, 0x88)),
) )
.width(Length::Fill) .width(Length::Fill)
.height(Length::Fill) .height(Length::Fill)

View file

@ -35,7 +35,7 @@ pub use iced_style::checkbox::{Appearance, StyleSheet};
pub struct Checkbox<'a, Message, Renderer> pub struct Checkbox<'a, Message, Renderer>
where where
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{ {
is_checked: bool, is_checked: bool,
on_toggle: Box<dyn Fn(bool) -> Message + 'a>, on_toggle: Box<dyn Fn(bool) -> Message + 'a>,
@ -51,7 +51,7 @@ where
impl<'a, Message, Renderer> Checkbox<'a, Message, Renderer> impl<'a, Message, Renderer> Checkbox<'a, Message, Renderer>
where where
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{ {
/// The default size of a [`Checkbox`]. /// The default size of a [`Checkbox`].
const DEFAULT_SIZE: u16 = 20; const DEFAULT_SIZE: u16 = 20;
@ -130,7 +130,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
for Checkbox<'a, Message, Renderer> for Checkbox<'a, Message, Renderer>
where where
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
self.width self.width
@ -262,9 +262,11 @@ where
style, style,
label_layout, label_layout,
&self.label, &self.label,
self.font.clone(),
self.text_size, self.text_size,
custom_style.text_color, self.font.clone(),
widget::text::Appearance {
color: custom_style.text_color,
},
alignment::Horizontal::Left, alignment::Horizontal::Left,
alignment::Vertical::Center, alignment::Vertical::Center,
); );
@ -277,7 +279,7 @@ impl<'a, Message, Renderer> From<Checkbox<'a, Message, Renderer>>
where where
Message: 'a, Message: 'a,
Renderer: 'a + text::Renderer, Renderer: 'a + text::Renderer,
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{ {
fn from( fn from(
checkbox: Checkbox<'a, Message, Renderer>, checkbox: Checkbox<'a, Message, Renderer>,

View file

@ -144,7 +144,7 @@ impl<Message, Renderer> Widget<Message, Renderer> for Radio<Message, Renderer>
where where
Message: Clone, Message: Clone,
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
self.width self.width
@ -277,9 +277,11 @@ where
style, style,
label_layout, label_layout,
&self.label, &self.label,
self.font.clone(),
self.text_size, self.text_size,
custom_style.text_color, self.font.clone(),
widget::text::Appearance {
color: custom_style.text_color,
},
alignment::Horizontal::Left, alignment::Horizontal::Left,
alignment::Vertical::Center, alignment::Vertical::Center,
); );
@ -292,7 +294,7 @@ impl<'a, Message, Renderer> From<Radio<Message, Renderer>>
where where
Message: 'a + Clone, Message: 'a + Clone,
Renderer: 'a + text::Renderer, Renderer: 'a + text::Renderer,
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{ {
fn from(radio: Radio<Message, Renderer>) -> Element<'a, Message, Renderer> { fn from(radio: Radio<Message, Renderer>) -> Element<'a, Message, Renderer> {
Element::new(radio) Element::new(radio)

View file

@ -3,45 +3,57 @@ use crate::alignment;
use crate::layout; use crate::layout;
use crate::renderer; use crate::renderer;
use crate::text; use crate::text;
use crate::{Color, Element, Layout, Length, Point, Rectangle, Size, Widget}; use crate::{Element, Layout, Length, Point, Rectangle, Size, Widget};
pub use iced_style::text::{Appearance, StyleSheet};
/// A paragraph of text. /// A paragraph of text.
/// ///
/// # Example /// # Example
/// ///
/// ``` /// ```
/// # use iced_native::Color;
/// #
/// # type Text = iced_native::widget::Text<iced_native::renderer::Null>; /// # type Text = iced_native::widget::Text<iced_native::renderer::Null>;
/// # /// #
/// Text::new("I <3 iced!") /// Text::new("I <3 iced!")
/// .color([0.0, 0.0, 1.0]) /// .size(40)
/// .size(40); /// .style(Color::from([0.0, 0.0, 1.0]));
/// ``` /// ```
/// ///
/// ![Text drawn by `iced_wgpu`](https://github.com/iced-rs/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/text.png?raw=true) /// ![Text drawn by `iced_wgpu`](https://github.com/iced-rs/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/text.png?raw=true)
#[derive(Debug)] #[allow(missing_debug_implementations)]
pub struct Text<Renderer: text::Renderer> { pub struct Text<Renderer>
where
Renderer: text::Renderer,
Renderer::Theme: StyleSheet,
{
content: String, content: String,
size: Option<u16>, size: Option<u16>,
color: Option<Color>,
font: Renderer::Font,
width: Length, width: Length,
height: Length, height: Length,
horizontal_alignment: alignment::Horizontal, horizontal_alignment: alignment::Horizontal,
vertical_alignment: alignment::Vertical, vertical_alignment: alignment::Vertical,
font: Renderer::Font,
style: <Renderer::Theme as StyleSheet>::Style,
} }
impl<Renderer: text::Renderer> Text<Renderer> { impl<Renderer> Text<Renderer>
where
Renderer: text::Renderer,
Renderer::Theme: StyleSheet,
{
/// 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 {
content: label.into(), content: label.into(),
size: None, size: None,
color: None,
font: Default::default(), font: Default::default(),
width: Length::Shrink, width: Length::Shrink,
height: Length::Shrink, height: Length::Shrink,
horizontal_alignment: alignment::Horizontal::Left, horizontal_alignment: alignment::Horizontal::Left,
vertical_alignment: alignment::Vertical::Top, vertical_alignment: alignment::Vertical::Top,
style: Default::default(),
} }
} }
@ -51,12 +63,6 @@ impl<Renderer: text::Renderer> Text<Renderer> {
self self
} }
/// Sets the [`Color`] of the [`Text`].
pub fn color<C: Into<Color>>(mut self, color: C) -> Self {
self.color = Some(color.into());
self
}
/// Sets the [`Font`] of the [`Text`]. /// Sets the [`Font`] of the [`Text`].
/// ///
/// [`Font`]: crate::text::Renderer::Font /// [`Font`]: crate::text::Renderer::Font
@ -65,6 +71,15 @@ impl<Renderer: text::Renderer> Text<Renderer> {
self self
} }
/// Sets the [`Color`] of the [`Text`].
pub fn style(
mut self,
style: impl Into<<Renderer::Theme as StyleSheet>::Style>,
) -> Self {
self.style = style.into();
self
}
/// Sets the width of the [`Text`] boundaries. /// Sets the width of the [`Text`] boundaries.
pub fn width(mut self, width: Length) -> Self { pub fn width(mut self, width: Length) -> Self {
self.width = width; self.width = width;
@ -99,6 +114,7 @@ impl<Renderer: text::Renderer> Text<Renderer> {
impl<Message, Renderer> Widget<Message, Renderer> for Text<Renderer> impl<Message, Renderer> Widget<Message, Renderer> for Text<Renderer>
where where
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: StyleSheet,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
self.width self.width
@ -130,7 +146,7 @@ where
fn draw( fn draw(
&self, &self,
renderer: &mut Renderer, renderer: &mut Renderer,
_theme: &Renderer::Theme, theme: &Renderer::Theme,
style: &renderer::Style, style: &renderer::Style,
layout: Layout<'_>, layout: Layout<'_>,
_cursor_position: Point, _cursor_position: Point,
@ -141,9 +157,9 @@ where
style, style,
layout, layout,
&self.content, &self.content,
self.font.clone(),
self.size, self.size,
self.color, self.font.clone(),
theme.appearance(self.style),
self.horizontal_alignment, self.horizontal_alignment,
self.vertical_alignment, self.vertical_alignment,
); );
@ -165,9 +181,9 @@ pub fn draw<Renderer>(
style: &renderer::Style, style: &renderer::Style,
layout: Layout<'_>, layout: Layout<'_>,
content: &str, content: &str,
font: Renderer::Font,
size: Option<u16>, size: Option<u16>,
color: Option<Color>, font: Renderer::Font,
appearance: Appearance,
horizontal_alignment: alignment::Horizontal, horizontal_alignment: alignment::Horizontal,
vertical_alignment: alignment::Vertical, vertical_alignment: alignment::Vertical,
) where ) where
@ -191,7 +207,7 @@ pub fn draw<Renderer>(
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 },
color: color.unwrap_or(style.text_color), color: appearance.color.unwrap_or(style.text_color),
font, font,
horizontal_alignment, horizontal_alignment,
vertical_alignment, vertical_alignment,
@ -202,23 +218,28 @@ impl<'a, Message, Renderer> From<Text<Renderer>>
for Element<'a, Message, Renderer> for Element<'a, Message, Renderer>
where where
Renderer: text::Renderer + 'a, Renderer: text::Renderer + 'a,
Renderer::Theme: StyleSheet,
{ {
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: text::Renderer> Clone for Text<Renderer> { impl<Renderer> Clone for Text<Renderer>
where
Renderer: text::Renderer,
Renderer::Theme: StyleSheet,
{
fn clone(&self) -> Self { fn clone(&self) -> Self {
Self { Self {
content: self.content.clone(), content: self.content.clone(),
size: self.size, size: self.size,
color: self.color,
font: self.font.clone(),
width: self.width, width: self.width,
height: self.height, height: self.height,
horizontal_alignment: self.horizontal_alignment, horizontal_alignment: self.horizontal_alignment,
vertical_alignment: self.vertical_alignment, vertical_alignment: self.vertical_alignment,
font: self.font.clone(),
style: self.style,
} }
} }
} }

View file

@ -5,7 +5,7 @@ use crate::layout;
use crate::mouse; use crate::mouse;
use crate::renderer; use crate::renderer;
use crate::text; use crate::text;
use crate::widget::{Row, Text}; use crate::widget::{self, Row, Text};
use crate::{ use crate::{
Alignment, Clipboard, Element, Event, Layout, Length, Point, Rectangle, Alignment, Clipboard, Element, Event, Layout, Length, Point, Rectangle,
Shell, Widget, Shell, Widget,
@ -136,7 +136,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
for Toggler<'a, Message, Renderer> for Toggler<'a, Message, Renderer>
where where
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
self.width self.width
@ -240,9 +240,9 @@ where
style, style,
label_layout, label_layout,
&label, &label,
self.font.clone(),
self.text_size, self.text_size,
None, self.font.clone(),
Default::default(),
self.text_alignment, self.text_alignment,
alignment::Vertical::Center, alignment::Vertical::Center,
); );
@ -312,7 +312,7 @@ impl<'a, Message, Renderer> From<Toggler<'a, Message, Renderer>>
where where
Message: 'a, Message: 'a,
Renderer: 'a + text::Renderer, Renderer: 'a + text::Renderer,
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{ {
fn from( fn from(
toggler: Toggler<'a, Message, Renderer>, toggler: Toggler<'a, Message, Renderer>,

View file

@ -4,6 +4,7 @@ use crate::layout;
use crate::mouse; use crate::mouse;
use crate::renderer; use crate::renderer;
use crate::text; use crate::text;
use crate::widget;
use crate::widget::container; use crate::widget::container;
use crate::widget::text::Text; use crate::widget::text::Text;
use crate::{ use crate::{
@ -16,7 +17,7 @@ use crate::{
pub struct Tooltip<'a, Message, Renderer> pub struct Tooltip<'a, Message, Renderer>
where where
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: container::StyleSheet, Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{ {
content: Element<'a, Message, Renderer>, content: Element<'a, Message, Renderer>,
tooltip: Text<Renderer>, tooltip: Text<Renderer>,
@ -29,7 +30,7 @@ where
impl<'a, Message, Renderer> Tooltip<'a, Message, Renderer> impl<'a, Message, Renderer> Tooltip<'a, Message, Renderer>
where where
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: container::StyleSheet, Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{ {
/// 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;
@ -224,7 +225,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
for Tooltip<'a, Message, Renderer> for Tooltip<'a, Message, Renderer>
where where
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: container::StyleSheet, Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
self.content.width() self.content.width()
@ -330,7 +331,7 @@ impl<'a, Message, Renderer> From<Tooltip<'a, Message, Renderer>>
where where
Message: 'a, Message: 'a,
Renderer: 'a + text::Renderer, Renderer: 'a + text::Renderer,
Renderer::Theme: container::StyleSheet, Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{ {
fn from( fn from(
tooltip: Tooltip<'a, Message, Renderer>, tooltip: Tooltip<'a, Message, Renderer>,

View file

@ -71,7 +71,7 @@ pub fn tooltip<'a, Message, Renderer>(
) -> widget::Tooltip<'a, Message, Renderer> ) -> widget::Tooltip<'a, Message, Renderer>
where where
Renderer: iced_native::text::Renderer, Renderer: iced_native::text::Renderer,
Renderer::Theme: widget::container::StyleSheet, Renderer::Theme: widget::container::StyleSheet + widget::text::StyleSheet,
{ {
widget::Tooltip::new(content, tooltip, position) widget::Tooltip::new(content, tooltip, position)
} }
@ -82,6 +82,7 @@ where
pub fn text<Renderer>(text: impl Into<String>) -> widget::Text<Renderer> pub fn text<Renderer>(text: impl Into<String>) -> widget::Text<Renderer>
where where
Renderer: iced_native::text::Renderer, Renderer: iced_native::text::Renderer,
Renderer::Theme: widget::text::StyleSheet,
{ {
widget::Text::new(text) widget::Text::new(text)
} }
@ -96,7 +97,7 @@ pub fn checkbox<'a, Message, Renderer>(
) -> widget::Checkbox<'a, Message, Renderer> ) -> widget::Checkbox<'a, Message, Renderer>
where where
Renderer: iced_native::text::Renderer, Renderer: iced_native::text::Renderer,
Renderer::Theme: widget::checkbox::StyleSheet, Renderer::Theme: widget::checkbox::StyleSheet + widget::text::StyleSheet,
{ {
widget::Checkbox::new(is_checked, label, f) widget::Checkbox::new(is_checked, label, f)
} }

View file

@ -11,6 +11,7 @@ pub mod rule;
pub mod scrollable; pub mod scrollable;
pub mod slider; pub mod slider;
pub mod svg; pub mod svg;
pub mod text;
pub mod text_input; pub mod text_input;
pub mod toggler; pub mod toggler;
pub mod tooltip; pub mod tooltip;
@ -19,7 +20,6 @@ pub mod tree;
mod column; mod column;
mod row; mod row;
mod space; mod space;
mod text;
pub use button::Button; pub use button::Button;
pub use checkbox::Checkbox; pub use checkbox::Checkbox;

View file

@ -7,6 +7,7 @@ use iced_native::layout::{self, Layout};
use iced_native::mouse; use iced_native::mouse;
use iced_native::renderer; use iced_native::renderer;
use iced_native::text; use iced_native::text;
use iced_native::widget;
use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; use iced_native::{Clipboard, Length, Point, Rectangle, Shell};
pub use iced_native::widget::checkbox::{Appearance, Checkbox, StyleSheet}; pub use iced_native::widget::checkbox::{Appearance, Checkbox, StyleSheet};
@ -15,7 +16,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
for Checkbox<'a, Message, Renderer> for Checkbox<'a, Message, Renderer>
where where
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
<Self as iced_native::Widget<Message, Renderer>>::width(self) <Self as iced_native::Widget<Message, Renderer>>::width(self)
@ -100,7 +101,7 @@ impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>>
where where
Message: 'a, Message: 'a,
Renderer: text::Renderer + 'a, Renderer: text::Renderer + 'a,
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{ {
fn into(self) -> Element<'a, Message, Renderer> { fn into(self) -> Element<'a, Message, Renderer> {
Element::new(self) Element::new(self)

View file

@ -7,6 +7,7 @@ use iced_native::layout::{self, Layout};
use iced_native::mouse; use iced_native::mouse;
use iced_native::renderer; use iced_native::renderer;
use iced_native::text; use iced_native::text;
use iced_native::widget;
use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; use iced_native::{Clipboard, Length, Point, Rectangle, Shell};
pub use iced_native::widget::radio::{Appearance, Radio, StyleSheet}; pub use iced_native::widget::radio::{Appearance, Radio, StyleSheet};
@ -15,7 +16,7 @@ impl<Message, Renderer> Widget<Message, Renderer> for Radio<Message, Renderer>
where where
Message: Clone, Message: Clone,
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
<Self as iced_native::Widget<Message, Renderer>>::width(self) <Self as iced_native::Widget<Message, Renderer>>::width(self)
@ -100,7 +101,7 @@ impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>>
where where
Message: 'a + Clone, Message: 'a + Clone,
Renderer: text::Renderer + 'a, Renderer: text::Renderer + 'a,
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{ {
fn into(self) -> Element<'a, Message, Renderer> { fn into(self) -> Element<'a, Message, Renderer> {
Element::new(self) Element::new(self)

View file

@ -1,16 +1,19 @@
//! Write some text for your users to read.
use crate::widget::Tree; use crate::widget::Tree;
use crate::{Element, Widget}; use crate::{Element, Widget};
use iced_native::layout::{self, Layout}; use iced_native::layout::{self, Layout};
use iced_native::renderer; use iced_native::renderer;
use iced_native::text; use iced_native::text;
use iced_native::widget;
use iced_native::{Length, Point, Rectangle}; use iced_native::{Length, Point, Rectangle};
pub use iced_native::widget::Text; pub use iced_native::widget::text::{Appearance, StyleSheet, Text};
impl<Message, Renderer> Widget<Message, Renderer> for Text<Renderer> impl<Message, Renderer> Widget<Message, Renderer> for Text<Renderer>
where where
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: widget::text::StyleSheet,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
<Self as iced_native::Widget<Message, Renderer>>::width(self) <Self as iced_native::Widget<Message, Renderer>>::width(self)
@ -56,6 +59,7 @@ impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>>
for Text<Renderer> for Text<Renderer>
where where
Renderer: text::Renderer + 'a, Renderer: text::Renderer + 'a,
Renderer::Theme: widget::text::StyleSheet,
{ {
fn into(self) -> Element<'a, Message, Renderer> { fn into(self) -> Element<'a, Message, Renderer> {
Element::new(self) Element::new(self)
@ -65,6 +69,7 @@ where
impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>> for &'a str impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>> for &'a str
where where
Renderer: text::Renderer + 'a, Renderer: text::Renderer + 'a,
Renderer::Theme: widget::text::StyleSheet,
{ {
fn into(self) -> Element<'a, Message, Renderer> { fn into(self) -> Element<'a, Message, Renderer> {
Text::new(self).into() Text::new(self).into()

View file

@ -7,6 +7,7 @@ use iced_native::layout::{self, Layout};
use iced_native::mouse; use iced_native::mouse;
use iced_native::renderer; use iced_native::renderer;
use iced_native::text; use iced_native::text;
use iced_native::widget;
use iced_native::{Clipboard, Length, Point, Rectangle, Shell}; use iced_native::{Clipboard, Length, Point, Rectangle, Shell};
pub use iced_native::widget::toggler::{Appearance, StyleSheet, Toggler}; pub use iced_native::widget::toggler::{Appearance, StyleSheet, Toggler};
@ -15,7 +16,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
for Toggler<'a, Message, Renderer> for Toggler<'a, Message, Renderer>
where where
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{ {
fn width(&self) -> Length { fn width(&self) -> Length {
<Self as iced_native::Widget<Message, Renderer>>::width(self) <Self as iced_native::Widget<Message, Renderer>>::width(self)
@ -100,7 +101,7 @@ impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>>
where where
Message: 'a, Message: 'a,
Renderer: text::Renderer + 'a, Renderer: text::Renderer + 'a,
Renderer::Theme: StyleSheet, Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{ {
fn into(self) -> Element<'a, Message, Renderer> { fn into(self) -> Element<'a, Message, Renderer> {
Element::new(self) Element::new(self)

View file

@ -9,7 +9,7 @@ use iced_native::renderer;
use iced_native::text; use iced_native::text;
use iced_native::widget::container; use iced_native::widget::container;
use iced_native::widget::tooltip; use iced_native::widget::tooltip;
use iced_native::widget::Text; use iced_native::widget::{self, Text};
use iced_native::{Clipboard, Layout, Length, Point, Rectangle, Shell}; use iced_native::{Clipboard, Layout, Length, Point, Rectangle, Shell};
pub use iced_style::container::{Appearance, StyleSheet}; pub use iced_style::container::{Appearance, StyleSheet};
@ -20,7 +20,7 @@ pub use tooltip::Position;
pub struct Tooltip<'a, Message, Renderer: text::Renderer> pub struct Tooltip<'a, Message, Renderer: text::Renderer>
where where
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: container::StyleSheet, Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{ {
content: Element<'a, Message, Renderer>, content: Element<'a, Message, Renderer>,
tooltip: Text<Renderer>, tooltip: Text<Renderer>,
@ -33,7 +33,7 @@ where
impl<'a, Message, Renderer> Tooltip<'a, Message, Renderer> impl<'a, Message, Renderer> Tooltip<'a, Message, Renderer>
where where
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: container::StyleSheet, Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{ {
/// 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;
@ -96,7 +96,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
for Tooltip<'a, Message, Renderer> for Tooltip<'a, Message, Renderer>
where where
Renderer: text::Renderer, Renderer: text::Renderer,
Renderer::Theme: container::StyleSheet, Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{ {
fn children(&self) -> Vec<Tree> { fn children(&self) -> Vec<Tree> {
vec![Tree::new(&self.content)] vec![Tree::new(&self.content)]
@ -230,7 +230,7 @@ impl<'a, Message, Renderer> From<Tooltip<'a, Message, Renderer>>
where where
Message: 'a, Message: 'a,
Renderer: 'a + text::Renderer, Renderer: 'a + text::Renderer,
Renderer::Theme: container::StyleSheet, Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{ {
fn from( fn from(
tooltip: Tooltip<'a, Message, Renderer>, tooltip: Tooltip<'a, Message, Renderer>,

View file

@ -21,6 +21,7 @@ pub mod radio;
pub mod rule; pub mod rule;
pub mod scrollable; pub mod scrollable;
pub mod slider; pub mod slider;
pub mod text;
pub mod text_input; pub mod text_input;
pub mod theme; pub mod theme;
pub mod toggler; pub mod toggler;

18
style/src/text.rs Normal file
View file

@ -0,0 +1,18 @@
use iced_core::Color;
pub trait StyleSheet {
type Style: Default + Copy;
fn appearance(&self, style: Self::Style) -> Appearance;
}
#[derive(Debug, Clone, Copy)]
pub struct Appearance {
pub color: Option<Color>,
}
impl Default for Appearance {
fn default() -> Self {
Self { color: None }
}
}

View file

@ -14,6 +14,7 @@ use crate::radio;
use crate::rule; use crate::rule;
use crate::scrollable; use crate::scrollable;
use crate::slider; use crate::slider;
use crate::text;
use crate::text_input; use crate::text_input;
use crate::toggler; use crate::toggler;
@ -601,6 +602,40 @@ impl scrollable::StyleSheet for Theme {
} }
} }
/*
* Text
*/
#[derive(Clone, Copy)]
pub enum Text {
Default,
Color(Color),
Custom(fn(&Theme) -> text::Appearance),
}
impl Default for Text {
fn default() -> Self {
Self::Default
}
}
impl From<Color> for Text {
fn from(color: Color) -> Self {
Text::Color(color)
}
}
impl text::StyleSheet for Theme {
type Style = Text;
fn appearance(&self, style: Self::Style) -> text::Appearance {
match style {
Text::Default => Default::default(),
Text::Color(c) => text::Appearance { color: Some(c) },
Text::Custom(f) => f(self),
}
}
}
/* /*
* Text Input * Text Input
*/ */