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 --- examples/progress_bar.rs | 64 ++++++++++++ examples/progressbar.rs | 63 ------------ native/src/widget.rs | 4 +- native/src/widget/progress_bar.rs | 171 +++++++++++++++++++++++++++++++ native/src/widget/progressbar.rs | 166 ------------------------------ wgpu/src/renderer/widget.rs | 2 +- wgpu/src/renderer/widget/progress_bar.rs | 45 ++++++++ wgpu/src/renderer/widget/progressbar.rs | 49 --------- 8 files changed, 283 insertions(+), 281 deletions(-) create mode 100644 examples/progress_bar.rs delete mode 100644 examples/progressbar.rs create mode 100644 native/src/widget/progress_bar.rs delete mode 100644 native/src/widget/progressbar.rs create mode 100644 wgpu/src/renderer/widget/progress_bar.rs delete mode 100644 wgpu/src/renderer/widget/progressbar.rs diff --git a/examples/progress_bar.rs b/examples/progress_bar.rs new file mode 100644 index 00000000..56f54903 --- /dev/null +++ b/examples/progress_bar.rs @@ -0,0 +1,64 @@ +use iced::{ + settings::Window, slider, Background, Color, Column, Element, Length, + Sandbox, Settings, Slider, +}; +use iced_winit::ProgressBar; + +pub fn main() { + Progress::run(Settings { + window: Window { + size: (700, 300), + resizable: true, + decorations: true, + }, + }) +} + +#[derive(Default)] +struct Progress { + value: f32, + progress_bar_slider: slider::State, +} + +#[derive(Debug, Clone, Copy)] +enum Message { + SliderChanged(f32), +} + +impl Sandbox for Progress { + type Message = Message; + + fn new() -> Self { + Self::default() + } + + fn title(&self) -> String { + String::from("A simple Progressbar") + } + + fn update(&mut self, message: Message) { + match message { + Message::SliderChanged(x) => self.value = x, + } + } + + fn view(&mut self) -> Element { + Column::new() + .padding(20) + .push( + ProgressBar::new(0.0..=100.0, self.value) + .background(Background::Color(Color::from_rgb( + 0.6, 0.6, 0.6, + ))) + .active_color(Color::from_rgb(0.0, 0.95, 0.0)) + .height(Length::Units(30)), + ) + .push(Slider::new( + &mut self.progress_bar_slider, + 0.0..=100.0, + self.value, + Message::SliderChanged, + )) + .into() + } +} diff --git a/examples/progressbar.rs b/examples/progressbar.rs deleted file mode 100644 index c4ebf248..00000000 --- a/examples/progressbar.rs +++ /dev/null @@ -1,63 +0,0 @@ -use iced::{ - settings::Window, slider, Background, Color, Column, Element, Sandbox, - Settings, Slider, -}; -use iced_winit::Progressbar; - -pub fn main() { - Progress::run(Settings { - window: Window { - size: (700, 300), - resizable: true, - decorations: true, - }, - }) -} - -#[derive(Default)] -struct Progress { - value: f32, - progressbar_slider: slider::State, -} - -#[derive(Debug, Clone, Copy)] -enum Message { - SliderChanged(f32), -} - -impl Sandbox for Progress { - type Message = Message; - - fn new() -> Self { - Self::default() - } - - fn title(&self) -> String { - String::from("A simple Progressbar") - } - - fn update(&mut self, message: Message) { - match message { - Message::SliderChanged(x) => self.value = x, - } - } - - fn view(&mut self) -> Element { - Column::new() - .padding(20) - .push( - Progressbar::new(0.0..=100.0, self.value) - .background(Background::Color(Color::from_rgb( - 0.6, 0.6, 0.6, - ))) - .active_color(Color::from_rgb(0.0, 0.95, 0.0)), - ) - .push(Slider::new( - &mut self.progressbar_slider, - 0.0..=100.0, - self.value, - Message::SliderChanged, - )) - .into() - } -} 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) - } -} diff --git a/wgpu/src/renderer/widget.rs b/wgpu/src/renderer/widget.rs index 94ebd10e..32187c10 100644 --- a/wgpu/src/renderer/widget.rs +++ b/wgpu/src/renderer/widget.rs @@ -2,7 +2,7 @@ mod button; mod checkbox; mod column; mod image; -mod progressbar; +mod progress_bar; mod radio; mod row; mod scrollable; diff --git a/wgpu/src/renderer/widget/progress_bar.rs b/wgpu/src/renderer/widget/progress_bar.rs new file mode 100644 index 00000000..3550df23 --- /dev/null +++ b/wgpu/src/renderer/widget/progress_bar.rs @@ -0,0 +1,45 @@ +use crate::{Primitive, Renderer}; +use iced_native::{progress_bar, Background, Color, MouseCursor, Rectangle}; + +impl progress_bar::Renderer for Renderer { + fn draw( + &self, + bounds: Rectangle, + range: std::ops::RangeInclusive, + value: f32, + background: Option, + active_color: Option, + ) -> Self::Output { + let (range_start, range_end) = range.into_inner(); + let active_progress_width = bounds.width + * ((value - range_start) / (range_end - range_start).max(1.0)); + + let background = Primitive::Group { + primitives: vec![Primitive::Quad { + bounds: Rectangle { ..bounds }, + background: background + .unwrap_or(Background::Color([0.6, 0.6, 0.6].into())) + .into(), + border_radius: 5, + }], + }; + + let active_progress = Primitive::Quad { + bounds: Rectangle { + width: active_progress_width, + ..bounds + }, + background: Background::Color( + active_color.unwrap_or([0.0, 0.95, 0.0].into()), + ), + border_radius: 5, + }; + + ( + Primitive::Group { + primitives: vec![background, active_progress], + }, + MouseCursor::OutOfBounds, + ) + } +} diff --git a/wgpu/src/renderer/widget/progressbar.rs b/wgpu/src/renderer/widget/progressbar.rs deleted file mode 100644 index f621343d..00000000 --- a/wgpu/src/renderer/widget/progressbar.rs +++ /dev/null @@ -1,49 +0,0 @@ -use crate::{Primitive, Renderer}; -use iced_native::{progressbar, Background, Color, MouseCursor, Rectangle}; - -impl progressbar::Renderer for Renderer { - fn height(&self) -> u32 { - 30 - } - - fn draw( - &self, - bounds: Rectangle, - range: std::ops::RangeInclusive, - value: f32, - background: Option, - active_color: Option, - ) -> Self::Output { - let (range_start, range_end) = range.into_inner(); - let active_progress_width = bounds.width - * ((value - range_start) / (range_end - range_start).max(1.0)); - - let background = Primitive::Group { - primitives: vec![Primitive::Quad { - bounds: Rectangle { ..bounds }, - background: background - .unwrap_or(Background::Color([0.6, 0.6, 0.6].into())) - .into(), - border_radius: 5, - }], - }; - - let active_progress = Primitive::Quad { - bounds: Rectangle { - width: active_progress_width, - ..bounds - }, - background: Background::Color( - active_color.unwrap_or([0.0, 0.95, 0.0].into()), - ), - border_radius: 5, - }; - - ( - Primitive::Group { - primitives: vec![background, active_progress], - }, - MouseCursor::OutOfBounds, - ) - } -} -- cgit