From bf74e6e7d47a012a9c592a9da044f8d3bf9efbce Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 30 Dec 2019 19:16:46 +0100 Subject: Implement `Default` for `MouseCursor` --- native/src/mouse_cursor.rs | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'native') diff --git a/native/src/mouse_cursor.rs b/native/src/mouse_cursor.rs index a4740a27..c7297e0e 100644 --- a/native/src/mouse_cursor.rs +++ b/native/src/mouse_cursor.rs @@ -22,3 +22,9 @@ pub enum MouseCursor { /// The cursor is over a text widget. Text, } + +impl Default for MouseCursor { + fn default() -> MouseCursor { + MouseCursor::OutOfBounds + } +} -- cgit From 8426bf953cb50f3b7fcb1e0ec8c2fdf22d2b01af Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 30 Dec 2019 19:20:59 +0100 Subject: Implement `Empty` widget It can be useful if you want to fill some space with nothing. --- native/src/widget.rs | 3 ++ native/src/widget/empty.rs | 103 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 native/src/widget/empty.rs (limited to 'native') diff --git a/native/src/widget.rs b/native/src/widget.rs index 26889280..b73f229e 100644 --- a/native/src/widget.rs +++ b/native/src/widget.rs @@ -24,6 +24,7 @@ pub mod button; pub mod checkbox; pub mod column; pub mod container; +pub mod empty; pub mod image; pub mod radio; pub mod row; @@ -42,6 +43,8 @@ pub use column::Column; #[doc(no_inline)] pub use container::Container; #[doc(no_inline)] +pub use empty::Empty; +#[doc(no_inline)] pub use image::Image; #[doc(no_inline)] pub use radio::Radio; diff --git a/native/src/widget/empty.rs b/native/src/widget/empty.rs new file mode 100644 index 00000000..f670048f --- /dev/null +++ b/native/src/widget/empty.rs @@ -0,0 +1,103 @@ +//! Distribute content vertically. +use std::hash::Hash; + +use crate::{ + layout, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget, +}; + +/// An amount of empty space. +/// +/// It can be useful if you want to fill some space with nothing. +/// +/// [`Empty`]: struct.Empty.html +#[derive(Debug)] +pub struct Empty { + width: Length, + height: Length, +} + +impl Empty { + /// Creates an amount of [`Empty`] space. + /// + /// [`Empty`]: struct.Empty.html + pub fn new() -> Self { + Empty { + width: Length::Shrink, + height: Length::Shrink, + } + } + + /// Sets the width of the [`Empty`] space. + /// + /// [`Empty`]: struct..html + pub fn width(mut self, width: Length) -> Self { + self.width = width; + self + } + + /// Sets the height of the [`Empty`] space. + /// + /// [`Empty`]: struct.Column.html + pub fn height(mut self, height: Length) -> Self { + self.height = height; + self + } +} + +impl<'a, Message, Renderer> Widget for Empty +where + Renderer: self::Renderer, +{ + fn width(&self) -> Length { + self.width + } + + fn height(&self) -> Length { + self.height + } + + fn layout( + &self, + _renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { + let limits = limits.width(self.width).height(self.height); + + layout::Node::new(limits.resolve(Size::ZERO)) + } + + fn draw( + &self, + renderer: &mut Renderer, + layout: Layout<'_>, + _cursor_position: Point, + ) -> Renderer::Output { + renderer.draw(layout.bounds()) + } + + fn hash_layout(&self, state: &mut Hasher) { + std::any::TypeId::of::().hash(state); + self.width.hash(state); + self.height.hash(state); + } +} + +/// The renderer of an amount of [`Empty`] space. +/// +/// [`Empty`]: struct.Empty.html +pub trait Renderer: crate::Renderer { + /// Draws an amount of [`Empty`] space. + /// + /// You should most likely return an empty primitive here. + fn draw(&mut self, bounds: Rectangle) -> Self::Output; +} + +impl<'a, Message, Renderer> From for Element<'a, Message, Renderer> +where + Renderer: self::Renderer, + Message: 'static, +{ + fn from(empty: Empty) -> Element<'a, Message, Renderer> { + Element::new(empty) + } +} -- cgit From aecc3ad1955b8433d1634ab1b975d2af20e772a1 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 30 Dec 2019 18:37:13 +0100 Subject: Add `Length::FillPortion` variant It allows to specify the amount of available space an element should take relative to other elements. --- native/src/layout/limits.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'native') diff --git a/native/src/layout/limits.rs b/native/src/layout/limits.rs index 2705a47d..a35f7ff7 100644 --- a/native/src/layout/limits.rs +++ b/native/src/layout/limits.rs @@ -52,7 +52,7 @@ impl Limits { Length::Shrink => { self.fill.width = self.min.width; } - Length::Fill => { + Length::Fill | Length::FillPortion(_) => { self.fill.width = self.fill.width.min(self.max.width); } Length::Units(units) => { @@ -76,7 +76,7 @@ impl Limits { Length::Shrink => { self.fill.height = self.min.height; } - Length::Fill => { + Length::Fill | Length::FillPortion(_) => { self.fill.height = self.fill.height.min(self.max.height); } Length::Units(units) => { -- cgit From 3a327e08e96d9588d145c32afe4f04f37a8f0f0f Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Mon, 30 Dec 2019 21:32:21 +0100 Subject: Rename `Empty` widget to `Space` --- native/src/widget.rs | 6 +-- native/src/widget/empty.rs | 103 -------------------------------------------- native/src/widget/space.rs | 104 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+), 106 deletions(-) delete mode 100644 native/src/widget/empty.rs create mode 100644 native/src/widget/space.rs (limited to 'native') diff --git a/native/src/widget.rs b/native/src/widget.rs index b73f229e..dcc99645 100644 --- a/native/src/widget.rs +++ b/native/src/widget.rs @@ -24,12 +24,12 @@ pub mod button; pub mod checkbox; pub mod column; pub mod container; -pub mod empty; pub mod image; pub mod radio; pub mod row; pub mod scrollable; pub mod slider; +pub mod space; pub mod svg; pub mod text; pub mod text_input; @@ -43,8 +43,6 @@ pub use column::Column; #[doc(no_inline)] pub use container::Container; #[doc(no_inline)] -pub use empty::Empty; -#[doc(no_inline)] pub use image::Image; #[doc(no_inline)] pub use radio::Radio; @@ -55,6 +53,8 @@ pub use scrollable::Scrollable; #[doc(no_inline)] pub use slider::Slider; #[doc(no_inline)] +pub use space::Space; +#[doc(no_inline)] pub use svg::Svg; #[doc(no_inline)] pub use text::Text; diff --git a/native/src/widget/empty.rs b/native/src/widget/empty.rs deleted file mode 100644 index f670048f..00000000 --- a/native/src/widget/empty.rs +++ /dev/null @@ -1,103 +0,0 @@ -//! Distribute content vertically. -use std::hash::Hash; - -use crate::{ - layout, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget, -}; - -/// An amount of empty space. -/// -/// It can be useful if you want to fill some space with nothing. -/// -/// [`Empty`]: struct.Empty.html -#[derive(Debug)] -pub struct Empty { - width: Length, - height: Length, -} - -impl Empty { - /// Creates an amount of [`Empty`] space. - /// - /// [`Empty`]: struct.Empty.html - pub fn new() -> Self { - Empty { - width: Length::Shrink, - height: Length::Shrink, - } - } - - /// Sets the width of the [`Empty`] space. - /// - /// [`Empty`]: struct..html - pub fn width(mut self, width: Length) -> Self { - self.width = width; - self - } - - /// Sets the height of the [`Empty`] space. - /// - /// [`Empty`]: struct.Column.html - pub fn height(mut self, height: Length) -> Self { - self.height = height; - self - } -} - -impl<'a, Message, Renderer> Widget for Empty -where - Renderer: self::Renderer, -{ - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - self.height - } - - fn layout( - &self, - _renderer: &Renderer, - limits: &layout::Limits, - ) -> layout::Node { - let limits = limits.width(self.width).height(self.height); - - layout::Node::new(limits.resolve(Size::ZERO)) - } - - fn draw( - &self, - renderer: &mut Renderer, - layout: Layout<'_>, - _cursor_position: Point, - ) -> Renderer::Output { - renderer.draw(layout.bounds()) - } - - fn hash_layout(&self, state: &mut Hasher) { - std::any::TypeId::of::().hash(state); - self.width.hash(state); - self.height.hash(state); - } -} - -/// The renderer of an amount of [`Empty`] space. -/// -/// [`Empty`]: struct.Empty.html -pub trait Renderer: crate::Renderer { - /// Draws an amount of [`Empty`] space. - /// - /// You should most likely return an empty primitive here. - fn draw(&mut self, bounds: Rectangle) -> Self::Output; -} - -impl<'a, Message, Renderer> From for Element<'a, Message, Renderer> -where - Renderer: self::Renderer, - Message: 'static, -{ - fn from(empty: Empty) -> Element<'a, Message, Renderer> { - Element::new(empty) - } -} diff --git a/native/src/widget/space.rs b/native/src/widget/space.rs new file mode 100644 index 00000000..2029c52f --- /dev/null +++ b/native/src/widget/space.rs @@ -0,0 +1,104 @@ +//! Distribute content vertically. +use std::hash::Hash; + +use crate::{ + layout, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget, +}; + +/// An amount of empty space. +/// +/// It can be useful if you want to fill some space with nothing. +#[derive(Debug)] +pub struct Space { + width: Length, + height: Length, +} + +impl Space { + /// Creates an amount of empty [`Space`] with the given width and height. + /// + /// [`Space`]: struct.Space.html + pub fn new(width: Length, height: Length) -> Self { + Space { width, height } + } + + /// Creates an amount of horizontal [`Space`]. + /// + /// [`Space`]: struct.Space.html + pub fn with_width(width: Length) -> Self { + Space { + width, + height: Length::Shrink, + } + } + + /// Creates an amount of vertical [`Space`]. + /// + /// [`Space`]: struct.Space.html + pub fn with_height(height: Length) -> Self { + Space { + width: Length::Shrink, + height, + } + } +} + +impl<'a, Message, Renderer> Widget for Space +where + Renderer: self::Renderer, +{ + fn width(&self) -> Length { + self.width + } + + fn height(&self) -> Length { + self.height + } + + fn layout( + &self, + _renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { + let limits = limits.width(self.width).height(self.height); + + layout::Node::new(limits.resolve(Size::ZERO)) + } + + fn draw( + &self, + renderer: &mut Renderer, + layout: Layout<'_>, + _cursor_position: Point, + ) -> Renderer::Output { + renderer.draw(layout.bounds()) + } + + fn hash_layout(&self, state: &mut Hasher) { + std::any::TypeId::of::().hash(state); + self.width.hash(state); + self.height.hash(state); + } +} + +/// The renderer of an amount of [`Space`]. +/// +/// [`Space`]: struct.Space.html +pub trait Renderer: crate::Renderer { + /// Draws an amount of empty [`Space`]. + /// + /// You should most likely return an empty primitive here. + /// + /// [`Space`]: struct.Space.html + fn draw(&mut self, bounds: Rectangle) -> Self::Output; +} + +impl<'a, Message, Renderer> From for Element<'a, Message, Renderer> +where + Renderer: self::Renderer, + Message: 'static, +{ + fn from(space: Space) -> Element<'a, Message, Renderer> { + Element::new(space) + } +} -- cgit From d60f3b89a75f5b2ad8e6fb17827f5574a0a44bd1 Mon Sep 17 00:00:00 2001 From: Songtronix Date: Wed, 1 Jan 2020 17:27:14 +0100 Subject: add(widget): primitive progressbar widget --- native/src/widget.rs | 3 + native/src/widget/progressbar.rs | 135 +++++++++++++++++++++++++++++++++++++++ native/src/widget/text_input.rs | 3 +- 3 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 native/src/widget/progressbar.rs (limited to 'native') diff --git a/native/src/widget.rs b/native/src/widget.rs index dcc99645..d899da58 100644 --- a/native/src/widget.rs +++ b/native/src/widget.rs @@ -25,6 +25,7 @@ pub mod checkbox; pub mod column; pub mod container; pub mod image; +pub mod progressbar; pub mod radio; pub mod row; pub mod scrollable; @@ -45,6 +46,8 @@ pub use container::Container; #[doc(no_inline)] pub use image::Image; #[doc(no_inline)] +pub use progressbar::Progressbar; +#[doc(no_inline)] pub use radio::Radio; #[doc(no_inline)] pub use row::Row; diff --git a/native/src/widget/progressbar.rs b/native/src/widget/progressbar.rs new file mode 100644 index 00000000..a6725f2c --- /dev/null +++ b/native/src/widget/progressbar.rs @@ -0,0 +1,135 @@ +//! Display a progressbar +//! +//! +//! [`Progressbar`]: struct.Progressbar.html +use crate::{ + layout, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget, +}; + +use std::{hash::Hash, ops::RangeInclusive}; + +/// A progressbar +/// +/// # Example +/// +/// ``` +/// # use iced_native::Progressbar; +/// +/// Progressbar::new(0.0..=100.0, value); +/// ``` +/// +/// TODO: Get a progressbar render +/// ![Slider drawn by Coffee's renderer](https://github.com/hecrj/coffee/blob/bda9818f823dfcb8a7ad0ff4940b4d4b387b5208/images/ui/slider.png?raw=true) +#[allow(missing_debug_implementations)] +pub struct Progressbar { + range: RangeInclusive, + value: f32, + width: Length, +} + +impl Progressbar { + /// Creates a new [`Progressbar`]. + /// + /// It expects: + /// * an inclusive range of possible values + /// * the current value of the [`Progressbar`] + /// + /// [`Progressbar`]: struct.Progressbar.html + pub fn new(range: RangeInclusive, value: f32) -> Self { + Progressbar { + value: value.max(*range.start()).min(*range.end()), + range, + width: Length::Fill, + } + } + + /// Sets the width of the [`Progressbar`]. + /// + /// [`Progressbar`]: struct.Progressbar.html + pub fn width(mut self, width: Length) -> Self { + self.width = width; + self + } +} + +impl Widget for Progressbar +where + Renderer: self::Renderer, +{ + fn width(&self) -> Length { + self.width + } + + fn height(&self) -> Length { + Length::Shrink + } + + fn layout( + &self, + renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { + let limits = limits + .width(self.width) + .height(Length::Units(renderer.height() as u16)); + + let size = limits.resolve(Size::ZERO); + + layout::Node::new(size) + } + + fn draw( + &self, + renderer: &mut Renderer, + layout: Layout<'_>, + _cursor_position: Point, + ) -> Renderer::Output { + renderer.draw(layout.bounds(), self.range.clone(), self.value) + } + + fn hash_layout(&self, state: &mut Hasher) { + self.width.hash(state); + } +} + +/// The renderer of a [`Progressbar`]. +/// +/// Your [renderer] will need to implement this trait before being +/// able to use a [`Progressbar`] in your user interface. +/// +/// [`Progressbar`]: struct.Progressbar.html +/// [renderer]: ../../renderer/index.html +pub trait Renderer: crate::Renderer { + /// Returns the height of the [`Progressbar`]. + /// + /// [`Progressbar`]: struct.Progressbar.html + fn height(&self) -> u32; + + /// Draws a [`Progressbar`]. + /// + /// It receives: + /// * the local state of the [`Progressbar`] + /// * the bounds of the [`Progressbar`] + /// * the range of values of the [`Progressbar`] + /// * the current value of the [`Progressbar`] + /// + /// [`Progressbar`]: struct.Progressbar.html + /// [`State`]: struct.State.html + /// [`Class`]: enum.Class.html + fn draw( + &self, + bounds: Rectangle, + range: RangeInclusive, + value: f32, + ) -> Self::Output; +} + +impl<'a, Message, Renderer> From for Element<'a, Message, Renderer> +where + Renderer: self::Renderer, + Message: 'static, +{ + fn from(progressbar: Progressbar) -> Element<'a, Message, Renderer> { + Element::new(progressbar) + } +} diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs index 1d1c32a2..c994b7ba 100644 --- a/native/src/widget/text_input.rs +++ b/native/src/widget/text_input.rs @@ -633,7 +633,8 @@ impl Value { .unwrap_or(self.len()) } - /// Returns a new [`Value`] containing the graphemes until the given `index`. + /// Returns a new [`Value`] containing the graphemes until the given + /// `index`. /// /// [`Value`]: struct.Value.html pub fn until(&self, index: usize) -> Self { -- cgit From bf8f83decc039494d310f6ecbb05cbab2c241cbf Mon Sep 17 00:00:00 2001 From: Songtronix Date: Thu, 2 Jan 2020 14:10:18 +0100 Subject: change(widget): custom coloring for progressbar --- native/src/widget/progressbar.rs | 41 +++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) (limited to 'native') diff --git a/native/src/widget/progressbar.rs b/native/src/widget/progressbar.rs index a6725f2c..fc55a803 100644 --- a/native/src/widget/progressbar.rs +++ b/native/src/widget/progressbar.rs @@ -3,7 +3,8 @@ //! //! [`Progressbar`]: struct.Progressbar.html use crate::{ - layout, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget, + layout, Background, Color, Element, Hasher, Layout, Length, Point, + Rectangle, Size, Widget, }; use std::{hash::Hash, ops::RangeInclusive}; @@ -14,17 +15,19 @@ use std::{hash::Hash, ops::RangeInclusive}; /// /// ``` /// # use iced_native::Progressbar; -/// +/// +/// let value = 50.0; /// Progressbar::new(0.0..=100.0, value); /// ``` /// -/// TODO: Get a progressbar render -/// ![Slider drawn by Coffee's renderer](https://github.com/hecrj/coffee/blob/bda9818f823dfcb8a7ad0ff4940b4d4b387b5208/images/ui/slider.png?raw=true) +/// ![Default Progressbar](https://user-images.githubusercontent.com/18618951/71662391-a316c200-2d51-11ea-9cef-52758cab85e3.png) #[allow(missing_debug_implementations)] pub struct Progressbar { range: RangeInclusive, value: f32, width: Length, + background: Option, + active_color: Option, } impl Progressbar { @@ -40,6 +43,8 @@ impl Progressbar { value: value.max(*range.start()).min(*range.end()), range, width: Length::Fill, + background: None, + active_color: None, } } @@ -50,6 +55,22 @@ impl Progressbar { self.width = width; self } + + /// Sets the background of the [`Progressbar`]. + /// + /// [`Progressbar`]: struct.Progressbar.html + pub fn background(mut self, background: Background) -> Self { + self.background = Some(background); + self + } + + /// Sets the active color of the [`Progressbar`]. + /// + /// [`Progressbar`]: struct.Progressbar.html + pub fn active_color(mut self, active_color: Color) -> Self { + self.active_color = Some(active_color); + self + } } impl Widget for Progressbar @@ -84,7 +105,13 @@ where layout: Layout<'_>, _cursor_position: Point, ) -> Renderer::Output { - renderer.draw(layout.bounds(), self.range.clone(), self.value) + renderer.draw( + layout.bounds(), + self.range.clone(), + self.value, + self.background, + self.active_color, + ) } fn hash_layout(&self, state: &mut Hasher) { @@ -112,6 +139,8 @@ pub trait Renderer: crate::Renderer { /// * the bounds of the [`Progressbar`] /// * the range of values of the [`Progressbar`] /// * the current value of the [`Progressbar`] + /// * maybe a specific background of the [`Progressbar`] + /// * maybe a specific active color of the [`Progressbar`] /// /// [`Progressbar`]: struct.Progressbar.html /// [`State`]: struct.State.html @@ -121,6 +150,8 @@ pub trait Renderer: crate::Renderer { bounds: Rectangle, range: RangeInclusive, value: f32, + background: Option, + active_color: Option, ) -> Self::Output; } -- cgit From 986f01237f227ad2eaabda982324fc26840cb12b Mon Sep 17 00:00:00 2001 From: Songtronix Date: Thu, 2 Jan 2020 18:07:00 +0100 Subject: change(widget): make height adjustable at widget level addtionally rename Progressbar to ProgressBar --- native/src/widget.rs | 4 +- native/src/widget/progress_bar.rs | 171 ++++++++++++++++++++++++++++++++++++++ native/src/widget/progressbar.rs | 166 ------------------------------------ 3 files changed, 173 insertions(+), 168 deletions(-) create mode 100644 native/src/widget/progress_bar.rs delete mode 100644 native/src/widget/progressbar.rs (limited to 'native') diff --git a/native/src/widget.rs b/native/src/widget.rs index d899da58..ccc9b47e 100644 --- a/native/src/widget.rs +++ b/native/src/widget.rs @@ -25,7 +25,7 @@ pub mod checkbox; pub mod column; pub mod container; pub mod image; -pub mod progressbar; +pub mod progress_bar; pub mod radio; pub mod row; pub mod scrollable; @@ -46,7 +46,7 @@ pub use container::Container; #[doc(no_inline)] pub use image::Image; #[doc(no_inline)] -pub use progressbar::Progressbar; +pub use progress_bar::ProgressBar; #[doc(no_inline)] pub use radio::Radio; #[doc(no_inline)] diff --git a/native/src/widget/progress_bar.rs b/native/src/widget/progress_bar.rs new file mode 100644 index 00000000..f9b87026 --- /dev/null +++ b/native/src/widget/progress_bar.rs @@ -0,0 +1,171 @@ +//! Display a ProgressBar +//! +//! +//! [`ProgressBar`]: struct.ProgressBar.html +use crate::{ + layout, Background, Color, Element, Hasher, Layout, Length, Point, + Rectangle, Size, Widget, +}; + +use std::{hash::Hash, ops::RangeInclusive}; + +const DEFAULT_HEIGHT: Length = Length::Units(30); + +/// A ProgressBar +/// +/// # Example +/// +/// ``` +/// # use iced_native::ProgressBar; +/// +/// let value = 50.0; +/// ProgressBar::new(0.0..=100.0, value); +/// ``` +/// +/// ![Default ProgressBar](https://user-images.githubusercontent.com/18618951/71662391-a316c200-2d51-11ea-9cef-52758cab85e3.png) +#[allow(missing_debug_implementations)] +pub struct ProgressBar { + range: RangeInclusive, + value: f32, + width: Length, + height: Length, + background: Option, + active_color: Option, +} + +impl ProgressBar { + /// Creates a new [`ProgressBar`]. + /// + /// It expects: + /// * an inclusive range of possible values + /// * the current value of the [`ProgressBar`] + /// + /// [`ProgressBar`]: struct.ProgressBar.html + pub fn new(range: RangeInclusive, value: f32) -> Self { + ProgressBar { + value: value.max(*range.start()).min(*range.end()), + range, + width: Length::Fill, + height: DEFAULT_HEIGHT, + background: None, + active_color: None, + } + } + + /// Sets the width of the [`ProgressBar`]. + /// + /// [`ProgressBar`]: struct.ProgressBar.html + pub fn width(mut self, width: Length) -> Self { + self.width = width; + self + } + + /// Sets the height of the [`ProgressBar`]. + /// + /// [`ProgressBar`]: struct.ProgressBar.html + pub fn height(mut self, height: Length) -> Self { + self.height = height; + self + } + + /// Sets the background of the [`ProgressBar`]. + /// + /// [`ProgressBar`]: struct.ProgressBar.html + pub fn background(mut self, background: Background) -> Self { + self.background = Some(background); + self + } + + /// Sets the active color of the [`ProgressBar`]. + /// + /// [`ProgressBar`]: struct.ProgressBar.html + pub fn active_color(mut self, active_color: Color) -> Self { + self.active_color = Some(active_color); + self + } +} + +impl Widget for ProgressBar +where + Renderer: self::Renderer, +{ + fn width(&self) -> Length { + self.width + } + + fn height(&self) -> Length { + self.height + } + + fn layout( + &self, + _renderer: &Renderer, + limits: &layout::Limits, + ) -> layout::Node { + let limits = limits.width(self.width).height(self.height); + + let size = limits.resolve(Size::ZERO); + + layout::Node::new(size) + } + + fn draw( + &self, + renderer: &mut Renderer, + layout: Layout<'_>, + _cursor_position: Point, + ) -> Renderer::Output { + renderer.draw( + layout.bounds(), + self.range.clone(), + self.value, + self.background, + self.active_color, + ) + } + + fn hash_layout(&self, state: &mut Hasher) { + self.width.hash(state); + } +} + +/// The renderer of a [`ProgressBar`]. +/// +/// Your [renderer] will need to implement this trait before being +/// able to use a [`ProgressBar`] in your user interface. +/// +/// [`ProgressBar`]: struct.ProgressBar.html +/// [renderer]: ../../renderer/index.html +pub trait Renderer: crate::Renderer { + /// Draws a [`ProgressBar`]. + /// + /// It receives: + /// * the local state of the [`ProgressBar`] + /// * the bounds of the [`ProgressBar`] + /// * the range of values of the [`ProgressBar`] + /// * the current value of the [`ProgressBar`] + /// * maybe a specific background of the [`ProgressBar`] + /// * maybe a specific active color of the [`ProgressBar`] + /// + /// [`ProgressBar`]: struct.ProgressBar.html + /// [`State`]: struct.State.html + /// [`Class`]: enum.Class.html + fn draw( + &self, + bounds: Rectangle, + range: RangeInclusive, + value: f32, + background: Option, + active_color: Option, + ) -> Self::Output; +} + +impl<'a, Message, Renderer> From for Element<'a, Message, Renderer> +where + Renderer: self::Renderer, + Message: 'static, +{ + fn from(progressbar: ProgressBar) -> Element<'a, Message, Renderer> { + Element::new(progressbar) + } +} diff --git a/native/src/widget/progressbar.rs b/native/src/widget/progressbar.rs deleted file mode 100644 index fc55a803..00000000 --- a/native/src/widget/progressbar.rs +++ /dev/null @@ -1,166 +0,0 @@ -//! Display a progressbar -//! -//! -//! [`Progressbar`]: struct.Progressbar.html -use crate::{ - layout, Background, Color, Element, Hasher, Layout, Length, Point, - Rectangle, Size, Widget, -}; - -use std::{hash::Hash, ops::RangeInclusive}; - -/// A progressbar -/// -/// # Example -/// -/// ``` -/// # use iced_native::Progressbar; -/// -/// let value = 50.0; -/// Progressbar::new(0.0..=100.0, value); -/// ``` -/// -/// ![Default Progressbar](https://user-images.githubusercontent.com/18618951/71662391-a316c200-2d51-11ea-9cef-52758cab85e3.png) -#[allow(missing_debug_implementations)] -pub struct Progressbar { - range: RangeInclusive, - value: f32, - width: Length, - background: Option, - active_color: Option, -} - -impl Progressbar { - /// Creates a new [`Progressbar`]. - /// - /// It expects: - /// * an inclusive range of possible values - /// * the current value of the [`Progressbar`] - /// - /// [`Progressbar`]: struct.Progressbar.html - pub fn new(range: RangeInclusive, value: f32) -> Self { - Progressbar { - value: value.max(*range.start()).min(*range.end()), - range, - width: Length::Fill, - background: None, - active_color: None, - } - } - - /// Sets the width of the [`Progressbar`]. - /// - /// [`Progressbar`]: struct.Progressbar.html - pub fn width(mut self, width: Length) -> Self { - self.width = width; - self - } - - /// Sets the background of the [`Progressbar`]. - /// - /// [`Progressbar`]: struct.Progressbar.html - pub fn background(mut self, background: Background) -> Self { - self.background = Some(background); - self - } - - /// Sets the active color of the [`Progressbar`]. - /// - /// [`Progressbar`]: struct.Progressbar.html - pub fn active_color(mut self, active_color: Color) -> Self { - self.active_color = Some(active_color); - self - } -} - -impl Widget for Progressbar -where - Renderer: self::Renderer, -{ - fn width(&self) -> Length { - self.width - } - - fn height(&self) -> Length { - Length::Shrink - } - - fn layout( - &self, - renderer: &Renderer, - limits: &layout::Limits, - ) -> layout::Node { - let limits = limits - .width(self.width) - .height(Length::Units(renderer.height() as u16)); - - let size = limits.resolve(Size::ZERO); - - layout::Node::new(size) - } - - fn draw( - &self, - renderer: &mut Renderer, - layout: Layout<'_>, - _cursor_position: Point, - ) -> Renderer::Output { - renderer.draw( - layout.bounds(), - self.range.clone(), - self.value, - self.background, - self.active_color, - ) - } - - fn hash_layout(&self, state: &mut Hasher) { - self.width.hash(state); - } -} - -/// The renderer of a [`Progressbar`]. -/// -/// Your [renderer] will need to implement this trait before being -/// able to use a [`Progressbar`] in your user interface. -/// -/// [`Progressbar`]: struct.Progressbar.html -/// [renderer]: ../../renderer/index.html -pub trait Renderer: crate::Renderer { - /// Returns the height of the [`Progressbar`]. - /// - /// [`Progressbar`]: struct.Progressbar.html - fn height(&self) -> u32; - - /// Draws a [`Progressbar`]. - /// - /// It receives: - /// * the local state of the [`Progressbar`] - /// * the bounds of the [`Progressbar`] - /// * the range of values of the [`Progressbar`] - /// * the current value of the [`Progressbar`] - /// * maybe a specific background of the [`Progressbar`] - /// * maybe a specific active color of the [`Progressbar`] - /// - /// [`Progressbar`]: struct.Progressbar.html - /// [`State`]: struct.State.html - /// [`Class`]: enum.Class.html - fn draw( - &self, - bounds: Rectangle, - range: RangeInclusive, - value: f32, - background: Option, - active_color: Option, - ) -> Self::Output; -} - -impl<'a, Message, Renderer> From for Element<'a, Message, Renderer> -where - Renderer: self::Renderer, - Message: 'static, -{ - fn from(progressbar: Progressbar) -> Element<'a, Message, Renderer> { - Element::new(progressbar) - } -} -- cgit From 9116afaf59f5ea697bed55ed3d11e2afd76ad4aa Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 3 Jan 2020 18:23:19 +0100 Subject: Move `DEFAULT_HEIGHT` constant to `Renderer` Also fixes some minor documentation issues. --- native/src/widget/progress_bar.rs | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) (limited to 'native') diff --git a/native/src/widget/progress_bar.rs b/native/src/widget/progress_bar.rs index f9b87026..d61ec4f2 100644 --- a/native/src/widget/progress_bar.rs +++ b/native/src/widget/progress_bar.rs @@ -1,7 +1,4 @@ -//! Display a ProgressBar -//! -//! -//! [`ProgressBar`]: struct.ProgressBar.html +//! Provide progress feedback to your users. use crate::{ layout, Background, Color, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget, @@ -9,26 +6,24 @@ use crate::{ use std::{hash::Hash, ops::RangeInclusive}; -const DEFAULT_HEIGHT: Length = Length::Units(30); - -/// A ProgressBar +/// A bar that displays progress. /// /// # Example -/// /// ``` /// # use iced_native::ProgressBar; -/// +/// # /// let value = 50.0; +/// /// ProgressBar::new(0.0..=100.0, value); /// ``` /// -/// ![Default ProgressBar](https://user-images.githubusercontent.com/18618951/71662391-a316c200-2d51-11ea-9cef-52758cab85e3.png) +/// ![Progress bar drawn with `iced_wgpu`](https://user-images.githubusercontent.com/18618951/71662391-a316c200-2d51-11ea-9cef-52758cab85e3.png) #[allow(missing_debug_implementations)] pub struct ProgressBar { range: RangeInclusive, value: f32, width: Length, - height: Length, + height: Option, background: Option, active_color: Option, } @@ -46,7 +41,7 @@ impl ProgressBar { value: value.max(*range.start()).min(*range.end()), range, width: Length::Fill, - height: DEFAULT_HEIGHT, + height: None, background: None, active_color: None, } @@ -64,7 +59,7 @@ impl ProgressBar { /// /// [`ProgressBar`]: struct.ProgressBar.html pub fn height(mut self, height: Length) -> Self { - self.height = height; + self.height = Some(height); self } @@ -95,6 +90,7 @@ where fn height(&self) -> Length { self.height + .unwrap_or(Length::Units(Renderer::DEFAULT_HEIGHT)) } fn layout( @@ -102,7 +98,10 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let limits = limits.width(self.width).height(self.height); + let limits = limits.width(self.width).height( + self.height + .unwrap_or(Length::Units(Renderer::DEFAULT_HEIGHT)), + ); let size = limits.resolve(Size::ZERO); @@ -137,10 +136,14 @@ where /// [`ProgressBar`]: struct.ProgressBar.html /// [renderer]: ../../renderer/index.html pub trait Renderer: crate::Renderer { + /// The default height of a [`ProgressBar`]. + /// + /// [`ProgressBar`]: struct.ProgressBar.html + const DEFAULT_HEIGHT: u16; + /// Draws a [`ProgressBar`]. /// /// It receives: - /// * the local state of the [`ProgressBar`] /// * the bounds of the [`ProgressBar`] /// * the range of values of the [`ProgressBar`] /// * the current value of the [`ProgressBar`] @@ -148,8 +151,6 @@ pub trait Renderer: crate::Renderer { /// * maybe a specific active color of the [`ProgressBar`] /// /// [`ProgressBar`]: struct.ProgressBar.html - /// [`State`]: struct.State.html - /// [`Class`]: enum.Class.html fn draw( &self, bounds: Rectangle, @@ -165,7 +166,7 @@ where Renderer: self::Renderer, Message: 'static, { - fn from(progressbar: ProgressBar) -> Element<'a, Message, Renderer> { - Element::new(progressbar) + fn from(progress_bar: ProgressBar) -> Element<'a, Message, Renderer> { + Element::new(progress_bar) } } -- cgit From 60ac4faca0e61ddebaa89c0535390cc3f1180a39 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Fri, 3 Jan 2020 18:33:47 +0100 Subject: Hash `height` of `ProgressBar` in `hash_layout` --- native/src/widget/progress_bar.rs | 1 + 1 file changed, 1 insertion(+) (limited to 'native') diff --git a/native/src/widget/progress_bar.rs b/native/src/widget/progress_bar.rs index d61ec4f2..b1d4fd92 100644 --- a/native/src/widget/progress_bar.rs +++ b/native/src/widget/progress_bar.rs @@ -125,6 +125,7 @@ where fn hash_layout(&self, state: &mut Hasher) { self.width.hash(state); + self.height.hash(state); } } -- cgit