summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-09-03 13:48:01 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-09-03 13:48:01 +0200
commitb08c999ac8346bfbe9d95d64c05c511a13baf895 (patch)
tree7681f86197804141e3d15044f4a12a22330825ac /src
parente79c69de897d88323cb8fb8327706e6449719d1b (diff)
parent52394732fc2a5c6152a938f1b2967c921bfef7be (diff)
downloadiced-b08c999ac8346bfbe9d95d64c05c511a13baf895.tar.gz
iced-b08c999ac8346bfbe9d95d64c05c511a13baf895.tar.bz2
iced-b08c999ac8346bfbe9d95d64c05c511a13baf895.zip
Merge branch 'image_and_progress-bar'
Diffstat (limited to 'src')
-rw-r--r--src/widget.rs4
-rw-r--r--src/widget/image.rs135
-rw-r--r--src/widget/progress_bar.rs109
3 files changed, 248 insertions, 0 deletions
diff --git a/src/widget.rs b/src/widget.rs
index c674b3e3..b8ecb409 100644
--- a/src/widget.rs
+++ b/src/widget.rs
@@ -25,13 +25,17 @@ mod row;
pub mod button;
pub mod checkbox;
+pub mod image;
+pub mod progress_bar;
pub mod radio;
pub mod slider;
pub mod text;
pub use button::Button;
pub use checkbox::Checkbox;
+pub use image::Image;
pub use column::Column;
+pub use progress_bar::ProgressBar;
pub use radio::Radio;
pub use row::Row;
pub use slider::Slider;
diff --git a/src/widget/image.rs b/src/widget/image.rs
new file mode 100644
index 00000000..500abe0d
--- /dev/null
+++ b/src/widget/image.rs
@@ -0,0 +1,135 @@
+//! Displays image to your users.
+
+use crate::{
+ Element, Hasher, Layout, MouseCursor, Node, Point, Rectangle, Style, Widget,
+};
+
+use std::hash::Hash;
+
+/// A widget that displays an image.
+///
+/// It implements [`Widget`] when the associated [`core::Renderer`] implements
+/// the [`image::Renderer`] trait.
+///
+/// [`Widget`]: ../../core/trait.Widget.html
+/// [`core::Renderer`]: ../../core/trait.Renderer.html
+/// [`image::Renderer`]: trait.Renderer.html
+/// # Example
+///
+/// ```
+/// use iced::Image;
+///
+/// # let my_handle = String::from("some_handle");
+/// let image = Image::new(my_handle);
+/// ```
+pub struct Image<I> {
+ image: I,
+ source: Option<Rectangle<u16>>,
+ style: Style,
+}
+
+impl<I> std::fmt::Debug for Image<I> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.debug_struct("Image")
+ .field("source", &self.source)
+ .field("style", &self.style)
+ .finish()
+ }
+}
+
+impl<I> Image<I> {
+ /// Creates a new [`Image`] with given image handle.
+ ///
+ /// [`Image`]: struct.Image.html
+ pub fn new(image: I) -> Self {
+ Image {
+ image,
+ source: None,
+ style: Style::default().fill_width().fill_height(),
+ }
+ }
+
+ /// Sets the portion of the [`Image`] that we want to draw.
+ ///
+ /// [`Image`]: struct.Image.html
+ pub fn clip(mut self, source: Rectangle<u16>) -> Self {
+ self.source = Some(source);
+ self
+ }
+
+ /// Sets the width of the [`Image`] boundaries in pixels.
+ ///
+ /// [`Image`]: struct.Image.html
+ pub fn width(mut self, width: u32) -> Self {
+ self.style = self.style.width(width);
+ self
+ }
+
+ /// Sets the height of the [`Image`] boundaries in pixels.
+ ///
+ /// [`Image`]: struct.Image.html
+ pub fn height(mut self, height: u32) -> Self {
+ self.style = self.style.height(height);
+ self
+ }
+}
+
+impl<I, Message, Renderer> Widget<Message, Renderer> for Image<I>
+where
+ Renderer: self::Renderer<I>,
+ I: Clone,
+{
+ fn node(&self, _renderer: &Renderer) -> Node {
+ Node::new(self.style)
+ }
+
+ fn draw(
+ &self,
+ renderer: &mut Renderer,
+ layout: Layout<'_>,
+ _cursor_position: Point,
+ ) -> MouseCursor {
+ renderer.draw(layout.bounds(), self.image.clone(), self.source);
+
+ MouseCursor::OutOfBounds
+ }
+
+ fn hash(&self, state: &mut Hasher) {
+ self.style.hash(state);
+ }
+}
+
+/// The renderer of a [`Image`].
+///
+/// Your [`core::Renderer`] will need to implement this trait before being
+/// able to use a [`Image`] in your user interface.
+///
+/// [`Image`]: struct.Image.html
+/// [`core::Renderer`]: ../../core/trait.Renderer.html
+pub trait Renderer<I> {
+ /// Draws a [`Image`].
+ ///
+ /// It receives:
+ /// * the bounds of the [`Image`]
+ /// * the handle of the loaded [`Image`]
+ /// * the portion of the image that we wants to draw,
+ /// if not specified, draw entire image
+ ///
+ /// [`Image`]: struct.Image.html
+ fn draw(
+ &mut self,
+ bounds: Rectangle<f32>,
+ image: I,
+ source: Option<Rectangle<u16>>,
+ );
+}
+
+impl<'a, I, Message, Renderer> From<Image<I>> for Element<'a, Message, Renderer>
+where
+ Renderer: self::Renderer<I>,
+ I: Clone + 'a,
+{
+ fn from(image: Image<I>) -> Element<'a, Message, Renderer> {
+ Element::new(image)
+ }
+}
diff --git a/src/widget/progress_bar.rs b/src/widget/progress_bar.rs
new file mode 100644
index 00000000..19e164f6
--- /dev/null
+++ b/src/widget/progress_bar.rs
@@ -0,0 +1,109 @@
+//! Displays action progress to your users.
+
+use crate::{
+ Element, Hasher, Layout, MouseCursor, Node, Point, Rectangle, Style, Widget,
+};
+
+use std::hash::Hash;
+
+/// A widget that displays a progress of an action.
+///
+/// It implements [`Widget`] when the associated [`core::Renderer`] implements
+/// the [`button::Renderer`] trait.
+///
+/// [`Widget`]: ../../core/trait.Widget.html
+/// [`core::Renderer`]: ../../core/trait.Renderer.html
+/// [`progress_bar::Renderer`]: trait.Renderer.html
+/// # Example
+///
+/// ```
+/// use iced::ProgressBar;
+///
+/// let progress = 0.75;
+///
+/// ProgressBar::new(progress);
+/// ```
+#[derive(Debug)]
+pub struct ProgressBar {
+ progress: f32,
+ style: Style,
+}
+
+impl ProgressBar {
+ /// Creates a new [`ProgressBar`] with given progress.
+ ///
+ /// [`ProgressBar`]: struct.ProgressBar.html
+ pub fn new(progress: f32) -> Self {
+ ProgressBar {
+ progress,
+ style: Style::default().fill_width(),
+ }
+ }
+
+ /// Sets the width of the [`ProgressBar`] in pixels.
+ ///
+ /// [`ProgressBar`]: struct.ProgressBar.html
+ pub fn width(mut self, width: u32) -> Self {
+ self.style = self.style.width(width);
+ self
+ }
+
+ /// Makes the [`ProgressBar`] fill the horizontal space of its container.
+ ///
+ /// [`ProgressBar`]: struct.ProgressBar.html
+ pub fn fill_width(mut self) -> Self {
+ self.style = self.style.fill_width();
+ self
+ }
+}
+
+impl<Message, Renderer> Widget<Message, Renderer> for ProgressBar
+where
+ Renderer: self::Renderer,
+{
+ fn node(&self, _renderer: &Renderer) -> Node {
+ Node::new(self.style.height(50))
+ }
+
+ fn draw(
+ &self,
+ renderer: &mut Renderer,
+ layout: Layout<'_>,
+ _cursor_position: Point,
+ ) -> MouseCursor {
+ renderer.draw(layout.bounds(), self.progress);
+
+ MouseCursor::OutOfBounds
+ }
+
+ fn hash(&self, state: &mut Hasher) {
+ self.style.hash(state);
+ }
+}
+
+/// The renderer of a [`ProgressBar`].
+///
+/// Your [`core::Renderer`] will need to implement this trait before being
+/// able to use a [`ProgressBar`] in your user interface.
+///
+/// [`ProgressBar`]: struct.ProgressBar.html
+/// [`core::Renderer`]: ../../core/trait.Renderer.html
+pub trait Renderer {
+ /// Draws a [`ProgressBar`].
+ ///
+ /// It receives:
+ /// * the bounds of the [`ProgressBar`]
+ /// * the progress of the [`ProgressBar`]
+ ///
+ /// [`ProgressBar`]: struct.ProgressBar.html
+ fn draw(&mut self, bounds: Rectangle<f32>, progress: f32);
+}
+
+impl<'a, Message, Renderer> From<ProgressBar> for Element<'a, Message, Renderer>
+where
+ Renderer: self::Renderer,
+{
+ fn from(progress_bar: ProgressBar) -> Element<'a, Message, Renderer> {
+ Element::new(progress_bar)
+ }
+}