diff options
author | 2023-02-22 21:23:04 +0100 | |
---|---|---|
committer | 2023-02-22 21:23:04 +0100 | |
commit | 4f41927155e7d4bc38497b0e298a0b23ccea6ca1 (patch) | |
tree | 70b7dbc1afdc62dfeaf42f0c62e8f4c01e407729 /native/src/widget/scrollable.rs | |
parent | a35d6d2e4d59f71309f31c87ea5150959d639185 (diff) | |
parent | 666f3cd143047e49a010f0c97eabc7136f92aa35 (diff) | |
download | iced-4f41927155e7d4bc38497b0e298a0b23ccea6ca1.tar.gz iced-4f41927155e7d4bc38497b0e298a0b23ccea6ca1.tar.bz2 iced-4f41927155e7d4bc38497b0e298a0b23ccea6ca1.zip |
Merge branch 'iced-rs:master' into master
Diffstat (limited to '')
-rw-r--r-- | native/src/widget/scrollable.rs | 101 |
1 files changed, 53 insertions, 48 deletions
diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs index de6eacb5..b88b77e5 100644 --- a/native/src/widget/scrollable.rs +++ b/native/src/widget/scrollable.rs @@ -10,8 +10,8 @@ use crate::widget; use crate::widget::operation::{self, Operation}; use crate::widget::tree::{self, Tree}; use crate::{ - Background, Clipboard, Color, Command, Element, Layout, Length, Point, - Rectangle, Shell, Size, Vector, Widget, + Background, Clipboard, Color, Command, Element, Layout, Length, Pixels, + Point, Rectangle, Shell, Size, Vector, Widget, }; pub use iced_style::scrollable::StyleSheet; @@ -66,8 +66,8 @@ where } /// Sets the height of the [`Scrollable`]. - pub fn height(mut self, height: Length) -> Self { - self.height = height; + pub fn height(mut self, height: impl Into<Length>) -> Self { + self.height = height.into(); self } @@ -108,17 +108,17 @@ where /// Properties of a scrollbar within a [`Scrollable`]. #[derive(Debug)] pub struct Properties { - width: u16, - margin: u16, - scroller_width: u16, + width: f32, + margin: f32, + scroller_width: f32, } impl Default for Properties { fn default() -> Self { Self { - width: 10, - margin: 0, - scroller_width: 10, + width: 10.0, + margin: 0.0, + scroller_width: 10.0, } } } @@ -131,21 +131,21 @@ impl Properties { /// Sets the scrollbar width of the [`Scrollable`] . /// Silently enforces a minimum width of 1. - pub fn width(mut self, width: u16) -> Self { - self.width = width.max(1); + pub fn width(mut self, width: impl Into<Pixels>) -> Self { + self.width = width.into().0.max(1.0); self } /// Sets the scrollbar margin of the [`Scrollable`] . - pub fn margin(mut self, margin: u16) -> Self { - self.margin = margin; + pub fn margin(mut self, margin: impl Into<Pixels>) -> Self { + self.margin = margin.into().0; self } /// Sets the scroller width of the [`Scrollable`] . /// Silently enforces a minimum width of 1. - pub fn scroller_width(mut self, scroller_width: u16) -> Self { - self.scroller_width = scroller_width.max(1); + pub fn scroller_width(mut self, scroller_width: impl Into<Pixels>) -> Self { + self.scroller_width = scroller_width.into().0.max(1.0); self } } @@ -208,14 +208,17 @@ where operation.scrollable(state, self.id.as_ref().map(|id| &id.0)); - operation.container(None, &mut |operation| { - self.content.as_widget().operate( - &mut tree.children[0], - layout.children().next().unwrap(), - renderer, - operation, - ); - }); + operation.container( + self.id.as_ref().map(|id| &id.0), + &mut |operation| { + self.content.as_widget().operate( + &mut tree.children[0], + layout.children().next().unwrap(), + renderer, + operation, + ); + }, + ); } fn on_event( @@ -395,11 +398,11 @@ pub fn layout<Renderer>( layout_content: impl FnOnce(&Renderer, &layout::Limits) -> layout::Node, ) -> layout::Node { let limits = limits - .max_height(u32::MAX) + .max_height(f32::INFINITY) .max_width(if horizontal_enabled { - u32::MAX + f32::INFINITY } else { - limits.max().width as u32 + limits.max().width }) .width(width) .height(height); @@ -1101,26 +1104,27 @@ impl Scrollbars { // Adjust the height of the vertical scrollbar if the horizontal scrollbar // is present - let x_scrollbar_height = show_scrollbar_x.map_or(0.0, |h| { - (h.width.max(h.scroller_width) + h.margin) as f32 - }); + let x_scrollbar_height = show_scrollbar_x + .map_or(0.0, |h| h.width.max(h.scroller_width) + h.margin); - let total_scrollbar_width = width.max(scroller_width) + 2 * margin; + let total_scrollbar_width = + width.max(scroller_width) + 2.0 * margin; // Total bounds of the scrollbar + margin + scroller width let total_scrollbar_bounds = Rectangle { - x: bounds.x + bounds.width - total_scrollbar_width as f32, + x: bounds.x + bounds.width - total_scrollbar_width, y: bounds.y, - width: total_scrollbar_width as f32, + width: total_scrollbar_width, height: (bounds.height - x_scrollbar_height).max(0.0), }; // Bounds of just the scrollbar let scrollbar_bounds = Rectangle { x: bounds.x + bounds.width - - f32::from(total_scrollbar_width / 2 + width / 2), + - total_scrollbar_width / 2.0 + - width / 2.0, y: bounds.y, - width: width as f32, + width, height: (bounds.height - x_scrollbar_height).max(0.0), }; @@ -1131,10 +1135,11 @@ impl Scrollbars { let scroller_bounds = Rectangle { x: bounds.x + bounds.width - - f32::from(total_scrollbar_width / 2 + scroller_width / 2), + - total_scrollbar_width / 2.0 + - scroller_width / 2.0, y: (scrollbar_bounds.y + scroller_offset - x_scrollbar_height) .max(0.0), - width: scroller_width as f32, + width: scroller_width, height: scroller_height, }; @@ -1159,27 +1164,28 @@ impl Scrollbars { // Need to adjust the width of the horizontal scrollbar if the vertical scrollbar // is present let scrollbar_y_width = y_scrollbar.map_or(0.0, |_| { - (vertical.width.max(vertical.scroller_width) + vertical.margin) - as f32 + vertical.width.max(vertical.scroller_width) + vertical.margin }); - let total_scrollbar_height = width.max(scroller_width) + 2 * margin; + let total_scrollbar_height = + width.max(scroller_width) + 2.0 * margin; // Total bounds of the scrollbar + margin + scroller width let total_scrollbar_bounds = Rectangle { x: bounds.x, - y: bounds.y + bounds.height - total_scrollbar_height as f32, + y: bounds.y + bounds.height - total_scrollbar_height, width: (bounds.width - scrollbar_y_width).max(0.0), - height: total_scrollbar_height as f32, + height: total_scrollbar_height, }; // Bounds of just the scrollbar let scrollbar_bounds = Rectangle { x: bounds.x, y: bounds.y + bounds.height - - f32::from(total_scrollbar_height / 2 + width / 2), + - total_scrollbar_height / 2.0 + - width / 2.0, width: (bounds.width - scrollbar_y_width).max(0.0), - height: width as f32, + height: width, }; let ratio = bounds.width / content_bounds.width; @@ -1191,11 +1197,10 @@ impl Scrollbars { x: (scrollbar_bounds.x + scroller_offset - scrollbar_y_width) .max(0.0), y: bounds.y + bounds.height - - f32::from( - total_scrollbar_height / 2 + scroller_width / 2, - ), + - total_scrollbar_height / 2.0 + - scroller_width / 2.0, width: scroller_length, - height: scroller_width as f32, + height: scroller_width, }; Some(Scrollbar { |