summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector0193@gmail.com>2019-11-24 11:34:30 +0100
committerLibravatar GitHub <noreply@github.com>2019-11-24 11:34:30 +0100
commit149fd2aa1fa86858c7c1dcec8fd844caa78cec94 (patch)
treea199cf8d2caaf6aa60e48e93d6dd0688969d43b0 /core
parent9712b319bb7a32848001b96bd84977430f14b623 (diff)
parent47196c9007d12d3b3e0036ffabe3bf6d14ff4523 (diff)
downloadiced-149fd2aa1fa86858c7c1dcec8fd844caa78cec94.tar.gz
iced-149fd2aa1fa86858c7c1dcec8fd844caa78cec94.tar.bz2
iced-149fd2aa1fa86858c7c1dcec8fd844caa78cec94.zip
Merge pull request #65 from hecrj/improvement/docs
Documentation
Diffstat (limited to '')
-rw-r--r--core/src/align.rs40
-rw-r--r--core/src/background.rs2
-rw-r--r--core/src/color.rs3
-rw-r--r--core/src/command.rs23
-rw-r--r--core/src/font.rs10
-rw-r--r--core/src/length.rs12
-rw-r--r--core/src/lib.rs30
-rw-r--r--core/src/vector.rs7
-rw-r--r--core/src/widget.rs39
-rw-r--r--core/src/widget/button.rs124
-rw-r--r--core/src/widget/checkbox.rs78
-rw-r--r--core/src/widget/column.rs125
-rw-r--r--core/src/widget/container.rs84
-rw-r--r--core/src/widget/image.rs65
-rw-r--r--core/src/widget/radio.rs88
-rw-r--r--core/src/widget/row.rs120
-rw-r--r--core/src/widget/scrollable.rs140
-rw-r--r--core/src/widget/slider.rs123
-rw-r--r--core/src/widget/text.rs126
-rw-r--r--core/src/widget/text_input.rs156
20 files changed, 110 insertions, 1285 deletions
diff --git a/core/src/align.rs b/core/src/align.rs
index d6915086..8a59afa1 100644
--- a/core/src/align.rs
+++ b/core/src/align.rs
@@ -1,18 +1,38 @@
-/// Alignment on the cross axis of a container.
-///
-/// * On a [`Column`], it describes __horizontal__ alignment.
-/// * On a [`Row`], it describes __vertical__ alignment.
-///
-/// [`Column`]: widget/struct.Column.html
-/// [`Row`]: widget/struct.Row.html
+/// Alignment on an axis of a container.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Align {
- /// Align at the start of the cross axis.
+ /// Align at the start of the axis.
Start,
- /// Align at the center of the cross axis.
+ /// Align at the center of the axis.
Center,
- /// Align at the end of the cross axis.
+ /// Align at the end of the axis.
End,
}
+
+/// The horizontal alignment of some resource.
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum HorizontalAlignment {
+ /// Align left
+ Left,
+
+ /// Horizontally centered
+ Center,
+
+ /// Align right
+ Right,
+}
+
+/// The vertical alignment of some resource.
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum VerticalAlignment {
+ /// Align top
+ Top,
+
+ /// Vertically centered
+ Center,
+
+ /// Align bottom
+ Bottom,
+}
diff --git a/core/src/background.rs b/core/src/background.rs
index 59b67a2c..98047172 100644
--- a/core/src/background.rs
+++ b/core/src/background.rs
@@ -1,7 +1,9 @@
use crate::Color;
+/// The background of some element.
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Background {
+ /// A solid color
Color(Color),
// TODO: Add gradient and image variants
}
diff --git a/core/src/color.rs b/core/src/color.rs
index 150bd05b..ec48c185 100644
--- a/core/src/color.rs
+++ b/core/src/color.rs
@@ -25,6 +25,9 @@ impl Color {
a: 1.0,
};
+ /// Converts the [`Color`] into its linear values.
+ ///
+ /// [`Color`]: struct.Color.html
pub fn into_linear(self) -> [f32; 4] {
// As described in:
// https://en.wikipedia.org/wiki/SRGB#The_reverse_transformation
diff --git a/core/src/command.rs b/core/src/command.rs
index e1c865dd..14b48b5b 100644
--- a/core/src/command.rs
+++ b/core/src/command.rs
@@ -1,16 +1,30 @@
use futures::future::{BoxFuture, Future, FutureExt};
+/// A collection of async operations.
+///
+/// You should be able to turn a future easily into a [`Command`], either by
+/// using the `From` trait or [`Command::perform`].
+///
+/// [`Command`]: struct.Command.html
pub struct Command<T> {
futures: Vec<BoxFuture<'static, T>>,
}
impl<T> Command<T> {
+ /// Creates an empty [`Command`].
+ ///
+ /// In other words, a [`Command`] that does nothing.
+ ///
+ /// [`Command`]: struct.Command.html
pub fn none() -> Self {
Self {
futures: Vec::new(),
}
}
+ /// Creates a [`Command`] that performs the action of the given future.
+ ///
+ /// [`Command`]: struct.Command.html
pub fn perform<A>(
future: impl Future<Output = T> + 'static + Send,
f: impl Fn(T) -> A + 'static + Send,
@@ -20,12 +34,21 @@ impl<T> Command<T> {
}
}
+ /// Creates a [`Command`] that performs the actions of all the givens
+ /// futures.
+ ///
+ /// Once this command is run, all the futures will be exectued at once.
+ ///
+ /// [`Command`]: struct.Command.html
pub fn batch(commands: impl Iterator<Item = Command<T>>) -> Self {
Self {
futures: commands.flat_map(|command| command.futures).collect(),
}
}
+ /// Converts a [`Command`] into its underlying list of futures.
+ ///
+ /// [`Command`]: struct.Command.html
pub fn futures(self) -> Vec<BoxFuture<'static, T>> {
self.futures
}
diff --git a/core/src/font.rs b/core/src/font.rs
index 75ba6a72..be49c825 100644
--- a/core/src/font.rs
+++ b/core/src/font.rs
@@ -1,8 +1,18 @@
+/// A font.
#[derive(Debug, Clone, Copy)]
pub enum Font {
+ /// The default font.
+ ///
+ /// This is normally a font configured in a renderer or loaded from the
+ /// system.
Default,
+
+ /// An external font.
External {
+ /// The name of the external font
name: &'static str,
+
+ /// The bytes of the external font
bytes: &'static [u8],
},
}
diff --git a/core/src/length.rs b/core/src/length.rs
index 73c227d8..63ba6207 100644
--- a/core/src/length.rs
+++ b/core/src/length.rs
@@ -1,12 +1,24 @@
/// The strategy used to fill space in a specific dimension.
#[derive(Debug, Clone, Copy, PartialEq, Hash)]
pub enum Length {
+ /// Fill all the remaining space
Fill,
+
+ /// Fill the least amount of space
Shrink,
+
+ /// Fill a fixed amount of space
Units(u16),
}
impl Length {
+ /// Returns the _fill factor_ of the [`Length`].
+ ///
+ /// The _fill factor_ is a relative unit describing how much of the
+ /// remaining space should be filled when compared to other elements. It
+ /// is only meant to be used by layout engines.
+ ///
+ /// [`Length`]: enum.Length.html
pub fn fill_factor(&self) -> u16 {
match self {
Length::Fill => 1,
diff --git a/core/src/lib.rs b/core/src/lib.rs
index 3816f8a2..65304e8b 100644
--- a/core/src/lib.rs
+++ b/core/src/lib.rs
@@ -1,24 +1,40 @@
-pub mod widget;
+//! The core library of [Iced].
+//!
+//! ![`iced_core` crate graph](https://github.com/hecrj/iced/blob/cae26cb7bc627f4a5b3bcf1cd023a0c552e8c65e/docs/graphs/core.png?raw=true)
+//!
+//! This library holds basic types that can be reused and re-exported in
+//! different runtime implementations. For instance, both [`iced_native`] and
+//! [`iced_web`] are built on top of `iced_core`.
+//!
+//! [Iced]: https://github.com/hecrj/iced
+//! [`iced_native`]: https://github.com/hecrj/iced/tree/master/native
+//! [`iced_web`]: https://github.com/hecrj/iced/tree/master/web
+#![deny(missing_docs)]
+#![deny(missing_debug_implementations)]
+#![deny(unused_results)]
+#![deny(unsafe_code)]
+#![deny(rust_2018_idioms)]
mod align;
mod background;
mod color;
-#[cfg(feature = "command")]
-mod command;
mod font;
mod length;
mod point;
mod rectangle;
mod vector;
-pub use align::Align;
+pub use align::{Align, HorizontalAlignment, VerticalAlignment};
pub use background::Background;
pub use color::Color;
-#[cfg(feature = "command")]
-pub use command::Command;
pub use font::Font;
pub use length::Length;
pub use point::Point;
pub use rectangle::Rectangle;
pub use vector::Vector;
-pub use widget::*;
+
+#[cfg(feature = "command")]
+mod command;
+
+#[cfg(feature = "command")]
+pub use command::Command;
diff --git a/core/src/vector.rs b/core/src/vector.rs
index 92bf64ff..7d87343a 100644
--- a/core/src/vector.rs
+++ b/core/src/vector.rs
@@ -1,7 +1,14 @@
/// A 2D vector.
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Vector<T = f32> {
+ /// The X component of the [`Vector`]
+ ///
+ /// [`Vector`]: struct.Vector.html
pub x: T,
+
+ /// The Y component of the [`Vector`]
+ ///
+ /// [`Vector`]: struct.Vector.html
pub y: T,
}
diff --git a/core/src/widget.rs b/core/src/widget.rs
deleted file mode 100644
index 9e629e4f..00000000
--- a/core/src/widget.rs
+++ /dev/null
@@ -1,39 +0,0 @@
-//! Use the essential widgets.
-//!
-//! # Re-exports
-//! For convenience, the contents of this module are available at the root
-//! module. Therefore, you can directly type:
-//!
-//! ```
-//! use iced_core::{button, Button};
-//! ```
-mod checkbox;
-mod column;
-mod container;
-mod image;
-mod radio;
-mod row;
-
-pub mod button;
-pub mod scrollable;
-pub mod slider;
-pub mod text;
-pub mod text_input;
-
-#[doc(no_inline)]
-pub use button::Button;
-#[doc(no_inline)]
-pub use scrollable::Scrollable;
-#[doc(no_inline)]
-pub use slider::Slider;
-#[doc(no_inline)]
-pub use text::Text;
-#[doc(no_inline)]
-pub use text_input::TextInput;
-
-pub use checkbox::Checkbox;
-pub use column::Column;
-pub use container::Container;
-pub use image::Image;
-pub use radio::Radio;
-pub use row::Row;
diff --git a/core/src/widget/button.rs b/core/src/widget/button.rs
deleted file mode 100644
index e7961284..00000000
--- a/core/src/widget/button.rs
+++ /dev/null
@@ -1,124 +0,0 @@
-//! Allow your users to perform actions by pressing a button.
-//!
-//! A [`Button`] has some local [`State`].
-//!
-//! [`Button`]: struct.Button.html
-//! [`State`]: struct.State.html
-
-use crate::{Background, Length};
-
-/// A generic widget that produces a message when clicked.
-pub struct Button<'a, Message, Element> {
- /// The current state of the button
- pub state: &'a mut State,
-
- pub content: Element,
-
- /// The message to produce when the button is pressed
- pub on_press: Option<Message>,
-
- pub width: Length,
-
- pub min_width: u32,
-
- pub padding: u16,
-
- pub background: Option<Background>,
-
- pub border_radius: u16,
-}
-
-impl<'a, Message, Element> std::fmt::Debug for Button<'a, Message, Element>
-where
- Message: std::fmt::Debug,
-{
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- f.debug_struct("Button")
- .field("state", &self.state)
- .field("on_press", &self.on_press)
- .finish()
- }
-}
-
-impl<'a, Message, Element> Button<'a, Message, Element> {
- /// Creates a new [`Button`] with some local [`State`] and the given label.
- ///
- /// [`Button`]: struct.Button.html
- /// [`State`]: struct.State.html
- pub fn new<E>(state: &'a mut State, content: E) -> Self
- where
- E: Into<Element>,
- {
- Button {
- state,
- content: content.into(),
- on_press: None,
- width: Length::Shrink,
- min_width: 0,
- padding: 0,
- background: None,
- border_radius: 0,
- }
- }
-
- /// Sets the width of the [`Button`].
- ///
- /// [`Button`]: struct.Button.html
- pub fn width(mut self, width: Length) -> Self {
- self.width = width;
- self
- }
-
- pub fn min_width(mut self, min_width: u32) -> Self {
- self.min_width = min_width;
- self
- }
-
- pub fn padding(mut self, padding: u16) -> Self {
- self.padding = padding;
- self
- }
-
- pub fn background(mut self, background: Background) -> Self {
- self.background = Some(background);
- self
- }
-
- pub fn border_radius(mut self, border_radius: u16) -> Self {
- self.border_radius = border_radius;
- self
- }
-
- /// Sets the message that will be produced when the [`Button`] is pressed.
- ///
- /// [`Button`]: struct.Button.html
- pub fn on_press(mut self, msg: Message) -> Self {
- self.on_press = Some(msg);
- self
- }
-}
-
-/// The local state of a [`Button`].
-///
-/// [`Button`]: struct.Button.html
-#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
-pub struct State {
- pub is_pressed: bool,
-}
-
-impl State {
- /// Creates a new [`State`].
- ///
- /// [`State`]: struct.State.html
- pub fn new() -> State {
- State::default()
- }
-
- /// Returns whether the associated [`Button`] is currently being pressed or
- /// not.
- ///
- /// [`Button`]: struct.Button.html
- pub fn is_pressed(&self) -> bool {
- self.is_pressed
- }
-}
diff --git a/core/src/widget/checkbox.rs b/core/src/widget/checkbox.rs
deleted file mode 100644
index 1f0a0c04..00000000
--- a/core/src/widget/checkbox.rs
+++ /dev/null
@@ -1,78 +0,0 @@
-//! Show toggle controls using checkboxes.
-use crate::Color;
-
-/// A box that can be checked.
-///
-/// # Example
-///
-/// ```
-/// use iced_core::Checkbox;
-///
-/// pub enum Message {
-/// CheckboxToggled(bool),
-/// }
-///
-/// let is_checked = true;
-///
-/// 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<Message> {
- /// Whether the checkbox is checked or not
- pub is_checked: bool,
-
- /// 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,
-
- /// The color of the label
- pub label_color: Option<Color>,
-}
-
-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)
- .field("label", &self.label)
- .field("label_color", &self.label_color)
- .finish()
- }
-}
-
-impl<Message> Checkbox<Message> {
- /// Creates a new [`Checkbox`].
- ///
- /// It expects:
- /// * a boolean describing whether the [`Checkbox`] is checked or not
- /// * the label of the [`Checkbox`]
- /// * a function that will be called when the [`Checkbox`] is toggled.
- /// It will receive the new state of the [`Checkbox`] and must produce
- /// a `Message`.
- ///
- /// [`Checkbox`]: struct.Checkbox.html
- pub fn new<F>(is_checked: bool, label: &str, f: F) -> Self
- where
- F: 'static + Fn(bool) -> Message,
- {
- Checkbox {
- is_checked,
- on_toggle: Box::new(f),
- label: String::from(label),
- label_color: None,
- }
- }
-
- /// Sets the color of the label of the [`Checkbox`].
- ///
- /// [`Checkbox`]: struct.Checkbox.html
- pub fn label_color<C: Into<Color>>(mut self, color: C) -> Self {
- self.label_color = Some(color.into());
- self
- }
-}
diff --git a/core/src/widget/column.rs b/core/src/widget/column.rs
deleted file mode 100644
index 4a97ad98..00000000
--- a/core/src/widget/column.rs
+++ /dev/null
@@ -1,125 +0,0 @@
-use crate::{Align, Length};
-
-use std::u32;
-
-/// A container that distributes its contents vertically.
-///
-/// A [`Column`] will try to fill the horizontal space of its container.
-///
-/// [`Column`]: struct.Column.html
-pub struct Column<Element> {
- pub spacing: u16,
- pub padding: u16,
- pub width: Length,
- pub height: Length,
- pub max_width: u32,
- pub max_height: u32,
- pub align_items: Align,
- pub children: Vec<Element>,
-}
-
-impl<Element> Column<Element> {
- /// Creates an empty [`Column`].
- ///
- /// [`Column`]: struct.Column.html
- pub fn new() -> Self {
- Column {
- spacing: 0,
- padding: 0,
- width: Length::Fill,
- height: Length::Shrink,
- max_width: u32::MAX,
- max_height: u32::MAX,
- align_items: Align::Start,
- children: Vec::new(),
- }
- }
-
- /// Sets the vertical spacing _between_ elements.
- ///
- /// Custom margins per element do not exist in Iced. You should use this
- /// method instead! While less flexible, it helps you keep spacing between
- /// elements consistent.
- pub fn spacing(mut self, units: u16) -> Self {
- self.spacing = units;
- self
- }
-
- /// Sets the padding of the [`Column`].
- ///
- /// [`Column`]: struct.Column.html
- pub fn padding(mut self, units: u16) -> Self {
- self.padding = units;
- self
- }
-
- /// Sets the width of the [`Column`].
- ///
- /// [`Column`]: struct.Column.html
- pub fn width(mut self, width: Length) -> Self {
- self.width = width;
- self
- }
-
- /// Sets the height of the [`Column`].
- ///
- /// [`Column`]: struct.Column.html
- pub fn height(mut self, height: Length) -> Self {
- self.height = height;
- self
- }
-
- /// Sets the maximum width of the [`Column`].
- ///
- /// [`Column`]: struct.Column.html
- pub fn max_width(mut self, max_width: u32) -> Self {
- self.max_width = max_width;
- self
- }
-
- /// Sets the maximum height of the [`Column`] in pixels.
- ///
- /// [`Column`]: struct.Column.html
- pub fn max_height(mut self, max_height: u32) -> Self {
- self.max_height = max_height;
- self
- }
-
- /// Sets the horizontal alignment of the contents of the [`Column`] .
- ///
- /// [`Column`]: struct.Column.html
- pub fn align_items(mut self, align: Align) -> Self {
- self.align_items = align;
- self
- }
-
- /// Adds an element to the [`Column`].
- ///
- /// [`Column`]: struct.Column.html
- pub fn push<E>(mut self, child: E) -> Column<Element>
- where
- E: Into<Element>,
- {
- self.children.push(child.into());
- self
- }
-}
-
-impl<Element> Default for Column<Element> {
- fn default() -> Self {
- Self::new()
- }
-}
-
-impl<Element> std::fmt::Debug for Column<Element>
-where
- Element: std::fmt::Debug,
-{
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- // TODO: Complete once stabilized
- f.debug_struct("Column")
- .field("spacing", &self.spacing)
- .field("children", &self.children)
- .finish()
- }
-}
diff --git a/core/src/widget/container.rs b/core/src/widget/container.rs
deleted file mode 100644
index 9bc92fe0..00000000
--- a/core/src/widget/container.rs
+++ /dev/null
@@ -1,84 +0,0 @@
-use crate::{Align, Length};
-
-use std::u32;
-
-#[derive(Debug)]
-pub struct Container<Element> {
- pub width: Length,
- pub height: Length,
- pub max_width: u32,
- pub max_height: u32,
- pub horizontal_alignment: Align,
- pub vertical_alignment: Align,
- pub content: Element,
-}
-
-impl<Element> Container<Element> {
- /// Creates an empty [`Container`].
- ///
- /// [`Container`]: struct.Container.html
- pub fn new<T>(content: T) -> Self
- where
- T: Into<Element>,
- {
- Container {
- width: Length::Shrink,
- height: Length::Shrink,
- max_width: u32::MAX,
- max_height: u32::MAX,
- horizontal_alignment: Align::Start,
- vertical_alignment: Align::Start,
- content: content.into(),
- }
- }
-
- /// Sets the width of the [`Container`].
- ///
- /// [`Container`]: struct.Container.html
- pub fn width(mut self, width: Length) -> Self {
- self.width = width;
- self
- }
-
- /// Sets the height of the [`Container`].
- ///
- /// [`Container`]: struct.Container.html
- pub fn height(mut self, height: Length) -> Self {
- self.height = height;
- self
- }
-
- /// Sets the maximum width of the [`Container`].
- ///
- /// [`Container`]: struct.Container.html
- pub fn max_width(mut self, max_width: u32) -> Self {
- self.max_width = max_width;
- self
- }
-
- /// Sets the maximum height of the [`Container`] in pixels.
- ///
- /// [`Container`]: struct.Container.html
- pub fn max_height(mut self, max_height: u32) -> Self {
- self.max_height = max_height;
- self
- }
-
- /// Centers the contents in the horizontal axis of the [`Container`].
- ///
- /// [`Container`]: struct.Container.html
- pub fn center_x(mut self) -> Self {
- self.horizontal_alignment = Align::Center;
-
- self
- }
-
- /// Centers the contents in the vertical axis of the [`Container`].
- ///
- /// [`Container`]: struct.Container.html
- pub fn center_y(mut self) -> Self {
- self.vertical_alignment = Align::Center;
-
- self
- }
-}
diff --git a/core/src/widget/image.rs b/core/src/widget/image.rs
deleted file mode 100644
index 996ab5e1..00000000
--- a/core/src/widget/image.rs
+++ /dev/null
@@ -1,65 +0,0 @@
-//! Display images in your user interface.
-
-use crate::{Length, Rectangle};
-
-/// A frame that displays an image while keeping aspect ratio.
-///
-/// # Example
-///
-/// ```
-/// use iced_core::Image;
-///
-/// let image = Image::new("resources/ferris.png");
-/// ```
-#[derive(Debug)]
-pub struct Image {
- /// The image path
- pub path: String,
-
- /// The part of the image to show
- pub clip: Option<Rectangle<u16>>,
-
- /// The width of the image
- pub width: Length,
-
- /// The height of the image
- pub height: Length,
-}
-
-impl Image {
- /// Creates a new [`Image`] with the given path.
- ///
- /// [`Image`]: struct.Image.html
- pub fn new<T: Into<String>>(path: T) -> Self {
- Image {
- path: path.into(),
- clip: None,
- width: Length::Shrink,
- height: Length::Shrink,
- }
- }
-
- /// Sets the portion of the [`Image`] to draw.
- ///
- /// [`Image`]: struct.Image.html
- pub fn clip(mut self, clip: Rectangle<u16>) -> Self {
- self.clip = Some(clip);
- self
- }
-
- /// Sets the width of the [`Image`] boundaries.
- ///
- /// [`Image`]: struct.Image.html
- pub fn width(mut self, width: Length) -> Self {
- self.width = width;
- self
- }
-
- /// Sets the height of the [`Image`] boundaries.
- ///
- /// [`Image`]: struct.Image.html
- pub fn height(mut self, height: Length) -> Self {
- self.height = height;
- self
- }
-}
diff --git a/core/src/widget/radio.rs b/core/src/widget/radio.rs
deleted file mode 100644
index 9765e928..00000000
--- a/core/src/widget/radio.rs
+++ /dev/null
@@ -1,88 +0,0 @@
-//! Create choices using radio buttons.
-use crate::Color;
-
-/// A circular button representing a choice.
-///
-/// # Example
-/// ```
-/// use iced_core::Radio;
-///
-/// #[derive(Debug, Clone, Copy, PartialEq, Eq)]
-/// pub enum Choice {
-/// A,
-/// B,
-/// }
-///
-/// #[derive(Debug, Clone, Copy)]
-/// pub enum Message {
-/// RadioSelected(Choice),
-/// }
-///
-/// let selected_choice = Some(Choice::A);
-///
-/// Radio::new(Choice::A, "This is A", selected_choice, Message::RadioSelected);
-///
-/// 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<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,
-
- /// The color of the label
- pub label_color: Option<Color>,
-}
-
-impl<Message> std::fmt::Debug for Radio<Message>
-where
- Message: std::fmt::Debug,
-{
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- f.debug_struct("Radio")
- .field("is_selected", &self.is_selected)
- .field("on_click", &self.on_click)
- .field("label", &self.label)
- .field("label_color", &self.label_color)
- .finish()
- }
-}
-
-impl<Message> Radio<Message> {
- /// Creates a new [`Radio`] button.
- ///
- /// It expects:
- /// * the value related to the [`Radio`] button
- /// * the label of the [`Radio`] button
- /// * the current selected value
- /// * a function that will be called when the [`Radio`] is selected. It
- /// receives the value of the radio and must produce a `Message`.
- ///
- /// [`Radio`]: struct.Radio.html
- pub fn new<F, V>(value: V, label: &str, selected: Option<V>, f: F) -> Self
- where
- V: Eq + Copy,
- F: 'static + Fn(V) -> Message,
- {
- Radio {
- is_selected: Some(value) == selected,
- on_click: f(value),
- label: String::from(label),
- label_color: None,
- }
- }
-
- /// Sets the `Color` of the label of the [`Radio`].
- ///
- /// [`Radio`]: struct.Radio.html
- pub fn label_color<C: Into<Color>>(mut self, color: C) -> Self {
- self.label_color = Some(color.into());
- self
- }
-}
diff --git a/core/src/widget/row.rs b/core/src/widget/row.rs
deleted file mode 100644
index 3d882b47..00000000
--- a/core/src/widget/row.rs
+++ /dev/null
@@ -1,120 +0,0 @@
-use crate::{Align, Length};
-
-use std::u32;
-
-/// A container that distributes its contents horizontally.
-///
-/// A [`Row`] will try to fill the horizontal space of its container.
-///
-/// [`Row`]: struct.Row.html
-pub struct Row<Element> {
- pub spacing: u16,
- pub padding: u16,
- pub width: Length,
- pub height: Length,
- pub max_width: u32,
- pub max_height: u32,
- pub align_items: Align,
- pub children: Vec<Element>,
-}
-
-impl<Element> Row<Element> {
- /// Creates an empty [`Row`].
- ///
- /// [`Row`]: struct.Row.html
- pub fn new() -> Self {
- Row {
- spacing: 0,
- padding: 0,
- width: Length::Fill,
- height: Length::Shrink,
- max_width: u32::MAX,
- max_height: u32::MAX,
- align_items: Align::Start,
- children: Vec::new(),
- }
- }
-
- /// Sets the horizontal spacing _between_ elements.
- ///
- /// Custom margins per element do not exist in Iced. You should use this
- /// method instead! While less flexible, it helps you keep spacing between
- /// elements consistent.
- pub fn spacing(mut self, units: u16) -> Self {
- self.spacing = units;
- self
- }
-
- /// Sets the padding of the [`Row`].
- ///
- /// [`Row`]: struct.Row.html
- pub fn padding(mut self, units: u16) -> Self {
- self.padding = units;
- self
- }
-
- /// Sets the width of the [`Row`].
- ///
- /// [`Row`]: struct.Row.html
- pub fn width(mut self, width: Length) -> Self {
- self.width = width;
- self
- }
-
- /// Sets the height of the [`Row`].
- ///
- /// [`Row`]: struct.Row.html
- pub fn height(mut self, height: Length) -> Self {
- self.height = height;
- self
- }
-
- /// Sets the maximum width of the [`Row`].
- ///
- /// [`Row`]: struct.Row.html
- pub fn max_width(mut self, max_width: u32) -> Self {
- self.max_width = max_width;
- self
- }
-
- /// Sets the maximum height of the [`Row`].
- ///
- /// [`Row`]: struct.Row.html
- pub fn max_height(mut self, max_height: u32) -> Self {
- self.max_height = max_height;
- self
- }
-
- /// Sets the vertical alignment of the contents of the [`Row`] .
- ///
- /// [`Row`]: struct.Row.html
- pub fn align_items(mut self, align: Align) -> Self {
- self.align_items = align;
- self
- }
-
- /// Adds an [`Element`] to the [`Row`].
- ///
- /// [`Element`]: ../struct.Element.html
- /// [`Row`]: struct.Row.html
- pub fn push<E>(mut self, child: E) -> Row<Element>
- where
- E: Into<Element>,
- {
- self.children.push(child.into());
- self
- }
-}
-
-impl<Element> std::fmt::Debug for Row<Element>
-where
- Element: std::fmt::Debug,
-{
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- // TODO: Complete once stabilized
- f.debug_struct("Row")
- .field("spacing", &self.spacing)
- .field("children", &self.children)
- .finish()
- }
-}
diff --git a/core/src/widget/scrollable.rs b/core/src/widget/scrollable.rs
deleted file mode 100644
index 7f2f0e99..00000000
--- a/core/src/widget/scrollable.rs
+++ /dev/null
@@ -1,140 +0,0 @@
-use crate::{Align, Column, Length, Point, Rectangle};
-
-use std::u32;
-
-#[derive(Debug)]
-pub struct Scrollable<'a, Element> {
- pub state: &'a mut State,
- pub height: Length,
- pub max_height: u32,
- pub content: Column<Element>,
-}
-
-impl<'a, Element> Scrollable<'a, Element> {
- pub fn new(state: &'a mut State) -> Self {
- Scrollable {
- state,
- height: Length::Shrink,
- max_height: u32::MAX,
- content: Column::new(),
- }
- }
-
- /// Sets the vertical spacing _between_ elements.
- ///
- /// Custom margins per element do not exist in Iced. You should use this
- /// method instead! While less flexible, it helps you keep spacing between
- /// elements consistent.
- pub fn spacing(mut self, units: u16) -> Self {
- self.content = self.content.spacing(units);
- self
- }
-
- /// Sets the padding of the [`Scrollable`].
- ///
- /// [`Scrollable`]: struct.Scrollable.html
- pub fn padding(mut self, units: u16) -> Self {
- self.content = self.content.padding(units);
- self
- }
-
- /// Sets the width of the [`Scrollable`].
- ///
- /// [`Scrollable`]: struct.Scrollable.html
- pub fn width(mut self, width: Length) -> Self {
- self.content = self.content.width(width);
- self
- }
-
- /// Sets the height of the [`Scrollable`].
- ///
- /// [`Scrollable`]: struct.Scrollable.html
- pub fn height(mut self, height: Length) -> Self {
- self.height = height;
- self
- }
-
- /// Sets the maximum width of the [`Scrollable`].
- ///
- /// [`Scrollable`]: struct.Scrollable.html
- pub fn max_width(mut self, max_width: u32) -> Self {
- self.content = self.content.max_width(max_width);
- self
- }
-
- /// Sets the maximum height of the [`Scrollable`] in pixels.
- ///
- /// [`Scrollable`]: struct.Scrollable.html
- pub fn max_height(mut self, max_height: u32) -> Self {
- self.max_height = max_height;
- self
- }
-
- /// Sets the horizontal alignment of the contents of the [`Scrollable`] .
- ///
- /// [`Scrollable`]: struct.Scrollable.html
- pub fn align_items(mut self, align_items: Align) -> Self {
- self.content = self.content.align_items(align_items);
- self
- }
-
- /// Adds an element to the [`Scrollable`].
- ///
- /// [`Scrollable`]: struct.Scrollable.html
- pub fn push<E>(mut self, child: E) -> Scrollable<'a, Element>
- where
- E: Into<Element>,
- {
- self.content = self.content.push(child);
- self
- }
-}
-
-#[derive(Debug, Clone, Copy, Default)]
-pub struct State {
- pub scrollbar_grabbed_at: Option<Point>,
- offset: u32,
-}
-
-impl State {
- pub fn new() -> Self {
- State::default()
- }
-
- pub fn scroll(
- &mut self,
- delta_y: f32,
- bounds: Rectangle,
- content_bounds: Rectangle,
- ) {
- if bounds.height >= content_bounds.height {
- return;
- }
-
- self.offset = (self.offset as i32 - delta_y.round() as i32)
- .max(0)
- .min((content_bounds.height - bounds.height) as i32)
- as u32;
- }
-
- pub fn scroll_to(
- &mut self,
- percentage: f32,
- bounds: Rectangle,
- content_bounds: Rectangle,
- ) {
- self.offset = ((content_bounds.height - bounds.height) * percentage)
- .max(0.0) as u32;
- }
-
- pub fn offset(&self, bounds: Rectangle, content_bounds: Rectangle) -> u32 {
- let hidden_content =
- (content_bounds.height - bounds.height).max(0.0).round() as u32;
-
- self.offset.min(hidden_content)
- }
-
- pub fn is_scrollbar_grabbed(&self) -> bool {
- self.scrollbar_grabbed_at.is_some()
- }
-}
diff --git a/core/src/widget/slider.rs b/core/src/widget/slider.rs
deleted file mode 100644
index b65e3991..00000000
--- a/core/src/widget/slider.rs
+++ /dev/null
@@ -1,123 +0,0 @@
-//! Display an interactive selector of a single value from a range of values.
-//!
-//! A [`Slider`] has some local [`State`].
-//!
-//! [`Slider`]: struct.Slider.html
-//! [`State`]: struct.State.html
-use crate::Length;
-
-use std::ops::RangeInclusive;
-use std::rc::Rc;
-
-/// An horizontal bar and a handle that selects a single value from a range of
-/// values.
-///
-/// A [`Slider`] will try to fill the horizontal space of its container.
-///
-/// [`Slider`]: struct.Slider.html
-///
-/// # Example
-/// ```
-/// use iced_core::{slider, Slider};
-///
-/// pub enum Message {
-/// SliderChanged(f32),
-/// }
-///
-/// let state = &mut slider::State::new();
-/// let value = 50.0;
-///
-/// Slider::new(state, 0.0..=100.0, value, Message::SliderChanged);
-/// ```
-///
-/// ![Slider drawn by Coffee's renderer](https://github.com/hecrj/coffee/blob/bda9818f823dfcb8a7ad0ff4940b4d4b387b5208/images/ui/slider.png?raw=true)
-pub struct Slider<'a, Message> {
- /// The state of the slider
- pub state: &'a mut State,
-
- /// The range of the slider
- pub range: RangeInclusive<f32>,
-
- /// The current value of the slider
- pub value: f32,
-
- /// The function to produce messages on change
- pub on_change: Rc<Box<dyn Fn(f32) -> Message>>,
-
- pub width: Length,
-}
-
-impl<'a, Message> std::fmt::Debug for Slider<'a, Message> {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- f.debug_struct("Slider")
- .field("state", &self.state)
- .field("range", &self.range)
- .field("value", &self.value)
- .finish()
- }
-}
-
-impl<'a, Message> Slider<'a, Message> {
- /// Creates a new [`Slider`].
- ///
- /// It expects:
- /// * the local [`State`] of the [`Slider`]
- /// * an inclusive range of possible values
- /// * the current value of the [`Slider`]
- /// * a function that will be called when the [`Slider`] is dragged.
- /// It receives the new value of the [`Slider`] and must produce a
- /// `Message`.
- ///
- /// [`Slider`]: struct.Slider.html
- /// [`State`]: struct.State.html
- pub fn new<F>(
- state: &'a mut State,
- range: RangeInclusive<f32>,
- value: f32,
- on_change: F,
- ) -> Self
- where
- F: 'static + Fn(f32) -> Message,
- {
- Slider {
- state,
- value: value.max(*range.start()).min(*range.end()),
- range,
- on_change: Rc::new(Box::new(on_change)),
- width: Length::Fill,
- }
- }
-
- /// Sets the width of the [`Slider`].
- ///
- /// [`Slider`]: struct.Slider.html
- pub fn width(mut self, width: Length) -> Self {
- self.width = width;
- self
- }
-}
-
-/// The local state of a [`Slider`].
-///
-/// [`Slider`]: struct.Slider.html
-#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
-pub struct State {
- pub is_dragging: bool,
-}
-
-impl State {
- /// Creates a new [`State`].
- ///
- /// [`State`]: struct.State.html
- pub fn new() -> State {
- State::default()
- }
-
- /// Returns whether the associated [`Slider`] is currently being dragged or
- /// not.
- ///
- /// [`Slider`]: struct.Slider.html
- pub fn is_dragging(&self) -> bool {
- self.is_dragging
- }
-}
diff --git a/core/src/widget/text.rs b/core/src/widget/text.rs
deleted file mode 100644
index 0996e7ff..00000000
--- a/core/src/widget/text.rs
+++ /dev/null
@@ -1,126 +0,0 @@
-//! Write some text for your users to read.
-use crate::{Color, Font, Length};
-
-/// A paragraph of text.
-///
-/// # Example
-///
-/// ```
-/// use iced_core::Text;
-///
-/// Text::new("I <3 iced!")
-/// .size(40);
-/// ```
-#[derive(Debug, Clone)]
-pub struct Text {
- pub content: String,
- pub size: Option<u16>,
- pub color: Option<Color>,
- pub font: Font,
- pub width: Length,
- pub height: Length,
- pub horizontal_alignment: HorizontalAlignment,
- pub vertical_alignment: VerticalAlignment,
-}
-
-impl Text {
- /// Create a new fragment of [`Text`] with the given contents.
- ///
- /// [`Text`]: struct.Text.html
- pub fn new(label: &str) -> Self {
- Text {
- content: String::from(label),
- size: None,
- color: None,
- font: Font::Default,
- width: Length::Fill,
- height: Length::Shrink,
- horizontal_alignment: HorizontalAlignment::Left,
- vertical_alignment: VerticalAlignment::Top,
- }
- }
-
- /// Sets the size of the [`Text`].
- ///
- /// [`Text`]: struct.Text.html
- pub fn size(mut self, size: u16) -> Self {
- self.size = Some(size);
- self
- }
-
- /// Sets the `Color` of the [`Text`].
- ///
- /// [`Text`]: struct.Text.html
- pub fn color<C: Into<Color>>(mut self, color: C) -> Self {
- self.color = Some(color.into());
- self
- }
-
- pub fn font(mut self, font: Font) -> Self {
- self.font = font;
- self
- }
-
- /// Sets the width of the [`Text`] boundaries.
- ///
- /// [`Text`]: struct.Text.html
- pub fn width(mut self, width: Length) -> Self {
- self.width = width;
- self
- }
-
- /// Sets the height of the [`Text`] boundaries.
- ///
- /// [`Text`]: struct.Text.html
- pub fn height(mut self, height: Length) -> Self {
- self.height = height;
- self
- }
-
- /// Sets the [`HorizontalAlignment`] of the [`Text`].
- ///
- /// [`Text`]: struct.Text.html
- /// [`HorizontalAlignment`]: enum.HorizontalAlignment.html
- pub fn horizontal_alignment(
- mut self,
- alignment: HorizontalAlignment,
- ) -> Self {
- self.horizontal_alignment = alignment;
- self
- }
-
- /// Sets the [`VerticalAlignment`] of the [`Text`].
- ///
- /// [`Text`]: struct.Text.html
- /// [`VerticalAlignment`]: enum.VerticalAlignment.html
- pub fn vertical_alignment(mut self, alignment: VerticalAlignment) -> Self {
- self.vertical_alignment = alignment;
- self
- }
-}
-
-/// The horizontal alignment of some resource.
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum HorizontalAlignment {
- /// Align left
- Left,
-
- /// Horizontally centered
- Center,
-
- /// Align right
- Right,
-}
-
-/// The vertical alignment of some resource.
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum VerticalAlignment {
- /// Align top
- Top,
-
- /// Vertically centered
- Center,
-
- /// Align bottom
- Bottom,
-}
diff --git a/core/src/widget/text_input.rs b/core/src/widget/text_input.rs
deleted file mode 100644
index 16c67954..00000000
--- a/core/src/widget/text_input.rs
+++ /dev/null
@@ -1,156 +0,0 @@
-use crate::Length;
-
-pub struct TextInput<'a, Message> {
- pub state: &'a mut State,
- pub placeholder: String,
- pub value: Value,
- pub width: Length,
- pub max_width: Length,
- pub padding: u16,
- pub size: Option<u16>,
- pub on_change: Box<dyn Fn(String) -> Message>,
- pub on_submit: Option<Message>,
-}
-
-impl<'a, Message> TextInput<'a, Message> {
- pub fn new<F>(
- state: &'a mut State,
- placeholder: &str,
- value: &str,
- on_change: F,
- ) -> Self
- where
- F: 'static + Fn(String) -> Message,
- {
- Self {
- state,
- placeholder: String::from(placeholder),
- value: Value::new(value),
- width: Length::Fill,
- max_width: Length::Shrink,
- padding: 0,
- size: None,
- on_change: Box::new(on_change),
- on_submit: None,
- }
- }
-
- /// Sets the width of the [`TextInput`].
- ///
- /// [`TextInput`]: struct.TextInput.html
- pub fn width(mut self, width: Length) -> Self {
- self.width = width;
- self
- }
-
- /// Sets the maximum width of the [`TextInput`].
- ///
- /// [`TextInput`]: struct.TextInput.html
- pub fn max_width(mut self, max_width: Length) -> Self {
- self.max_width = max_width;
- self
- }
-
- /// Sets the padding of the [`TextInput`].
- ///
- /// [`TextInput`]: struct.TextInput.html
- pub fn padding(mut self, units: u16) -> Self {
- self.padding = units;
- self
- }
-
- pub fn size(mut self, size: u16) -> Self {
- self.size = Some(size);
- self
- }
-
- pub fn on_submit(mut self, message: Message) -> Self {
- self.on_submit = Some(message);
- self
- }
-}
-
-impl<'a, Message> std::fmt::Debug for TextInput<'a, Message>
-where
- Message: std::fmt::Debug,
-{
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- // TODO: Complete once stabilized
- f.debug_struct("TextInput").finish()
- }
-}
-
-#[derive(Debug, Default, Clone)]
-pub struct State {
- pub is_focused: bool,
- cursor_position: usize,
-}
-
-impl State {
- pub fn new() -> Self {
- Self::default()
- }
-
- pub fn focused() -> Self {
- use std::usize;
-
- Self {
- is_focused: true,
- cursor_position: usize::MAX,
- }
- }
-
- pub fn move_cursor_right(&mut self, value: &Value) {
- let current = self.cursor_position(value);
-
- if current < value.len() {
- self.cursor_position = current + 1;
- }
- }
-
- pub fn move_cursor_left(&mut self, value: &Value) {
- let current = self.cursor_position(value);
-
- if current > 0 {
- self.cursor_position = current - 1;
- }
- }
-
- pub fn move_cursor_to_end(&mut self, value: &Value) {
- self.cursor_position = value.len();
- }
-
- pub fn cursor_position(&self, value: &Value) -> usize {
- self.cursor_position.min(value.len())
- }
-}
-
-// TODO: Use `unicode-segmentation`
-pub struct Value(Vec<char>);
-
-impl Value {
- pub fn new(string: &str) -> Self {
- Self(string.chars().collect())
- }
-
- pub fn len(&self) -> usize {
- self.0.len()
- }
-
- pub fn until(&self, index: usize) -> Self {
- Self(self.0[..index.min(self.len())].to_vec())
- }
-
- pub fn to_string(&self) -> String {
- use std::iter::FromIterator;
- String::from_iter(self.0.iter())
- }
-
- pub fn insert(&mut self, index: usize, c: char) {
- self.0.insert(index, c);
- }
-
- pub fn remove(&mut self, index: usize) {
- self.0.remove(index);
- }
-}