From a73386f68e01943a28f9286f6d5a1bd017e1d7c3 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 15 Feb 2024 01:35:55 +0100 Subject: Add `clip` property to `Button` --- CHANGELOG.md | 2 +- widget/src/button.rs | 19 +++++++++++++++++-- widget/src/row.rs | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb59f423..2b5dc776 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,7 +47,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Support for generic `Element` in `Tooltip`. [#2228](https://github.com/iced-rs/iced/pull/2228) - Container and `gap` styling for `Scrollable`. [#2239](https://github.com/iced-rs/iced/pull/2239) - Use `Borrow` for both `options` and `selected` in PickList. [#2251](https://github.com/iced-rs/iced/pull/2251) -- `clip` property for `Container`, `Column`, and `Row`. #[2252](https://github.com/iced-rs/iced/pull/2252) +- `clip` property for `Container`, `Column`, `Row`, and `Button`. #[2252](https://github.com/iced-rs/iced/pull/2252) ### Changed - Enable WebGPU backend in `wgpu` by default instead of WebGL. [#2068](https://github.com/iced-rs/iced/pull/2068) diff --git a/widget/src/button.rs b/widget/src/button.rs index d16e8c67..867fbfaf 100644 --- a/widget/src/button.rs +++ b/widget/src/button.rs @@ -61,6 +61,7 @@ where width: Length, height: Length, padding: Padding, + clip: bool, style: Theme::Style, } @@ -82,6 +83,7 @@ where width: size.width.fluid(), height: size.height.fluid(), padding: Padding::new(5.0), + clip: false, style: Theme::Style::default(), } } @@ -126,6 +128,13 @@ where self.style = style.into(); self } + + /// Sets whether the contents of the [`Button`] should be clipped on + /// overflow. + pub fn clip(mut self, clip: bool) -> Self { + self.clip = clip; + self + } } impl<'a, Message, Theme, Renderer> Widget @@ -227,7 +236,7 @@ where _style: &renderer::Style, layout: Layout<'_>, cursor: mouse::Cursor, - _viewport: &Rectangle, + viewport: &Rectangle, ) { let bounds = layout.bounds(); let content_layout = layout.children().next().unwrap(); @@ -242,6 +251,12 @@ where || tree.state.downcast_ref::(), ); + let viewport = if self.clip { + bounds.intersection(viewport).unwrap_or(*viewport) + } else { + *viewport + }; + self.content.as_widget().draw( &tree.children[0], renderer, @@ -251,7 +266,7 @@ where }, content_layout, cursor, - &bounds, + &viewport, ); } diff --git a/widget/src/row.rs b/widget/src/row.rs index 460b6b0c..735fbbc0 100644 --- a/widget/src/row.rs +++ b/widget/src/row.rs @@ -80,7 +80,7 @@ where self } - /// Sets whether the contents of the [`Column`] should be clipped on + /// Sets whether the contents of the [`Row`] should be clipped on /// overflow. pub fn clip(mut self, clip: bool) -> Self { self.clip = clip; -- cgit