From 904704d7c1b006c850654dcf3bf9e856e23cb317 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Thu, 18 Jul 2024 13:14:56 +0200 Subject: Flesh out the `markdown` example a bit more --- widget/src/helpers.rs | 4 ++-- widget/src/text.rs | 2 +- widget/src/text/rich.rs | 30 ++++++++++++++++++++++++------ widget/src/text_editor.rs | 29 +++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 9 deletions(-) (limited to 'widget/src') diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs index 66b37ccb..0390079f 100644 --- a/widget/src/helpers.rs +++ b/widget/src/helpers.rs @@ -24,7 +24,7 @@ use crate::tooltip::{self, Tooltip}; use crate::vertical_slider::{self, VerticalSlider}; use crate::{Column, MouseArea, Row, Space, Stack, Themer}; -use std::borrow::Borrow; +use std::borrow::{Borrow, Cow}; use std::ops::RangeInclusive; /// Creates a [`Column`] with the given children. @@ -684,7 +684,7 @@ where /// /// [`Rich`]: text::Rich pub fn rich_text<'a, Theme, Renderer>( - spans: impl IntoIterator>, + spans: impl Into]>>, ) -> text::Rich<'a, Theme, Renderer> where Theme: text::Catalog + 'a, diff --git a/widget/src/text.rs b/widget/src/text.rs index c32f9be1..9bf7fce4 100644 --- a/widget/src/text.rs +++ b/widget/src/text.rs @@ -1,7 +1,7 @@ //! Draw and interact with text. mod rich; -pub use crate::core::text::{Fragment, IntoFragment, Span}; +pub use crate::core::text::{Fragment, Highlighter, IntoFragment, Span}; pub use crate::core::widget::text::*; pub use rich::Rich; diff --git a/widget/src/text/rich.rs b/widget/src/text/rich.rs index dc784310..5c44ed9e 100644 --- a/widget/src/text/rich.rs +++ b/widget/src/text/rich.rs @@ -11,6 +11,8 @@ use crate::core::{ self, Color, Element, Length, Pixels, Rectangle, Size, Widget, }; +use std::borrow::Cow; + /// A bunch of [`Rich`] text. #[derive(Debug)] pub struct Rich<'a, Theme = crate::Theme, Renderer = crate::Renderer> @@ -18,7 +20,7 @@ where Theme: Catalog, Renderer: core::text::Renderer, { - spans: Vec>, + spans: Cow<'a, [Span<'a, Renderer::Font>]>, size: Option, line_height: LineHeight, width: Length, @@ -37,7 +39,7 @@ where /// Creates a new empty [`Rich`] text. pub fn new() -> Self { Self { - spans: Vec::new(), + spans: Cow::default(), size: None, line_height: LineHeight::default(), width: Length::Shrink, @@ -51,10 +53,10 @@ where /// Creates a new [`Rich`] text with the given text spans. pub fn with_spans( - spans: impl IntoIterator>, + spans: impl Into]>>, ) -> Self { Self { - spans: spans.into_iter().collect(), + spans: spans.into(), ..Self::new() } } @@ -151,7 +153,7 @@ where /// Adds a new text [`Span`] to the [`Rich`] text. pub fn push(mut self, span: impl Into>) -> Self { - self.spans.push(span.into()); + self.spans.to_mut().push(span.into()); self } } @@ -207,7 +209,7 @@ where limits, self.width, self.height, - self.spans.as_slice(), + self.spans.as_ref(), self.line_height, self.size, self.font, @@ -303,6 +305,22 @@ where }) } +impl<'a, Theme, Renderer> FromIterator> + for Rich<'a, Theme, Renderer> +where + Theme: Catalog, + Renderer: core::text::Renderer, +{ + fn from_iter>>( + spans: T, + ) -> Self { + Self { + spans: spans.into_iter().collect(), + ..Self::new() + } + } +} + impl<'a, Message, Theme, Renderer> From> for Element<'a, Message, Theme, Renderer> where diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 0156b960..e494a3b0 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -9,6 +9,7 @@ use crate::core::renderer; use crate::core::text::editor::{Cursor, Editor as _}; use crate::core::text::highlighter::{self, Highlighter}; use crate::core::text::{self, LineHeight}; +use crate::core::widget::operation; use crate::core::widget::{self, Widget}; use crate::core::{ Background, Border, Color, Element, Length, Padding, Pixels, Rectangle, @@ -338,6 +339,22 @@ impl State { } } +impl operation::Focusable + for State +{ + fn is_focused(&self) -> bool { + self.is_focused + } + + fn focus(&mut self) { + self.is_focused = true; + } + + fn unfocus(&mut self) { + self.is_focused = false; + } +} + impl<'a, Highlighter, Message, Theme, Renderer> Widget for TextEditor<'a, Highlighter, Message, Theme, Renderer> where @@ -640,6 +657,18 @@ where mouse::Interaction::default() } } + + fn operate( + &self, + tree: &mut widget::Tree, + _layout: Layout<'_>, + _renderer: &Renderer, + operation: &mut dyn widget::Operation<()>, + ) { + let state = tree.state.downcast_mut::>(); + + operation.focusable(state, None); + } } impl<'a, Highlighter, Message, Theme, Renderer> -- cgit