Introduce StyleSheet for Text widget
This commit is contained in:
parent
c807abdfd7
commit
1dd1a2f97f
28 changed files with 183 additions and 87 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
),
|
||||
),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)),
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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>,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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]));
|
||||
/// ```
|
||||
///
|
||||
/// 
|
||||
#[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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>,
|
||||
|
|
|
|||
|
|
@ -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>,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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>,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
18
style/src/text.rs
Normal file
18
style/src/text.rs
Normal 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 }
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
@ -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
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue