diff options
author | 2021-10-28 17:36:36 +0700 | |
---|---|---|
committer | 2021-10-28 18:04:27 +0700 | |
commit | e42e1e2f57ddb455ceff0017e215ddacca978d37 (patch) | |
tree | 5052541cfab8ba64c9c1aa8d0d09a2b4b3540126 | |
parent | bc32199e39ee3d42b0d71d9082d56b368e401534 (diff) | |
download | iced-e42e1e2f57ddb455ceff0017e215ddacca978d37.tar.gz iced-e42e1e2f57ddb455ceff0017e215ddacca978d37.tar.bz2 iced-e42e1e2f57ddb455ceff0017e215ddacca978d37.zip |
Implement `Widget::draw` for `ProgressBar`
-rw-r--r-- | glow/src/widget/progress_bar.rs | 9 | ||||
-rw-r--r-- | graphics/src/widget/progress_bar.rs | 20 | ||||
-rw-r--r-- | native/src/renderer/null.rs | 6 | ||||
-rw-r--r-- | native/src/widget/progress_bar.rs | 100 | ||||
-rw-r--r-- | wgpu/src/widget/progress_bar.rs | 10 |
5 files changed, 63 insertions, 82 deletions
diff --git a/glow/src/widget/progress_bar.rs b/glow/src/widget/progress_bar.rs index 45a25d00..413e6fb7 100644 --- a/glow/src/widget/progress_bar.rs +++ b/glow/src/widget/progress_bar.rs @@ -2,12 +2,5 @@ //! //! A [`ProgressBar`] has a range of possible values and a current value, //! as well as a length, height and style. -use crate::Renderer; -pub use iced_graphics::progress_bar::{Style, StyleSheet}; - -/// A bar that displays progress. -/// -/// This is an alias of an `iced_native` progress bar with an -/// `iced_wgpu::Renderer`. -pub type ProgressBar = iced_native::ProgressBar<Renderer>; +pub use iced_graphics::progress_bar::*; diff --git a/graphics/src/widget/progress_bar.rs b/graphics/src/widget/progress_bar.rs index 3d21b7b9..df4f5ec6 100644 --- a/graphics/src/widget/progress_bar.rs +++ b/graphics/src/widget/progress_bar.rs @@ -2,22 +2,4 @@ //! //! A [`ProgressBar`] has a range of possible values and a current value, //! as well as a length, height and style. -use crate::{Backend, Renderer}; -use iced_native::progress_bar; - -pub use iced_style::progress_bar::{Style, StyleSheet}; - -/// A bar that displays progress. -/// -/// This is an alias of an `iced_native` progress bar with an -/// `iced_wgpu::Renderer`. -pub type ProgressBar<Backend> = iced_native::ProgressBar<Renderer<Backend>>; - -impl<B> progress_bar::Renderer for Renderer<B> -where - B: Backend, -{ - type Style = Box<dyn StyleSheet>; - - const DEFAULT_HEIGHT: u16 = 30; -} +pub use iced_native::progress_bar::*; diff --git a/native/src/renderer/null.rs b/native/src/renderer/null.rs index cc1d41ba..92e64cf4 100644 --- a/native/src/renderer/null.rs +++ b/native/src/renderer/null.rs @@ -68,12 +68,6 @@ impl renderer::Text for Null { fn fill_text(&mut self, _text: renderer::text::Section<'_, Self::Font>) {} } -impl progress_bar::Renderer for Null { - type Style = (); - - const DEFAULT_HEIGHT: u16 = 30; -} - impl toggler::Renderer for Null { type Style = (); diff --git a/native/src/widget/progress_bar.rs b/native/src/widget/progress_bar.rs index 98dd9989..9e857226 100644 --- a/native/src/widget/progress_bar.rs +++ b/native/src/widget/progress_bar.rs @@ -1,17 +1,19 @@ //! Provide progress feedback to your users. use crate::layout; use crate::renderer; -use crate::{Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget}; +use crate::{ + Color, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget, +}; use std::{hash::Hash, ops::RangeInclusive}; +pub use iced_style::progress_bar::{Style, StyleSheet}; + /// A bar that displays progress. /// /// # Example /// ``` -/// # use iced_native::renderer::Null; -/// # -/// # pub type ProgressBar = iced_native::ProgressBar<Null>; +/// # use iced_native::ProgressBar; /// let value = 50.0; /// /// ProgressBar::new(0.0..=100.0, value); @@ -19,15 +21,18 @@ use std::{hash::Hash, ops::RangeInclusive}; /// ///  #[allow(missing_debug_implementations)] -pub struct ProgressBar<Renderer: self::Renderer> { +pub struct ProgressBar { range: RangeInclusive<f32>, value: f32, width: Length, height: Option<Length>, - style: Renderer::Style, + style_sheet: Box<dyn StyleSheet>, } -impl<Renderer: self::Renderer> ProgressBar<Renderer> { +impl ProgressBar { + /// The default height of a [`ProgressBar`]. + pub const DEFAULT_HEIGHT: u16 = 30; + /// Creates a new [`ProgressBar`]. /// /// It expects: @@ -39,7 +44,7 @@ impl<Renderer: self::Renderer> ProgressBar<Renderer> { range, width: Length::Fill, height: None, - style: Renderer::Style::default(), + style_sheet: Default::default(), } } @@ -56,23 +61,25 @@ impl<Renderer: self::Renderer> ProgressBar<Renderer> { } /// Sets the style of the [`ProgressBar`]. - pub fn style(mut self, style: impl Into<Renderer::Style>) -> Self { - self.style = style.into(); + pub fn style( + mut self, + style_sheet: impl Into<Box<dyn StyleSheet>>, + ) -> Self { + self.style_sheet = style_sheet.into(); self } } -impl<Message, Renderer> Widget<Message, Renderer> for ProgressBar<Renderer> +impl<Message, Renderer> Widget<Message, Renderer> for ProgressBar where - Renderer: self::Renderer, + Renderer: crate::Renderer, { fn width(&self) -> Length { self.width } fn height(&self) -> Length { - self.height - .unwrap_or(Length::Units(Renderer::DEFAULT_HEIGHT)) + self.height.unwrap_or(Length::Units(Self::DEFAULT_HEIGHT)) } fn layout( @@ -80,10 +87,9 @@ where _renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let limits = limits.width(self.width).height( - self.height - .unwrap_or(Length::Units(Renderer::DEFAULT_HEIGHT)), - ); + let limits = limits + .width(self.width) + .height(self.height.unwrap_or(Length::Units(Self::DEFAULT_HEIGHT))); let size = limits.resolve(Size::ZERO); @@ -93,12 +99,43 @@ where fn draw( &self, renderer: &mut Renderer, - style: &renderer::Style, + _style: &renderer::Style, layout: Layout<'_>, _cursor_position: Point, _viewport: &Rectangle, ) { - // TODO + let bounds = layout.bounds(); + let (range_start, range_end) = self.range.clone().into_inner(); + + let active_progress_width = if range_start >= range_end { + 0.0 + } else { + bounds.width * (self.value - range_start) + / (range_end - range_start) + }; + + let style = self.style_sheet.style(); + + renderer.fill_rectangle(renderer::Quad { + bounds: Rectangle { ..bounds }, + background: style.background, + border_radius: style.border_radius, + border_width: 0.0, + border_color: Color::TRANSPARENT, + }); + + if active_progress_width > 0.0 { + renderer.fill_rectangle(renderer::Quad { + bounds: Rectangle { + width: active_progress_width, + ..bounds + }, + background: style.bar, + border_radius: style.border_radius, + border_width: 0.0, + border_color: Color::TRANSPARENT, + }); + } } fn hash_layout(&self, state: &mut Hasher) { @@ -110,29 +147,12 @@ where } } -/// The renderer of a [`ProgressBar`]. -/// -/// Your [renderer] will need to implement this trait before being -/// able to use a [`ProgressBar`] in your user interface. -/// -/// [renderer]: crate::renderer -pub trait Renderer: crate::Renderer { - /// The style supported by this renderer. - type Style: Default; - - /// The default height of a [`ProgressBar`]. - const DEFAULT_HEIGHT: u16; -} - -impl<'a, Message, Renderer> From<ProgressBar<Renderer>> - for Element<'a, Message, Renderer> +impl<'a, Message, Renderer> From<ProgressBar> for Element<'a, Message, Renderer> where - Renderer: 'a + self::Renderer, + Renderer: 'a + crate::Renderer, Message: 'a, { - fn from( - progress_bar: ProgressBar<Renderer>, - ) -> Element<'a, Message, Renderer> { + fn from(progress_bar: ProgressBar) -> Element<'a, Message, Renderer> { Element::new(progress_bar) } } diff --git a/wgpu/src/widget/progress_bar.rs b/wgpu/src/widget/progress_bar.rs index 45a25d00..88391ccb 100644 --- a/wgpu/src/widget/progress_bar.rs +++ b/wgpu/src/widget/progress_bar.rs @@ -2,12 +2,4 @@ //! //! A [`ProgressBar`] has a range of possible values and a current value, //! as well as a length, height and style. -use crate::Renderer; - -pub use iced_graphics::progress_bar::{Style, StyleSheet}; - -/// A bar that displays progress. -/// -/// This is an alias of an `iced_native` progress bar with an -/// `iced_wgpu::Renderer`. -pub type ProgressBar = iced_native::ProgressBar<Renderer>; +pub use iced_graphics::progress_bar::*; |