summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-09-19 18:47:01 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-09-19 19:00:42 +0200
commitb83a4b42dd912b5f59d40e7d4f7f7ccdabc43019 (patch)
tree58cb04c5e6be38422c8767cabba938edc4988b75 /src
parentf9de39ddaa3020a9585b1648afb0ead45dfd7aa9 (diff)
downloadiced-b83a4b42dd912b5f59d40e7d4f7f7ccdabc43019.tar.gz
iced-b83a4b42dd912b5f59d40e7d4f7f7ccdabc43019.tar.bz2
iced-b83a4b42dd912b5f59d40e7d4f7f7ccdabc43019.zip
Remove generic `Color` in widgets
Diffstat (limited to 'src')
-rw-r--r--src/element.rs15
-rw-r--r--src/lib.rs6
-rw-r--r--src/renderer.rs11
-rw-r--r--src/widget/checkbox.rs57
-rw-r--r--src/widget/radio.rs49
-rw-r--r--src/widget/text.rs40
6 files changed, 73 insertions, 105 deletions
diff --git a/src/element.rs b/src/element.rs
index c13bf4a0..f6276fbf 100644
--- a/src/element.rs
+++ b/src/element.rs
@@ -1,7 +1,7 @@
use stretch::{geometry, result};
use crate::{
- renderer, Event, Hasher, Layout, MouseCursor, Node, Point, Widget,
+ renderer, Color, Event, Hasher, Layout, MouseCursor, Node, Point, Widget,
};
/// A generic [`Widget`].
@@ -210,16 +210,16 @@ impl<'a, Message, Renderer> Element<'a, Message, Renderer> {
///
/// [`Element`]: struct.Element.html
/// [`Renderer`]: trait.Renderer.html
- pub fn explain(
+ pub fn explain<C: Into<Color>>(
self,
- color: Renderer::Color,
+ color: C,
) -> Element<'a, Message, Renderer>
where
Message: 'static,
Renderer: 'a + renderer::Debugger,
{
Element {
- widget: Box::new(Explain::new(self, color)),
+ widget: Box::new(Explain::new(self, color.into())),
}
}
@@ -309,7 +309,7 @@ where
struct Explain<'a, Message, Renderer: renderer::Debugger> {
element: Element<'a, Message, Renderer>,
- color: Renderer::Color,
+ color: Color,
}
impl<'a, Message, Renderer> std::fmt::Debug for Explain<'a, Message, Renderer>
@@ -327,10 +327,7 @@ impl<'a, Message, Renderer> Explain<'a, Message, Renderer>
where
Renderer: renderer::Debugger,
{
- fn new(
- element: Element<'a, Message, Renderer>,
- color: Renderer::Color,
- ) -> Self {
+ fn new(element: Element<'a, Message, Renderer>, color: Color) -> Self {
Explain { element, color }
}
}
diff --git a/src/lib.rs b/src/lib.rs
index 56eee559..8dd6163e 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -78,7 +78,7 @@
//! # mod iced_wgpu {
//! # use iced::{
//! # button, text, text::HorizontalAlignment, text::VerticalAlignment,
-//! # MouseCursor, Node, Point, Rectangle, Style,
+//! # MouseCursor, Node, Point, Rectangle, Style, Color
//! # };
//! #
//! # pub struct Renderer {}
@@ -96,7 +96,7 @@
//! # }
//! # }
//! #
-//! # impl text::Renderer<[f32; 4]> for Renderer {
+//! # impl text::Renderer for Renderer {
//! # fn node(&self, style: Style, _content: &str, _size: Option<u16>) -> Node {
//! # Node::new(style)
//! # }
@@ -106,7 +106,7 @@
//! # _bounds: Rectangle,
//! # _content: &str,
//! # _size: Option<u16>,
-//! # _color: Option<[f32; 4]>,
+//! # _color: Option<Color>,
//! # _horizontal_alignment: HorizontalAlignment,
//! # _vertical_alignment: VerticalAlignment,
//! # ) {
diff --git a/src/renderer.rs b/src/renderer.rs
index b445190b..2244f00b 100644
--- a/src/renderer.rs
+++ b/src/renderer.rs
@@ -17,19 +17,12 @@
//! [`text::Renderer`]: ../widget/text/trait.Renderer.html
//! [`Checkbox`]: ../widget/checkbox/struct.Checkbox.html
//! [`checkbox::Renderer`]: ../widget/checkbox/trait.Renderer.html
-use crate::Layout;
+use crate::{Color, Layout};
/// A renderer able to graphically explain a [`Layout`].
///
/// [`Layout`]: ../struct.Layout.html
pub trait Debugger {
- /// The color type that will be used to configure the _explanation_.
- ///
- /// This is the type that will be asked in [`Element::explain`].
- ///
- /// [`Element::explain`]: ../struct.Element.html#method.explain
- type Color: Copy;
-
/// Explains the [`Layout`] of an [`Element`] for debugging purposes.
///
/// This will be called when [`Element::explain`] has been used. It should
@@ -41,5 +34,5 @@ pub trait Debugger {
/// [`Layout`]: struct.Layout.html
/// [`Element`]: struct.Element.html
/// [`Element::explain`]: struct.Element.html#method.explain
- fn explain(&mut self, layout: &Layout<'_>, color: Self::Color);
+ fn explain(&mut self, layout: &Layout<'_>, color: Color);
}
diff --git a/src/widget/checkbox.rs b/src/widget/checkbox.rs
index 6c13252d..48400fae 100644
--- a/src/widget/checkbox.rs
+++ b/src/widget/checkbox.rs
@@ -4,11 +4,11 @@ use std::hash::Hash;
use crate::input::{mouse, ButtonState};
use crate::widget::{text, Column, Row, Text};
use crate::{
- Align, Element, Event, Hasher, Layout, MouseCursor, Node, Point, Rectangle,
- Widget,
+ Align, Color, Element, Event, Hasher, Layout, MouseCursor, Node, Point,
+ Rectangle, Widget,
};
-/// A box that can be checked, with a generic text `Color`.
+/// A box that can be checked.
///
/// It implements [`Widget`] when the associated `Renderer` implements the
/// [`checkbox::Renderer`] trait.
@@ -19,12 +19,7 @@ use crate::{
/// # Example
///
/// ```
-/// use iced::Checkbox;
-///
-/// #[derive(Debug, Clone, Copy)]
-/// pub enum Color {
-/// Black,
-/// }
+/// use iced::{Checkbox, Color};
///
/// pub enum Message {
/// CheckboxToggled(bool),
@@ -32,25 +27,28 @@ use crate::{
///
/// let is_checked = true;
///
-/// Checkbox::new(is_checked, "Toggle me!", Message::CheckboxToggled)
-/// .label_color(Color::Black);
+/// Checkbox::new(is_checked, "Toggle me!", Message::CheckboxToggled);
/// ```
///
/// ![Checkbox drawn by Coffee's renderer](https://github.com/hecrj/coffee/blob/bda9818f823dfcb8a7ad0ff4940b4d4b387b5208/images/ui/checkbox.png?raw=true)
-pub struct Checkbox<Color, Message> {
+pub struct Checkbox<Message> {
/// Whether the checkbox is checked or not
pub is_checked: bool,
- /// Toggle message to fire
+
+ /// Function to call when checkbox is toggled to produce a __message__.
+ ///
+ /// The function should be provided `true` when the checkbox is checked
+ /// and `false` otherwise.
pub on_toggle: Box<dyn Fn(bool) -> Message>,
+
/// The label of the checkbox
pub label: String,
- label_color: Option<Color>,
+
+ /// The color of the label
+ pub label_color: Option<Color>,
}
-impl<Color, Message> std::fmt::Debug for Checkbox<Color, Message>
-where
- Color: std::fmt::Debug,
-{
+impl<Message> std::fmt::Debug for Checkbox<Message> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Checkbox")
.field("is_checked", &self.is_checked)
@@ -60,7 +58,7 @@ where
}
}
-impl<Color, Message> Checkbox<Color, Message> {
+impl<Message> Checkbox<Message> {
/// Creates a new [`Checkbox`].
///
/// It expects:
@@ -83,20 +81,18 @@ impl<Color, Message> Checkbox<Color, Message> {
}
}
- /// Sets the `Color` of the label of the [`Checkbox`].
+ /// Sets the color of the label of the [`Checkbox`].
///
/// [`Checkbox`]: struct.Checkbox.html
- pub fn label_color(mut self, color: Color) -> Self {
- self.label_color = Some(color);
+ pub fn label_color<C: Into<Color>>(mut self, color: C) -> Self {
+ self.label_color = Some(color.into());
self
}
}
-impl<Color, Message, Renderer> Widget<Message, Renderer>
- for Checkbox<Color, Message>
+impl<Message, Renderer> Widget<Message, Renderer> for Checkbox<Message>
where
- Color: 'static + Copy + std::fmt::Debug,
- Renderer: self::Renderer + text::Renderer<Color>,
+ Renderer: self::Renderer + text::Renderer,
{
fn node(&self, renderer: &mut Renderer) -> Node {
Row::<(), Renderer>::new()
@@ -191,16 +187,13 @@ pub trait Renderer {
) -> MouseCursor;
}
-impl<'a, Color, Message, Renderer> From<Checkbox<Color, Message>>
+impl<'a, Message, Renderer> From<Checkbox<Message>>
for Element<'a, Message, Renderer>
where
- Color: 'static + Copy + std::fmt::Debug,
- Renderer: self::Renderer + text::Renderer<Color>,
+ Renderer: self::Renderer + text::Renderer,
Message: 'static,
{
- fn from(
- checkbox: Checkbox<Color, Message>,
- ) -> Element<'a, Message, Renderer> {
+ fn from(checkbox: Checkbox<Message>) -> Element<'a, Message, Renderer> {
Element::new(checkbox)
}
}
diff --git a/src/widget/radio.rs b/src/widget/radio.rs
index ba082ef5..048aea94 100644
--- a/src/widget/radio.rs
+++ b/src/widget/radio.rs
@@ -2,13 +2,13 @@
use crate::input::{mouse, ButtonState};
use crate::widget::{text, Column, Row, Text};
use crate::{
- Align, Element, Event, Hasher, Layout, MouseCursor, Node, Point, Rectangle,
- Widget,
+ Align, Color, Element, Event, Hasher, Layout, MouseCursor, Node, Point,
+ Rectangle, Widget,
};
use std::hash::Hash;
-/// A circular button representing a choice, with a generic text `Color`.
+/// A circular button representing a choice.
///
/// It implements [`Widget`] when the associated `Renderer` implements the
/// [`radio::Renderer`] trait.
@@ -18,12 +18,7 @@ use std::hash::Hash;
///
/// # Example
/// ```
-/// use iced::{Column, Radio};
-///
-/// #[derive(Debug, Clone, Copy)]
-/// pub enum Color {
-/// Black,
-/// }
+/// use iced::Radio;
///
/// #[derive(Debug, Clone, Copy, PartialEq, Eq)]
/// pub enum Choice {
@@ -38,27 +33,28 @@ use std::hash::Hash;
///
/// let selected_choice = Some(Choice::A);
///
-/// Radio::new(Choice::A, "This is A", selected_choice, Message::RadioSelected)
-/// .label_color(Color::Black);
+/// Radio::new(Choice::A, "This is A", selected_choice, Message::RadioSelected);
///
-/// Radio::new(Choice::B, "This is B", selected_choice, Message::RadioSelected)
-/// .label_color(Color::Black);
+/// Radio::new(Choice::B, "This is B", selected_choice, Message::RadioSelected);
/// ```
///
/// ![Radio buttons drawn by Coffee's renderer](https://github.com/hecrj/coffee/blob/bda9818f823dfcb8a7ad0ff4940b4d4b387b5208/images/ui/radio.png?raw=true)
-pub struct Radio<Color, Message> {
+pub struct Radio<Message> {
/// Whether the radio button is selected or not
pub is_selected: bool,
+
/// The message to produce when the radio button is clicked
pub on_click: Message,
+
/// The label of the radio button
pub label: String,
- label_color: Option<Color>,
+
+ /// The color of the label
+ pub label_color: Option<Color>,
}
-impl<Color, Message> std::fmt::Debug for Radio<Color, Message>
+impl<Message> std::fmt::Debug for Radio<Message>
where
- Color: std::fmt::Debug,
Message: std::fmt::Debug,
{
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
@@ -71,7 +67,7 @@ where
}
}
-impl<Color, Message> Radio<Color, Message> {
+impl<Message> Radio<Message> {
/// Creates a new [`Radio`] button.
///
/// It expects:
@@ -98,17 +94,15 @@ impl<Color, Message> Radio<Color, Message> {
/// Sets the `Color` of the label of the [`Radio`].
///
/// [`Radio`]: struct.Radio.html
- pub fn label_color(mut self, color: Color) -> Self {
- self.label_color = Some(color);
+ pub fn label_color<C: Into<Color>>(mut self, color: C) -> Self {
+ self.label_color = Some(color.into());
self
}
}
-impl<Color, Message, Renderer> Widget<Message, Renderer>
- for Radio<Color, Message>
+impl<Message, Renderer> Widget<Message, Renderer> for Radio<Message>
where
- Color: 'static + Copy + std::fmt::Debug,
- Renderer: self::Renderer + text::Renderer<Color>,
+ Renderer: self::Renderer + text::Renderer,
Message: Copy + std::fmt::Debug,
{
fn node(&self, renderer: &mut Renderer) -> Node {
@@ -201,14 +195,13 @@ pub trait Renderer {
) -> MouseCursor;
}
-impl<'a, Color, Message, Renderer> From<Radio<Color, Message>>
+impl<'a, Message, Renderer> From<Radio<Message>>
for Element<'a, Message, Renderer>
where
- Color: 'static + Copy + std::fmt::Debug,
- Renderer: self::Renderer + text::Renderer<Color>,
+ Renderer: self::Renderer + text::Renderer,
Message: 'static + Copy + std::fmt::Debug,
{
- fn from(checkbox: Radio<Color, Message>) -> Element<'a, Message, Renderer> {
+ fn from(checkbox: Radio<Message>) -> Element<'a, Message, Renderer> {
Element::new(checkbox)
}
}
diff --git a/src/widget/text.rs b/src/widget/text.rs
index 457a6814..4ef10d52 100644
--- a/src/widget/text.rs
+++ b/src/widget/text.rs
@@ -1,11 +1,12 @@
//! Write some text for your users to read.
use crate::{
- Element, Hasher, Layout, MouseCursor, Node, Point, Rectangle, Style, Widget,
+ Color, Element, Hasher, Layout, MouseCursor, Node, Point, Rectangle, Style,
+ Widget,
};
use std::hash::Hash;
-/// A fragment of text with a generic `Color`.
+/// A paragraph of text.
///
/// It implements [`Widget`] when the associated `Renderer` implements the
/// [`text::Renderer`] trait.
@@ -16,19 +17,13 @@ use std::hash::Hash;
/// # Example
///
/// ```
-/// use iced::Text;
-///
-/// #[derive(Debug, Clone, Copy)]
-/// pub enum Color {
-/// Black,
-/// }
+/// use iced::{Text, Color};
///
/// Text::new("I <3 iced!")
-/// .size(40)
-/// .color(Color::Black);
+/// .size(40);
/// ```
#[derive(Debug, Clone)]
-pub struct Text<Color> {
+pub struct Text {
/// The text contents
pub content: String,
/// The text size
@@ -39,7 +34,7 @@ pub struct Text<Color> {
vertical_alignment: VerticalAlignment,
}
-impl<Color> Text<Color> {
+impl Text {
/// Create a new fragment of [`Text`] with the given contents.
///
/// [`Text`]: struct.Text.html
@@ -65,8 +60,8 @@ impl<Color> Text<Color> {
/// Sets the `Color` of the [`Text`].
///
/// [`Text`]: struct.Text.html
- pub fn color(mut self, color: Color) -> Self {
- self.color = Some(color);
+ pub fn color<C: Into<Color>>(mut self, color: C) -> Self {
+ self.color = Some(color.into());
self
}
@@ -108,10 +103,9 @@ impl<Color> Text<Color> {
}
}
-impl<Message, Renderer, Color> Widget<Message, Renderer> for Text<Color>
+impl<Message, Renderer> Widget<Message, Renderer> for Text
where
- Color: Copy + std::fmt::Debug,
- Renderer: self::Renderer<Color>,
+ Renderer: self::Renderer,
{
fn node(&self, renderer: &mut Renderer) -> Node {
renderer.node(self.style, &self.content, self.size)
@@ -143,7 +137,7 @@ where
}
}
-/// The renderer of a [`Text`] fragment with a generic `Color`.
+/// The renderer of a [`Text`] fragment.
///
/// Your [renderer] will need to implement this trait before being
/// able to use [`Text`] in your [`UserInterface`].
@@ -151,7 +145,7 @@ where
/// [`Text`]: struct.Text.html
/// [renderer]: ../../renderer/index.html
/// [`UserInterface`]: ../../struct.UserInterface.html
-pub trait Renderer<Color> {
+pub trait Renderer {
/// Creates a [`Node`] with the given [`Style`] for the provided [`Text`]
/// contents and size.
///
@@ -188,13 +182,11 @@ pub trait Renderer<Color> {
);
}
-impl<'a, Message, Renderer, Color> From<Text<Color>>
- for Element<'a, Message, Renderer>
+impl<'a, Message, Renderer> From<Text> for Element<'a, Message, Renderer>
where
- Color: 'static + Copy + std::fmt::Debug,
- Renderer: self::Renderer<Color>,
+ Renderer: self::Renderer,
{
- fn from(text: Text<Color>) -> Element<'a, Message, Renderer> {
+ fn from(text: Text) -> Element<'a, Message, Renderer> {
Element::new(text)
}
}