From d07a4de80539182ee3849655fcbf28c5cc52379a Mon Sep 17 00:00:00 2001 From: Victoria Brekenfeld Date: Tue, 13 Jun 2023 18:32:38 +0200 Subject: [PATCH] iced: Add tab_text helper widget --- src/utils/{iced.rs => iced/mod.rs} | 6 +- src/utils/iced/tab_text.rs | 126 +++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 3 deletions(-) rename src/utils/{iced.rs => iced/mod.rs} (99%) create mode 100644 src/utils/iced/tab_text.rs diff --git a/src/utils/iced.rs b/src/utils/iced/mod.rs similarity index 99% rename from src/utils/iced.rs rename to src/utils/iced/mod.rs index fabf8663..16882109 100644 --- a/src/utils/iced.rs +++ b/src/utils/iced/mod.rs @@ -28,6 +28,8 @@ use iced_tiny_skia::{ }; pub type Element<'a, Message> = cosmic::iced::Element<'a, Message, IcedRenderer>; +pub mod tab_text; + use ordered_float::OrderedFloat; use smithay::{ backend::{ @@ -284,10 +286,8 @@ impl IcedElementInternal

{ &mut NullClipboard, &mut self.debug, ) - .1 - .map(|command| command.actions()); + .1; - let actions = actions.unwrap_or_default(); actions .into_iter() .filter_map(|action| { diff --git a/src/utils/iced/tab_text.rs b/src/utils/iced/tab_text.rs new file mode 100644 index 00000000..da31b59e --- /dev/null +++ b/src/utils/iced/tab_text.rs @@ -0,0 +1,126 @@ +use cosmic::{ + iced::Element, + iced_core::{ + layout::{Layout, Limits, Node}, + renderer, + widget::{Tree, Widget}, + Length, Point, Rectangle, Size, + }, + iced_widget::text::StyleSheet as TextStyleSheet, +}; + +pub struct TabText<'a, Message, Renderer> +where + Renderer: cosmic::iced_core::Renderer, + Renderer::Theme: TextStyleSheet, +{ + text: Element<'a, Message, Renderer>, + height: Length, + width: Length, +} + +pub fn tab_text<'a, Message, Renderer>( + text: impl Into>, +) -> TabText<'a, Message, Renderer> +where + Renderer: cosmic::iced_core::Renderer, + Renderer::Theme: TextStyleSheet, +{ + TabText::new(text) +} + +impl<'a, Message, Renderer> TabText<'a, Message, Renderer> +where + Renderer: cosmic::iced_core::Renderer, + Renderer::Theme: TextStyleSheet, +{ + pub fn new(text: impl Into>) -> Self { + TabText { + width: Length::Shrink, + height: Length::Shrink, + text: text.into(), + } + } + + pub fn width(mut self, width: impl Into) -> Self { + let width = width.into(); + self.width = width; + self + } + + pub fn height(mut self, height: impl Into) -> Self { + let height = height.into(); + self.height = height; + self + } +} + +impl<'a, Message, Renderer> Widget for TabText<'a, Message, Renderer> +where + Renderer: cosmic::iced_core::Renderer, + Renderer::Theme: TextStyleSheet, +{ + fn width(&self) -> Length { + self.width + } + fn height(&self) -> Length { + self.height + } + + fn children(&self) -> Vec { + vec![Tree::new(&self.text)] + } + + fn diff(&mut self, tree: &mut Tree) { + tree.diff_children(std::slice::from_mut(&mut self.text)) + } + + fn layout(&self, renderer: &Renderer, limits: &Limits) -> Node { + let limits = limits.width(self.width).height(self.height); + let child_limits = Limits::new( + Size::new(limits.min().width, limits.min().height), + Size::new(limits.max().width * 2., limits.max().height), + ); + let content = self.text.as_widget().layout(renderer, &child_limits); + let size = limits.resolve(content.size()); + + Node::with_children(size, vec![content]) + } + + fn draw( + &self, + tree: &Tree, + renderer: &mut Renderer, + theme: &Renderer::Theme, + style: &renderer::Style, + layout: Layout<'_>, + cursor_position: Point, + _viewport: &Rectangle, + ) { + let bounds = layout.bounds(); + let content_layout = layout.children().next().unwrap(); + + renderer.with_layer(bounds, |renderer| { + self.text.as_widget().draw( + &tree.children[0], + renderer, + theme, + style, + content_layout, + cursor_position, + &bounds, + ); + }); + } +} + +impl<'a, Message, Renderer> Into> for TabText<'a, Message, Renderer> +where + Renderer: cosmic::iced_core::Renderer + 'a, + Renderer::Theme: TextStyleSheet, + Message: 'a, +{ + fn into(self) -> Element<'a, Message, Renderer> { + Element::new(self) + } +}