summaryrefslogtreecommitdiffstats
path: root/widget
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--widget/src/helpers.rs4
-rw-r--r--widget/src/text.rs2
-rw-r--r--widget/src/text/rich.rs30
-rw-r--r--widget/src/text_editor.rs29
4 files changed, 56 insertions, 9 deletions
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<Item = text::Span<'a, Renderer::Font>>,
+ spans: impl Into<Cow<'a, [text::Span<'a, Renderer::Font>]>>,
) -> 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<Span<'a, Renderer::Font>>,
+ spans: Cow<'a, [Span<'a, Renderer::Font>]>,
size: Option<Pixels>,
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<Item = Span<'a, Renderer::Font>>,
+ spans: impl Into<Cow<'a, [Span<'a, Renderer::Font>]>>,
) -> 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<Span<'a, Renderer::Font>>) -> 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<Span<'a, Renderer::Font>>
+ for Rich<'a, Theme, Renderer>
+where
+ Theme: Catalog,
+ Renderer: core::text::Renderer,
+{
+ fn from_iter<T: IntoIterator<Item = Span<'a, Renderer::Font>>>(
+ spans: T,
+ ) -> Self {
+ Self {
+ spans: spans.into_iter().collect(),
+ ..Self::new()
+ }
+ }
+}
+
impl<'a, Message, Theme, Renderer> From<Rich<'a, Theme, Renderer>>
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<Highlighter: text::Highlighter> State<Highlighter> {
}
}
+impl<Highlighter: text::Highlighter> operation::Focusable
+ for State<Highlighter>
+{
+ 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<Message, Theme, Renderer>
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::<State<Highlighter>>();
+
+ operation.focusable(state, None);
+ }
}
impl<'a, Highlighter, Message, Theme, Renderer>