summaryrefslogtreecommitdiffstats
path: root/native/src/widget/progress_bar.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector0193@gmail.com>2021-11-07 15:15:33 +0700
committerLibravatar GitHub <noreply@github.com>2021-11-07 15:15:33 +0700
commiteafad00af2a9bae9f3ed8124e2a6f6e59ee5d253 (patch)
tree76413948c9c9723075189d51d4c2e02c0f8fdd23 /native/src/widget/progress_bar.rs
parent61c747b53589d98f477fea95f85d2ea5349666d3 (diff)
parent07b5097bc92ced376d09115d787ff1d2ebe00836 (diff)
downloadiced-eafad00af2a9bae9f3ed8124e2a6f6e59ee5d253.tar.gz
iced-eafad00af2a9bae9f3ed8124e2a6f6e59ee5d253.tar.bz2
iced-eafad00af2a9bae9f3ed8124e2a6f6e59ee5d253.zip
Merge pull request #1110 from iced-rs/remove-renderer-traits
Reduce the surface of the `Renderer` APIs
Diffstat (limited to 'native/src/widget/progress_bar.rs')
-rw-r--r--native/src/widget/progress_bar.rs126
1 files changed, 65 insertions, 61 deletions
diff --git a/native/src/widget/progress_bar.rs b/native/src/widget/progress_bar.rs
index d294f198..69eb8c09 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::{
- layout, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget,
+ 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::widget::ProgressBar;
/// let value = 50.0;
///
/// ProgressBar::new(0.0..=100.0, value);
@@ -19,15 +21,18 @@ use std::{hash::Hash, ops::RangeInclusive};
///
/// ![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<Renderer: self::Renderer> {
+pub struct ProgressBar<'a> {
range: RangeInclusive<f32>,
value: f32,
width: Length,
height: Option<Length>,
- style: Renderer::Style,
+ style_sheet: Box<dyn StyleSheet + 'a>,
}
-impl<Renderer: self::Renderer> ProgressBar<Renderer> {
+impl<'a> ProgressBar<'a> {
+ /// 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 + 'a>>,
+ ) -> Self {
+ self.style_sheet = style_sheet.into();
self
}
}
-impl<Message, Renderer> Widget<Message, Renderer> for ProgressBar<Renderer>
+impl<'a, Message, Renderer> Widget<Message, Renderer> for ProgressBar<'a>
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,17 +99,47 @@ where
fn draw(
&self,
renderer: &mut Renderer,
- _defaults: &Renderer::Defaults,
+ _style: &renderer::Style,
layout: Layout<'_>,
_cursor_position: Point,
_viewport: &Rectangle,
- ) -> Renderer::Output {
- renderer.draw(
- layout.bounds(),
- self.range.clone(),
- self.value,
- &self.style,
- )
+ ) {
+ 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_quad(
+ renderer::Quad {
+ bounds: Rectangle { ..bounds },
+ border_radius: style.border_radius,
+ border_width: 0.0,
+ border_color: Color::TRANSPARENT,
+ },
+ style.background,
+ );
+
+ if active_progress_width > 0.0 {
+ renderer.fill_quad(
+ renderer::Quad {
+ bounds: Rectangle {
+ width: active_progress_width,
+ ..bounds
+ },
+ border_radius: style.border_radius,
+ border_width: 0.0,
+ border_color: Color::TRANSPARENT,
+ },
+ style.bar,
+ );
+ }
}
fn hash_layout(&self, state: &mut Hasher) {
@@ -115,45 +151,13 @@ 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;
-
- /// Draws a [`ProgressBar`].
- ///
- /// It receives:
- /// * 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`]
- fn draw(
- &self,
- bounds: Rectangle,
- range: RangeInclusive<f32>,
- value: f32,
- style: &Self::Style,
- ) -> Self::Output;
-}
-
-impl<'a, Message, Renderer> From<ProgressBar<Renderer>>
+impl<'a, Message, Renderer> From<ProgressBar<'a>>
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<'a>) -> Element<'a, Message, Renderer> {
Element::new(progress_bar)
}
}