summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-06-29 10:51:01 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-06-29 10:51:01 +0200
commit1dd1a2f97fc747e15e12b5188dad6c41b0d052ea (patch)
treeba2b24b9c8dec02b9232068dee299ca27a4823ba
parentc807abdfd70c49b0c93868c12f142a2fb4c08036 (diff)
downloadiced-1dd1a2f97fc747e15e12b5188dad6c41b0d052ea.tar.gz
iced-1dd1a2f97fc747e15e12b5188dad6c41b0d052ea.tar.bz2
iced-1dd1a2f97fc747e15e12b5188dad6c41b0d052ea.zip
Introduce `StyleSheet` for `Text` widget
-rw-r--r--examples/component/src/main.rs10
-rw-r--r--examples/integration_opengl/src/controls.rs4
-rw-r--r--examples/integration_wgpu/src/controls.rs4
-rw-r--r--examples/pane_grid/src/main.rs2
-rw-r--r--examples/pokedex/src/main.rs4
-rw-r--r--examples/pure/component/src/main.rs10
-rw-r--r--examples/pure/pane_grid/src/main.rs2
-rw-r--r--examples/pure/todos/src/main.rs6
-rw-r--r--examples/pure/tour/src/main.rs4
-rw-r--r--examples/qr_code/src/main.rs5
-rw-r--r--examples/todos/src/main.rs8
-rw-r--r--examples/tour/src/main.rs4
-rw-r--r--examples/websocket/src/main.rs2
-rw-r--r--native/src/widget/checkbox.rs14
-rw-r--r--native/src/widget/radio.rs10
-rw-r--r--native/src/widget/text.rs69
-rw-r--r--native/src/widget/toggler.rs10
-rw-r--r--native/src/widget/tooltip.rs9
-rw-r--r--pure/src/helpers.rs5
-rw-r--r--pure/src/widget.rs2
-rw-r--r--pure/src/widget/checkbox.rs5
-rw-r--r--pure/src/widget/radio.rs5
-rw-r--r--pure/src/widget/text.rs7
-rw-r--r--pure/src/widget/toggler.rs5
-rw-r--r--pure/src/widget/tooltip.rs10
-rw-r--r--style/src/lib.rs1
-rw-r--r--style/src/text.rs18
-rw-r--r--style/src/theme.rs35
28 files changed, 183 insertions, 87 deletions
diff --git a/examples/component/src/main.rs b/examples/component/src/main.rs
index 73bbbe35..b6ff0600 100644
--- a/examples/component/src/main.rs
+++ b/examples/component/src/main.rs
@@ -54,7 +54,7 @@ mod numeric_input {
use iced_native::text;
use iced_native::widget::button::{self, Button};
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};
pub struct NumericInput<'a, Message> {
@@ -95,7 +95,9 @@ mod numeric_input {
for NumericInput<'a, Message>
where
Renderer: 'a + text::Renderer,
- Renderer::Theme: button::StyleSheet + text_input::StyleSheet,
+ Renderer::Theme: button::StyleSheet
+ + text_input::StyleSheet
+ + widget::text::StyleSheet,
{
type Event = Event;
@@ -173,7 +175,9 @@ mod numeric_input {
where
Message: '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 {
component::view(numeric_input)
diff --git a/examples/integration_opengl/src/controls.rs b/examples/integration_opengl/src/controls.rs
index f387b4e5..fdaa29d5 100644
--- a/examples/integration_opengl/src/controls.rs
+++ b/examples/integration_opengl/src/controls.rs
@@ -89,13 +89,13 @@ impl Program for Controls {
.spacing(10)
.push(
Text::new("Background color")
- .color(Color::WHITE),
+ .style(Color::WHITE),
)
.push(sliders)
.push(
Text::new(format!("{:?}", background_color))
.size(14)
- .color(Color::WHITE),
+ .style(Color::WHITE),
),
),
)
diff --git a/examples/integration_wgpu/src/controls.rs b/examples/integration_wgpu/src/controls.rs
index 9bca40eb..cb2c423f 100644
--- a/examples/integration_wgpu/src/controls.rs
+++ b/examples/integration_wgpu/src/controls.rs
@@ -100,13 +100,13 @@ impl Program for Controls {
.spacing(10)
.push(
Text::new("Background color")
- .color(Color::WHITE),
+ .style(Color::WHITE),
)
.push(sliders)
.push(
Text::new(format!("{:?}", background_color))
.size(14)
- .color(Color::WHITE),
+ .style(Color::WHITE),
)
.push(TextInput::new(
t,
diff --git a/examples/pane_grid/src/main.rs b/examples/pane_grid/src/main.rs
index fca1116e..5fbcea2c 100644
--- a/examples/pane_grid/src/main.rs
+++ b/examples/pane_grid/src/main.rs
@@ -180,7 +180,7 @@ impl Application for Example {
pin_button.into(),
Text::new("Pane").into(),
Text::new(content.id.to_string())
- .color(if is_focused {
+ .style(if is_focused {
PANE_ID_COLOR_FOCUSED
} else {
PANE_ID_COLOR_UNFOCUSED
diff --git a/examples/pokedex/src/main.rs b/examples/pokedex/src/main.rs
index 4b0e913d..89d865e4 100644
--- a/examples/pokedex/src/main.rs
+++ b/examples/pokedex/src/main.rs
@@ -2,7 +2,7 @@ use iced::button;
use iced::futures;
use iced::image;
use iced::{
- Alignment, Application, Button, Column, Command, Container, Element,
+ Alignment, Application, Button, Color, Column, Command, Container, Element,
Length, Row, Settings, Text, Theme,
};
@@ -143,7 +143,7 @@ impl Pokemon {
.push(
Text::new(format!("#{}", self.number))
.size(20)
- .color([0.5, 0.5, 0.5]),
+ .style(Color::from([0.5, 0.5, 0.5])),
),
)
.push(Text::new(&self.description)),
diff --git a/examples/pure/component/src/main.rs b/examples/pure/component/src/main.rs
index 31592dbf..64935afd 100644
--- a/examples/pure/component/src/main.rs
+++ b/examples/pure/component/src/main.rs
@@ -89,8 +89,9 @@ mod numeric_input {
impl<Message, Renderer> Component<Message, Renderer> for NumericInput<Message>
where
Renderer: text::Renderer + 'static,
- Renderer::Theme:
- widget::button::StyleSheet + widget::text_input::StyleSheet,
+ Renderer::Theme: widget::button::StyleSheet
+ + widget::text_input::StyleSheet
+ + widget::text::StyleSheet,
{
type State = ();
type Event = Event;
@@ -161,8 +162,9 @@ mod numeric_input {
where
Message: 'a,
Renderer: 'static + text::Renderer,
- Renderer::Theme:
- widget::button::StyleSheet + widget::text_input::StyleSheet,
+ Renderer::Theme: widget::button::StyleSheet
+ + widget::text_input::StyleSheet
+ + widget::text::StyleSheet,
{
fn from(numeric_input: NumericInput<Message>) -> Self {
pure::component(numeric_input)
diff --git a/examples/pure/pane_grid/src/main.rs b/examples/pure/pane_grid/src/main.rs
index 077e116b..e85ed78d 100644
--- a/examples/pure/pane_grid/src/main.rs
+++ b/examples/pure/pane_grid/src/main.rs
@@ -168,7 +168,7 @@ impl Application for Example {
let title = row()
.push(pin_button)
.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
} else {
PANE_ID_COLOR_UNFOCUSED
diff --git a/examples/pure/todos/src/main.rs b/examples/pure/todos/src/main.rs
index ea772def..723386ad 100644
--- a/examples/pure/todos/src/main.rs
+++ b/examples/pure/todos/src/main.rs
@@ -6,7 +6,7 @@ use iced::pure::{
};
use iced::theme::{self, Theme};
use iced::window;
-use iced::{Command, Font, Length, Settings};
+use iced::{Color, Command, Font, Length, Settings};
use serde::{Deserialize, Serialize};
pub fn main() -> iced::Result {
@@ -155,7 +155,7 @@ impl Application for Todos {
let title = text("todos")
.width(Length::Fill)
.size(100)
- .color([0.5, 0.5, 0.5])
+ .style(Color::from([0.5, 0.5, 0.5]))
.horizontal_alignment(alignment::Horizontal::Center);
let input = text_input(
@@ -406,7 +406,7 @@ fn empty_message(message: &str) -> Element<'_, Message> {
.width(Length::Fill)
.size(25)
.horizontal_alignment(alignment::Horizontal::Center)
- .color([0.7, 0.7, 0.7]),
+ .style(Color::from([0.7, 0.7, 0.7])),
)
.width(Length::Fill)
.height(Length::Units(200))
diff --git a/examples/pure/tour/src/main.rs b/examples/pure/tour/src/main.rs
index 700e4216..477a1ec7 100644
--- a/examples/pure/tour/src/main.rs
+++ b/examples/pure/tour/src/main.rs
@@ -433,7 +433,7 @@ impl<'a> Step {
.padding(20)
.spacing(20)
.push("And its color:")
- .push(text(format!("{:?}", color)).color(color))
+ .push(text(format!("{:?}", color)).style(color))
.push(color_sliders);
Self::container("Text")
@@ -576,7 +576,7 @@ impl<'a> Step {
.push(if cfg!(target_arch = "wasm32") {
Element::new(
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),
)
} else {
diff --git a/examples/qr_code/src/main.rs b/examples/qr_code/src/main.rs
index 92c82d45..3e9ba921 100644
--- a/examples/qr_code/src/main.rs
+++ b/examples/qr_code/src/main.rs
@@ -1,7 +1,8 @@
use iced::qr_code::{self, QRCode};
use iced::text_input::{self, TextInput};
use iced::{
- Alignment, Column, Container, Element, Length, Sandbox, Settings, Text,
+ Alignment, Color, Column, Container, Element, Length, Sandbox, Settings,
+ Text,
};
pub fn main() -> iced::Result {
@@ -48,7 +49,7 @@ impl Sandbox for QRGenerator {
fn view(&mut self) -> Element<Message> {
let title = Text::new("QR Code Generator")
.size(70)
- .color([0.5, 0.5, 0.5]);
+ .style(Color::from([0.5, 0.5, 0.5]));
let input = TextInput::new(
&mut self.input,
diff --git a/examples/todos/src/main.rs b/examples/todos/src/main.rs
index 453cddc3..dc080ef5 100644
--- a/examples/todos/src/main.rs
+++ b/examples/todos/src/main.rs
@@ -4,8 +4,8 @@ use iced::scrollable::{self, Scrollable};
use iced::text_input::{self, TextInput};
use iced::theme::{self, Theme};
use iced::{
- Application, Checkbox, Column, Command, Container, Element, Font, Length,
- Row, Settings, Text,
+ Application, Checkbox, Color, Column, Command, Container, Element, Font,
+ Length, Row, Settings, Text,
};
use serde::{Deserialize, Serialize};
@@ -155,7 +155,7 @@ impl Application for Todos {
let title = Text::new("todos")
.width(Length::Fill)
.size(100)
- .color([0.5, 0.5, 0.5])
+ .style(Color::from([0.5, 0.5, 0.5]))
.horizontal_alignment(alignment::Horizontal::Center);
let input = TextInput::new(
@@ -453,7 +453,7 @@ fn empty_message<'a>(message: &str) -> Element<'a, Message> {
.width(Length::Fill)
.size(25)
.horizontal_alignment(alignment::Horizontal::Center)
- .color([0.7, 0.7, 0.7]),
+ .style(Color::from([0.7, 0.7, 0.7])),
)
.width(Length::Fill)
.height(Length::Units(200))
diff --git a/examples/tour/src/main.rs b/examples/tour/src/main.rs
index 155592d5..22cfaa57 100644
--- a/examples/tour/src/main.rs
+++ b/examples/tour/src/main.rs
@@ -584,7 +584,7 @@ impl<'a> Step {
.padding(20)
.spacing(20)
.push(Text::new("And its color:"))
- .push(Text::new(format!("{:?}", color)).color(color))
+ .push(Text::new(format!("{:?}", color)).style(color))
.push(color_sliders);
Self::container("Text")
@@ -766,7 +766,7 @@ impl<'a> Step {
.push(if cfg!(target_arch = "wasm32") {
Element::new(
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),
)
} else {
diff --git a/examples/websocket/src/main.rs b/examples/websocket/src/main.rs
index 65120710..64addc8f 100644
--- a/examples/websocket/src/main.rs
+++ b/examples/websocket/src/main.rs
@@ -92,7 +92,7 @@ impl Application for WebSocket {
let message_log = if self.messages.is_empty() {
Container::new(
Text::new("Your messages will appear here...")
- .color(Color::from_rgb8(0x88, 0x88, 0x88)),
+ .style(Color::from_rgb8(0x88, 0x88, 0x88)),
)
.width(Length::Fill)
.height(Length::Fill)
diff --git a/native/src/widget/checkbox.rs b/native/src/widget/checkbox.rs
index cedbb7d8..9e7f183a 100644
--- a/native/src/widget/checkbox.rs
+++ b/native/src/widget/checkbox.rs
@@ -35,7 +35,7 @@ pub use iced_style::checkbox::{Appearance, StyleSheet};
pub struct Checkbox<'a, Message, Renderer>
where
Renderer: text::Renderer,
- Renderer::Theme: StyleSheet,
+ Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{
is_checked: bool,
on_toggle: Box<dyn Fn(bool) -> Message + 'a>,
@@ -51,7 +51,7 @@ where
impl<'a, Message, Renderer> Checkbox<'a, Message, Renderer>
where
Renderer: text::Renderer,
- Renderer::Theme: StyleSheet,
+ Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{
/// The default size of a [`Checkbox`].
const DEFAULT_SIZE: u16 = 20;
@@ -130,7 +130,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
for Checkbox<'a, Message, Renderer>
where
Renderer: text::Renderer,
- Renderer::Theme: StyleSheet,
+ Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{
fn width(&self) -> Length {
self.width
@@ -262,9 +262,11 @@ where
style,
label_layout,
&self.label,
- self.font.clone(),
self.text_size,
- custom_style.text_color,
+ self.font.clone(),
+ widget::text::Appearance {
+ color: custom_style.text_color,
+ },
alignment::Horizontal::Left,
alignment::Vertical::Center,
);
@@ -277,7 +279,7 @@ impl<'a, Message, Renderer> From<Checkbox<'a, Message, Renderer>>
where
Message: 'a,
Renderer: 'a + text::Renderer,
- Renderer::Theme: StyleSheet,
+ Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{
fn from(
checkbox: Checkbox<'a, Message, Renderer>,
diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs
index de7e2735..ba45a0f4 100644
--- a/native/src/widget/radio.rs
+++ b/native/src/widget/radio.rs
@@ -144,7 +144,7 @@ impl<Message, Renderer> Widget<Message, Renderer> for Radio<Message, Renderer>
where
Message: Clone,
Renderer: text::Renderer,
- Renderer::Theme: StyleSheet,
+ Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{
fn width(&self) -> Length {
self.width
@@ -277,9 +277,11 @@ where
style,
label_layout,
&self.label,
- self.font.clone(),
self.text_size,
- custom_style.text_color,
+ self.font.clone(),
+ widget::text::Appearance {
+ color: custom_style.text_color,
+ },
alignment::Horizontal::Left,
alignment::Vertical::Center,
);
@@ -292,7 +294,7 @@ impl<'a, Message, Renderer> From<Radio<Message, Renderer>>
where
Message: 'a + Clone,
Renderer: 'a + text::Renderer,
- Renderer::Theme: StyleSheet,
+ Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{
fn from(radio: Radio<Message, Renderer>) -> Element<'a, Message, Renderer> {
Element::new(radio)
diff --git a/native/src/widget/text.rs b/native/src/widget/text.rs
index 5f7e9159..242247b0 100644
--- a/native/src/widget/text.rs
+++ b/native/src/widget/text.rs
@@ -3,45 +3,57 @@ use crate::alignment;
use crate::layout;
use crate::renderer;
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.
///
/// # Example
///
/// ```
+/// # use iced_native::Color;
+/// #
/// # type Text = iced_native::widget::Text<iced_native::renderer::Null>;
/// #
/// 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)
-#[derive(Debug)]
-pub struct Text<Renderer: text::Renderer> {
+#[allow(missing_debug_implementations)]
+pub struct Text<Renderer>
+where
+ Renderer: text::Renderer,
+ Renderer::Theme: StyleSheet,
+{
content: String,
size: Option<u16>,
- color: Option<Color>,
- font: Renderer::Font,
width: Length,
height: Length,
horizontal_alignment: alignment::Horizontal,
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.
pub fn new<T: Into<String>>(label: T) -> Self {
Text {
content: label.into(),
size: None,
- color: None,
font: Default::default(),
width: Length::Shrink,
height: Length::Shrink,
horizontal_alignment: alignment::Horizontal::Left,
vertical_alignment: alignment::Vertical::Top,
+ style: Default::default(),
}
}
@@ -51,12 +63,6 @@ impl<Renderer: text::Renderer> Text<Renderer> {
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`].
///
/// [`Font`]: crate::text::Renderer::Font
@@ -65,6 +71,15 @@ impl<Renderer: text::Renderer> Text<Renderer> {
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.
pub fn width(mut self, width: Length) -> Self {
self.width = width;
@@ -99,6 +114,7 @@ impl<Renderer: text::Renderer> Text<Renderer> {
impl<Message, Renderer> Widget<Message, Renderer> for Text<Renderer>
where
Renderer: text::Renderer,
+ Renderer::Theme: StyleSheet,
{
fn width(&self) -> Length {
self.width
@@ -130,7 +146,7 @@ where
fn draw(
&self,
renderer: &mut Renderer,
- _theme: &Renderer::Theme,
+ theme: &Renderer::Theme,
style: &renderer::Style,
layout: Layout<'_>,
_cursor_position: Point,
@@ -141,9 +157,9 @@ where
style,
layout,
&self.content,
- self.font.clone(),
self.size,
- self.color,
+ self.font.clone(),
+ theme.appearance(self.style),
self.horizontal_alignment,
self.vertical_alignment,
);
@@ -165,9 +181,9 @@ pub fn draw<Renderer>(
style: &renderer::Style,
layout: Layout<'_>,
content: &str,
- font: Renderer::Font,
size: Option<u16>,
- color: Option<Color>,
+ font: Renderer::Font,
+ appearance: Appearance,
horizontal_alignment: alignment::Horizontal,
vertical_alignment: alignment::Vertical,
) where
@@ -191,7 +207,7 @@ pub fn draw<Renderer>(
content,
size: f32::from(size.unwrap_or(renderer.default_size())),
bounds: Rectangle { x, y, ..bounds },
- color: color.unwrap_or(style.text_color),
+ color: appearance.color.unwrap_or(style.text_color),
font,
horizontal_alignment,
vertical_alignment,
@@ -202,23 +218,28 @@ impl<'a, Message, Renderer> From<Text<Renderer>>
for Element<'a, Message, Renderer>
where
Renderer: text::Renderer + 'a,
+ Renderer::Theme: StyleSheet,
{
fn from(text: Text<Renderer>) -> Element<'a, Message, Renderer> {
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 {
Self {
content: self.content.clone(),
size: self.size,
- color: self.color,
- font: self.font.clone(),
width: self.width,
height: self.height,
horizontal_alignment: self.horizontal_alignment,
vertical_alignment: self.vertical_alignment,
+ font: self.font.clone(),
+ style: self.style,
}
}
}
diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs
index 25391404..0936c271 100644
--- a/native/src/widget/toggler.rs
+++ b/native/src/widget/toggler.rs
@@ -5,7 +5,7 @@ use crate::layout;
use crate::mouse;
use crate::renderer;
use crate::text;
-use crate::widget::{Row, Text};
+use crate::widget::{self, Row, Text};
use crate::{
Alignment, Clipboard, Element, Event, Layout, Length, Point, Rectangle,
Shell, Widget,
@@ -136,7 +136,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
for Toggler<'a, Message, Renderer>
where
Renderer: text::Renderer,
- Renderer::Theme: StyleSheet,
+ Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{
fn width(&self) -> Length {
self.width
@@ -240,9 +240,9 @@ where
style,
label_layout,
&label,
- self.font.clone(),
self.text_size,
- None,
+ self.font.clone(),
+ Default::default(),
self.text_alignment,
alignment::Vertical::Center,
);
@@ -312,7 +312,7 @@ impl<'a, Message, Renderer> From<Toggler<'a, Message, Renderer>>
where
Message: 'a,
Renderer: 'a + text::Renderer,
- Renderer::Theme: StyleSheet,
+ Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{
fn from(
toggler: Toggler<'a, Message, Renderer>,
diff --git a/native/src/widget/tooltip.rs b/native/src/widget/tooltip.rs
index d034f648..0548e9da 100644
--- a/native/src/widget/tooltip.rs
+++ b/native/src/widget/tooltip.rs
@@ -4,6 +4,7 @@ use crate::layout;
use crate::mouse;
use crate::renderer;
use crate::text;
+use crate::widget;
use crate::widget::container;
use crate::widget::text::Text;
use crate::{
@@ -16,7 +17,7 @@ use crate::{
pub struct Tooltip<'a, Message, Renderer>
where
Renderer: text::Renderer,
- Renderer::Theme: container::StyleSheet,
+ Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{
content: Element<'a, Message, Renderer>,
tooltip: Text<Renderer>,
@@ -29,7 +30,7 @@ where
impl<'a, Message, Renderer> Tooltip<'a, Message, Renderer>
where
Renderer: text::Renderer,
- Renderer::Theme: container::StyleSheet,
+ Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{
/// The default padding of a [`Tooltip`] drawn by this renderer.
const DEFAULT_PADDING: u16 = 5;
@@ -224,7 +225,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
for Tooltip<'a, Message, Renderer>
where
Renderer: text::Renderer,
- Renderer::Theme: container::StyleSheet,
+ Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{
fn width(&self) -> Length {
self.content.width()
@@ -330,7 +331,7 @@ impl<'a, Message, Renderer> From<Tooltip<'a, Message, Renderer>>
where
Message: 'a,
Renderer: 'a + text::Renderer,
- Renderer::Theme: container::StyleSheet,
+ Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{
fn from(
tooltip: Tooltip<'a, Message, Renderer>,
diff --git a/pure/src/helpers.rs b/pure/src/helpers.rs
index 18791945..88598f9b 100644
--- a/pure/src/helpers.rs
+++ b/pure/src/helpers.rs
@@ -71,7 +71,7 @@ pub fn tooltip<'a, Message, Renderer>(
) -> widget::Tooltip<'a, Message, Renderer>
where
Renderer: iced_native::text::Renderer,
- Renderer::Theme: widget::container::StyleSheet,
+ Renderer::Theme: widget::container::StyleSheet + widget::text::StyleSheet,
{
widget::Tooltip::new(content, tooltip, position)
}
@@ -82,6 +82,7 @@ where
pub fn text<Renderer>(text: impl Into<String>) -> widget::Text<Renderer>
where
Renderer: iced_native::text::Renderer,
+ Renderer::Theme: widget::text::StyleSheet,
{
widget::Text::new(text)
}
@@ -96,7 +97,7 @@ pub fn checkbox<'a, Message, Renderer>(
) -> widget::Checkbox<'a, Message, Renderer>
where
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)
}
diff --git a/pure/src/widget.rs b/pure/src/widget.rs
index ab63f7cc..cd825ad8 100644
--- a/pure/src/widget.rs
+++ b/pure/src/widget.rs
@@ -11,6 +11,7 @@ pub mod rule;
pub mod scrollable;
pub mod slider;
pub mod svg;
+pub mod text;
pub mod text_input;
pub mod toggler;
pub mod tooltip;
@@ -19,7 +20,6 @@ pub mod tree;
mod column;
mod row;
mod space;
-mod text;
pub use button::Button;
pub use checkbox::Checkbox;
diff --git a/pure/src/widget/checkbox.rs b/pure/src/widget/checkbox.rs
index 4128876e..9d6a78ce 100644
--- a/pure/src/widget/checkbox.rs
+++ b/pure/src/widget/checkbox.rs
@@ -7,6 +7,7 @@ use iced_native::layout::{self, Layout};
use iced_native::mouse;
use iced_native::renderer;
use iced_native::text;
+use iced_native::widget;
use iced_native::{Clipboard, Length, Point, Rectangle, Shell};
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>
where
Renderer: text::Renderer,
- Renderer::Theme: StyleSheet,
+ Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{
fn width(&self) -> Length {
<Self as iced_native::Widget<Message, Renderer>>::width(self)
@@ -100,7 +101,7 @@ impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>>
where
Message: 'a,
Renderer: text::Renderer + 'a,
- Renderer::Theme: StyleSheet,
+ Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{
fn into(self) -> Element<'a, Message, Renderer> {
Element::new(self)
diff --git a/pure/src/widget/radio.rs b/pure/src/widget/radio.rs
index 9a8885e0..7a6ffbac 100644
--- a/pure/src/widget/radio.rs
+++ b/pure/src/widget/radio.rs
@@ -7,6 +7,7 @@ use iced_native::layout::{self, Layout};
use iced_native::mouse;
use iced_native::renderer;
use iced_native::text;
+use iced_native::widget;
use iced_native::{Clipboard, Length, Point, Rectangle, Shell};
pub use iced_native::widget::radio::{Appearance, Radio, StyleSheet};
@@ -15,7 +16,7 @@ impl<Message, Renderer> Widget<Message, Renderer> for Radio<Message, Renderer>
where
Message: Clone,
Renderer: text::Renderer,
- Renderer::Theme: StyleSheet,
+ Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{
fn width(&self) -> Length {
<Self as iced_native::Widget<Message, Renderer>>::width(self)
@@ -100,7 +101,7 @@ impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>>
where
Message: 'a + Clone,
Renderer: text::Renderer + 'a,
- Renderer::Theme: StyleSheet,
+ Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{
fn into(self) -> Element<'a, Message, Renderer> {
Element::new(self)
diff --git a/pure/src/widget/text.rs b/pure/src/widget/text.rs
index 0a51b628..23999a2c 100644
--- a/pure/src/widget/text.rs
+++ b/pure/src/widget/text.rs
@@ -1,16 +1,19 @@
+//! Write some text for your users to read.
use crate::widget::Tree;
use crate::{Element, Widget};
use iced_native::layout::{self, Layout};
use iced_native::renderer;
use iced_native::text;
+use iced_native::widget;
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>
where
Renderer: text::Renderer,
+ Renderer::Theme: widget::text::StyleSheet,
{
fn width(&self) -> Length {
<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>
where
Renderer: text::Renderer + 'a,
+ Renderer::Theme: widget::text::StyleSheet,
{
fn into(self) -> Element<'a, Message, Renderer> {
Element::new(self)
@@ -65,6 +69,7 @@ where
impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>> for &'a str
where
Renderer: text::Renderer + 'a,
+ Renderer::Theme: widget::text::StyleSheet,
{
fn into(self) -> Element<'a, Message, Renderer> {
Text::new(self).into()
diff --git a/pure/src/widget/toggler.rs b/pure/src/widget/toggler.rs
index fc01a2c9..5efa39ab 100644
--- a/pure/src/widget/toggler.rs
+++ b/pure/src/widget/toggler.rs
@@ -7,6 +7,7 @@ use iced_native::layout::{self, Layout};
use iced_native::mouse;
use iced_native::renderer;
use iced_native::text;
+use iced_native::widget;
use iced_native::{Clipboard, Length, Point, Rectangle, Shell};
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>
where
Renderer: text::Renderer,
- Renderer::Theme: StyleSheet,
+ Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{
fn width(&self) -> Length {
<Self as iced_native::Widget<Message, Renderer>>::width(self)
@@ -100,7 +101,7 @@ impl<'a, Message, Renderer> Into<Element<'a, Message, Renderer>>
where
Message: 'a,
Renderer: text::Renderer + 'a,
- Renderer::Theme: StyleSheet,
+ Renderer::Theme: StyleSheet + widget::text::StyleSheet,
{
fn into(self) -> Element<'a, Message, Renderer> {
Element::new(self)
diff --git a/pure/src/widget/tooltip.rs b/pure/src/widget/tooltip.rs
index 745d100d..cbc34722 100644
--- a/pure/src/widget/tooltip.rs
+++ b/pure/src/widget/tooltip.rs
@@ -9,7 +9,7 @@ use iced_native::renderer;
use iced_native::text;
use iced_native::widget::container;
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};
pub use iced_style::container::{Appearance, StyleSheet};
@@ -20,7 +20,7 @@ pub use tooltip::Position;
pub struct Tooltip<'a, Message, Renderer: text::Renderer>
where
Renderer: text::Renderer,
- Renderer::Theme: container::StyleSheet,
+ Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{
content: Element<'a, Message, Renderer>,
tooltip: Text<Renderer>,
@@ -33,7 +33,7 @@ where
impl<'a, Message, Renderer> Tooltip<'a, Message, Renderer>
where
Renderer: text::Renderer,
- Renderer::Theme: container::StyleSheet,
+ Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{
/// The default padding of a [`Tooltip`] drawn by this renderer.
const DEFAULT_PADDING: u16 = 5;
@@ -96,7 +96,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>
for Tooltip<'a, Message, Renderer>
where
Renderer: text::Renderer,
- Renderer::Theme: container::StyleSheet,
+ Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{
fn children(&self) -> Vec<Tree> {
vec![Tree::new(&self.content)]
@@ -230,7 +230,7 @@ impl<'a, Message, Renderer> From<Tooltip<'a, Message, Renderer>>
where
Message: 'a,
Renderer: 'a + text::Renderer,
- Renderer::Theme: container::StyleSheet,
+ Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
{
fn from(
tooltip: Tooltip<'a, Message, Renderer>,
diff --git a/style/src/lib.rs b/style/src/lib.rs
index 4a0a6a14..ee426e98 100644
--- a/style/src/lib.rs
+++ b/style/src/lib.rs
@@ -21,6 +21,7 @@ pub mod radio;
pub mod rule;
pub mod scrollable;
pub mod slider;
+pub mod text;
pub mod text_input;
pub mod theme;
pub mod toggler;
diff --git a/style/src/text.rs b/style/src/text.rs
new file mode 100644
index 00000000..69a4ed85
--- /dev/null
+++ b/style/src/text.rs
@@ -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 }
+ }
+}
diff --git a/style/src/theme.rs b/style/src/theme.rs
index b1e18c55..0bae671e 100644
--- a/style/src/theme.rs
+++ b/style/src/theme.rs
@@ -14,6 +14,7 @@ use crate::radio;
use crate::rule;
use crate::scrollable;
use crate::slider;
+use crate::text;
use crate::text_input;
use crate::toggler;
@@ -602,6 +603,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
*/
impl text_input::StyleSheet for Theme {