Make widget::Tree mutable in Widget::layout
This commit is contained in:
parent
301e6e5fdc
commit
a026e917d3
45 changed files with 135 additions and 135 deletions
|
|
@ -306,7 +306,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
@ -492,7 +492,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ pub fn resolve<Message, Renderer>(
|
|||
spacing: f32,
|
||||
align_items: Alignment,
|
||||
items: &[Element<'_, Message, Renderer>],
|
||||
trees: &[widget::Tree],
|
||||
trees: &mut [widget::Tree],
|
||||
) -> Node
|
||||
where
|
||||
Renderer: crate::Renderer,
|
||||
|
|
@ -83,7 +83,7 @@ where
|
|||
let mut nodes: Vec<Node> = Vec::with_capacity(items.len());
|
||||
nodes.resize(items.len(), Node::default());
|
||||
|
||||
for (i, (child, tree)) in items.iter().zip(trees).enumerate() {
|
||||
for (i, (child, tree)) in items.iter().zip(trees.iter_mut()).enumerate() {
|
||||
let fill_factor = match axis {
|
||||
Axis::Horizontal => child.as_widget().width(),
|
||||
Axis::Vertical => child.as_widget().height(),
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ where
|
|||
///
|
||||
/// [`Node`]: layout::Node
|
||||
fn layout(
|
||||
&self,
|
||||
&mut self,
|
||||
renderer: &Renderer,
|
||||
bounds: Size,
|
||||
position: Point,
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ where
|
|||
|
||||
/// Computes the layout of the [`Element`] in the given bounds.
|
||||
pub fn layout(
|
||||
&self,
|
||||
&mut self,
|
||||
renderer: &Renderer,
|
||||
bounds: Size,
|
||||
translation: Vector,
|
||||
|
|
@ -150,7 +150,7 @@ where
|
|||
Renderer: crate::Renderer,
|
||||
{
|
||||
fn layout(
|
||||
&self,
|
||||
&mut self,
|
||||
renderer: &Renderer,
|
||||
bounds: Size,
|
||||
position: Point,
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ where
|
|||
Renderer: crate::Renderer,
|
||||
{
|
||||
fn layout(
|
||||
&self,
|
||||
&mut self,
|
||||
renderer: &Renderer,
|
||||
bounds: Size,
|
||||
position: Point,
|
||||
|
|
@ -71,7 +71,7 @@ where
|
|||
layout::Node::with_children(
|
||||
bounds,
|
||||
self.children
|
||||
.iter()
|
||||
.iter_mut()
|
||||
.map(|child| child.layout(renderer, bounds, translation))
|
||||
.collect(),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ where
|
|||
/// user interface.
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node;
|
||||
|
|
|
|||
|
|
@ -3,12 +3,11 @@ use crate::alignment;
|
|||
use crate::layout;
|
||||
use crate::mouse;
|
||||
use crate::renderer;
|
||||
use crate::text::{self, Paragraph as _};
|
||||
use crate::text::{self, Paragraph};
|
||||
use crate::widget::tree::{self, Tree};
|
||||
use crate::{Color, Element, Layout, Length, Pixels, Point, Rectangle, Widget};
|
||||
|
||||
use std::borrow::Cow;
|
||||
use std::cell::RefCell;
|
||||
|
||||
pub use text::{LineHeight, Shaping};
|
||||
|
||||
|
|
@ -120,7 +119,7 @@ where
|
|||
|
||||
/// The internal state of a [`Text`] widget.
|
||||
#[derive(Debug, Default)]
|
||||
pub struct State<T>(RefCell<T>);
|
||||
pub struct State<P: Paragraph>(P);
|
||||
|
||||
impl<'a, Message, Renderer> Widget<Message, Renderer> for Text<'a, Renderer>
|
||||
where
|
||||
|
|
@ -132,7 +131,7 @@ where
|
|||
}
|
||||
|
||||
fn state(&self) -> tree::State {
|
||||
tree::State::new(State(RefCell::new(Renderer::Paragraph::default())))
|
||||
tree::State::new(State(Renderer::Paragraph::default()))
|
||||
}
|
||||
|
||||
fn width(&self) -> Length {
|
||||
|
|
@ -145,12 +144,12 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
layout(
|
||||
tree.state.downcast_ref::<State<Renderer::Paragraph>>(),
|
||||
tree.state.downcast_mut::<State<Renderer::Paragraph>>(),
|
||||
renderer,
|
||||
limits,
|
||||
self.width,
|
||||
|
|
@ -189,7 +188,7 @@ where
|
|||
|
||||
/// Produces the [`layout::Node`] of a [`Text`] widget.
|
||||
pub fn layout<Renderer>(
|
||||
state: &State<Renderer::Paragraph>,
|
||||
state: &mut State<Renderer::Paragraph>,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
width: Length,
|
||||
|
|
@ -211,10 +210,10 @@ where
|
|||
let size = size.unwrap_or_else(|| renderer.default_size());
|
||||
let font = font.unwrap_or_else(|| renderer.default_font());
|
||||
|
||||
let mut paragraph = state.0.borrow_mut();
|
||||
let State(ref mut paragraph) = state;
|
||||
|
||||
renderer.update_paragraph(
|
||||
&mut paragraph,
|
||||
paragraph,
|
||||
text::Text {
|
||||
content,
|
||||
bounds,
|
||||
|
|
@ -251,7 +250,7 @@ pub fn draw<Renderer>(
|
|||
) where
|
||||
Renderer: text::Renderer,
|
||||
{
|
||||
let paragraph = state.0.borrow();
|
||||
let State(ref paragraph) = state;
|
||||
let bounds = layout.bounds();
|
||||
|
||||
let x = match paragraph.horizontal_alignment() {
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ mod quad {
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &widget::Tree,
|
||||
_tree: &mut widget::Tree,
|
||||
_renderer: &Renderer,
|
||||
_limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ mod circle {
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &widget::Tree,
|
||||
_tree: &mut widget::Tree,
|
||||
_renderer: &Renderer,
|
||||
_limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ mod rainbow {
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &widget::Tree,
|
||||
_tree: &mut widget::Tree,
|
||||
_renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -254,7 +254,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &Tree,
|
||||
_tree: &mut Tree,
|
||||
_renderer: &iced::Renderer<Theme>,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -175,7 +175,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &Tree,
|
||||
_tree: &mut Tree,
|
||||
_renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -285,13 +285,15 @@ mod modal {
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &widget::Tree,
|
||||
tree: &mut widget::Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
self.base
|
||||
.as_widget()
|
||||
.layout(&tree.children[0], renderer, limits)
|
||||
self.base.as_widget().layout(
|
||||
&mut tree.children[0],
|
||||
renderer,
|
||||
limits,
|
||||
)
|
||||
}
|
||||
|
||||
fn on_event(
|
||||
|
|
@ -402,7 +404,7 @@ mod modal {
|
|||
Message: Clone,
|
||||
{
|
||||
fn layout(
|
||||
&self,
|
||||
&mut self,
|
||||
renderer: &Renderer,
|
||||
_bounds: Size,
|
||||
position: Point,
|
||||
|
|
|
|||
|
|
@ -326,13 +326,15 @@ mod toast {
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
self.content
|
||||
.as_widget()
|
||||
.layout(&tree.children[0], renderer, limits)
|
||||
self.content.as_widget().layout(
|
||||
&mut tree.children[0],
|
||||
renderer,
|
||||
limits,
|
||||
)
|
||||
}
|
||||
|
||||
fn tag(&self) -> widget::tree::Tag {
|
||||
|
|
@ -503,7 +505,7 @@ mod toast {
|
|||
for Overlay<'a, 'b, Message>
|
||||
{
|
||||
fn layout(
|
||||
&self,
|
||||
&mut self,
|
||||
renderer: &Renderer,
|
||||
bounds: Size,
|
||||
position: Point,
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ where
|
|||
state.diff(root.as_widget());
|
||||
|
||||
let base = root.as_widget().layout(
|
||||
&state,
|
||||
&mut state,
|
||||
renderer,
|
||||
&layout::Limits::new(Size::ZERO, bounds),
|
||||
);
|
||||
|
|
@ -230,7 +230,7 @@ where
|
|||
let _ = ManuallyDrop::into_inner(manual_overlay);
|
||||
|
||||
self.base = self.root.as_widget().layout(
|
||||
&self.state,
|
||||
&mut self.state,
|
||||
renderer,
|
||||
&layout::Limits::new(Size::ZERO, self.bounds),
|
||||
);
|
||||
|
|
@ -330,7 +330,7 @@ where
|
|||
|
||||
shell.revalidate_layout(|| {
|
||||
self.base = self.root.as_widget().layout(
|
||||
&self.state,
|
||||
&mut self.state,
|
||||
renderer,
|
||||
&layout::Limits::new(Size::ZERO, self.bounds),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -159,14 +159,16 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
layout(limits, self.width, self.height, self.padding, |limits| {
|
||||
self.content
|
||||
.as_widget()
|
||||
.layout(&tree.children[0], renderer, limits)
|
||||
self.content.as_widget().layout(
|
||||
&mut tree.children[0],
|
||||
renderer,
|
||||
limits,
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &Tree,
|
||||
_tree: &mut Tree,
|
||||
_renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -184,7 +184,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
@ -195,7 +195,7 @@ where
|
|||
|limits| {
|
||||
let state = tree
|
||||
.state
|
||||
.downcast_ref::<widget::text::State<Renderer::Paragraph>>();
|
||||
.downcast_mut::<widget::text::State<Renderer::Paragraph>>();
|
||||
|
||||
widget::text::layout(
|
||||
state,
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
@ -139,7 +139,7 @@ where
|
|||
self.spacing,
|
||||
self.align_items,
|
||||
&self.children,
|
||||
&tree.children,
|
||||
&mut tree.children,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -305,7 +305,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &widget::Tree,
|
||||
tree: &mut widget::Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -162,7 +162,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -167,7 +167,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &Tree,
|
||||
_tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &Tree,
|
||||
_tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -152,7 +152,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
@ -327,7 +327,7 @@ where
|
|||
Renderer: core::Renderer,
|
||||
{
|
||||
fn layout(
|
||||
&self,
|
||||
&mut self,
|
||||
renderer: &Renderer,
|
||||
bounds: Size,
|
||||
position: Point,
|
||||
|
|
|
|||
|
|
@ -254,7 +254,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
@ -567,7 +567,7 @@ where
|
|||
S: 'static + Default,
|
||||
{
|
||||
fn layout(
|
||||
&self,
|
||||
&mut self,
|
||||
renderer: &Renderer,
|
||||
bounds: Size,
|
||||
position: Point,
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ impl<'a, Message, Renderer> Content<'a, Message, Renderer>
|
|||
where
|
||||
Renderer: core::Renderer,
|
||||
{
|
||||
fn layout(&mut self, tree: &Tree, renderer: &Renderer) {
|
||||
fn layout(&mut self, tree: &mut Tree, renderer: &Renderer) {
|
||||
if self.layout.is_none() {
|
||||
self.layout = Some(self.element.as_widget().layout(
|
||||
tree,
|
||||
|
|
@ -144,7 +144,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &Tree,
|
||||
_tree: &mut Tree,
|
||||
_renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
@ -363,7 +363,7 @@ where
|
|||
Renderer: core::Renderer,
|
||||
{
|
||||
fn layout(
|
||||
&self,
|
||||
&mut self,
|
||||
renderer: &Renderer,
|
||||
bounds: Size,
|
||||
position: Point,
|
||||
|
|
|
|||
|
|
@ -120,7 +120,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -232,7 +232,7 @@ where
|
|||
Renderer::Theme: StyleSheet + container::StyleSheet,
|
||||
{
|
||||
fn layout(
|
||||
&self,
|
||||
&mut self,
|
||||
renderer: &Renderer,
|
||||
bounds: Size,
|
||||
position: Point,
|
||||
|
|
@ -352,7 +352,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &Tree,
|
||||
_tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -275,7 +275,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
@ -475,7 +475,7 @@ where
|
|||
|
||||
/// Calculates the [`Layout`] of a [`PaneGrid`].
|
||||
pub fn layout<Renderer, T>(
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
node: &Node,
|
||||
|
|
@ -483,14 +483,19 @@ pub fn layout<Renderer, T>(
|
|||
height: Length,
|
||||
spacing: f32,
|
||||
contents: impl Iterator<Item = (Pane, T)>,
|
||||
layout_content: impl Fn(T, &Tree, &Renderer, &layout::Limits) -> layout::Node,
|
||||
layout_content: impl Fn(
|
||||
T,
|
||||
&mut Tree,
|
||||
&Renderer,
|
||||
&layout::Limits,
|
||||
) -> layout::Node,
|
||||
) -> layout::Node {
|
||||
let limits = limits.width(width).height(height);
|
||||
let size = limits.resolve(Size::ZERO);
|
||||
|
||||
let regions = node.pane_regions(spacing, size);
|
||||
let children = contents
|
||||
.zip(tree.children.iter())
|
||||
.zip(tree.children.iter_mut())
|
||||
.filter_map(|((pane, content), tree)| {
|
||||
let region = regions.get(&pane)?;
|
||||
let size = Size::new(region.width, region.height);
|
||||
|
|
|
|||
|
|
@ -150,7 +150,7 @@ where
|
|||
|
||||
pub(crate) fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
@ -158,7 +158,7 @@ where
|
|||
let max_size = limits.max();
|
||||
|
||||
let title_bar_layout = title_bar.layout(
|
||||
&tree.children[1],
|
||||
&mut tree.children[1],
|
||||
renderer,
|
||||
&layout::Limits::new(Size::ZERO, max_size),
|
||||
);
|
||||
|
|
@ -166,7 +166,7 @@ where
|
|||
let title_bar_size = title_bar_layout.size();
|
||||
|
||||
let mut body_layout = self.body.as_widget().layout(
|
||||
&tree.children[0],
|
||||
&mut tree.children[0],
|
||||
renderer,
|
||||
&layout::Limits::new(
|
||||
Size::ZERO,
|
||||
|
|
@ -184,9 +184,11 @@ where
|
|||
vec![title_bar_layout, body_layout],
|
||||
)
|
||||
} else {
|
||||
self.body
|
||||
.as_widget()
|
||||
.layout(&tree.children[0], renderer, limits)
|
||||
self.body.as_widget().layout(
|
||||
&mut tree.children[0],
|
||||
renderer,
|
||||
limits,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -213,7 +213,7 @@ where
|
|||
|
||||
pub(crate) fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
@ -221,7 +221,7 @@ where
|
|||
let max_size = limits.max();
|
||||
|
||||
let title_layout = self.content.as_widget().layout(
|
||||
&tree.children[0],
|
||||
&mut tree.children[0],
|
||||
renderer,
|
||||
&layout::Limits::new(Size::ZERO, max_size),
|
||||
);
|
||||
|
|
@ -230,7 +230,7 @@ where
|
|||
|
||||
let mut node = if let Some(controls) = &self.controls {
|
||||
let mut controls_layout = controls.as_widget().layout(
|
||||
&tree.children[1],
|
||||
&mut tree.children[1],
|
||||
renderer,
|
||||
&layout::Limits::new(Size::ZERO, max_size),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@ use crate::overlay::menu::{self, Menu};
|
|||
use crate::scrollable;
|
||||
|
||||
use std::borrow::Cow;
|
||||
use std::cell::RefCell;
|
||||
|
||||
pub use crate::style::pick_list::{Appearance, StyleSheet};
|
||||
|
||||
|
|
@ -175,12 +174,12 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
layout(
|
||||
tree.state.downcast_ref::<State<Renderer::Paragraph>>(),
|
||||
tree.state.downcast_mut::<State<Renderer::Paragraph>>(),
|
||||
renderer,
|
||||
limits,
|
||||
self.width,
|
||||
|
|
@ -305,8 +304,8 @@ pub struct State<P: text::Paragraph> {
|
|||
keyboard_modifiers: keyboard::Modifiers,
|
||||
is_open: bool,
|
||||
hovered_option: Option<usize>,
|
||||
option_paragraphs: RefCell<Vec<P>>,
|
||||
placeholder_paragraph: RefCell<P>,
|
||||
options: Vec<P>,
|
||||
placeholder: P,
|
||||
}
|
||||
|
||||
impl<P: text::Paragraph> State<P> {
|
||||
|
|
@ -317,8 +316,8 @@ impl<P: text::Paragraph> State<P> {
|
|||
keyboard_modifiers: keyboard::Modifiers::default(),
|
||||
is_open: bool::default(),
|
||||
hovered_option: Option::default(),
|
||||
option_paragraphs: RefCell::new(Vec::new()),
|
||||
placeholder_paragraph: RefCell::new(Default::default()),
|
||||
options: Vec::new(),
|
||||
placeholder: P::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -375,7 +374,7 @@ pub struct Icon<Font> {
|
|||
|
||||
/// Computes the layout of a [`PickList`].
|
||||
pub fn layout<Renderer, T>(
|
||||
state: &State<Renderer::Paragraph>,
|
||||
state: &mut State<Renderer::Paragraph>,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
width: Length,
|
||||
|
|
@ -397,9 +396,7 @@ where
|
|||
let font = font.unwrap_or_else(|| renderer.default_font());
|
||||
let text_size = text_size.unwrap_or_else(|| renderer.default_size());
|
||||
|
||||
let mut paragraphs = state.option_paragraphs.borrow_mut();
|
||||
|
||||
paragraphs.resize_with(options.len(), Default::default);
|
||||
state.options.resize_with(options.len(), Default::default);
|
||||
|
||||
let option_text = Text {
|
||||
content: "",
|
||||
|
|
@ -415,7 +412,7 @@ where
|
|||
shaping: text_shaping,
|
||||
};
|
||||
|
||||
for (option, paragraph) in options.iter().zip(paragraphs.iter_mut()) {
|
||||
for (option, paragraph) in options.iter().zip(state.options.iter_mut()) {
|
||||
let label = option.to_string();
|
||||
|
||||
renderer.update_paragraph(
|
||||
|
|
@ -428,9 +425,8 @@ where
|
|||
}
|
||||
|
||||
if let Some(placeholder) = placeholder {
|
||||
let mut paragraph = state.placeholder_paragraph.borrow_mut();
|
||||
renderer.update_paragraph(
|
||||
&mut paragraph,
|
||||
&mut state.placeholder,
|
||||
Text {
|
||||
content: placeholder,
|
||||
..option_text
|
||||
|
|
@ -441,13 +437,13 @@ where
|
|||
let max_width = match width {
|
||||
Length::Shrink => {
|
||||
let labels_width =
|
||||
paragraphs.iter().fold(0.0, |width, paragraph| {
|
||||
state.options.iter().fold(0.0, |width, paragraph| {
|
||||
f32::max(width, paragraph.min_width())
|
||||
});
|
||||
|
||||
labels_width.max(
|
||||
placeholder
|
||||
.map(|_| state.placeholder_paragraph.borrow().min_width())
|
||||
.map(|_| state.placeholder.min_width())
|
||||
.unwrap_or(0.0),
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &Tree,
|
||||
_tree: &mut Tree,
|
||||
_renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ impl<'a, Message, Theme> Widget<Message, Renderer<Theme>> for QRCode<'a> {
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &Tree,
|
||||
_tree: &mut Tree,
|
||||
_renderer: &Renderer<Theme>,
|
||||
_limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -211,7 +211,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
@ -222,7 +222,7 @@ where
|
|||
|limits| {
|
||||
let state = tree
|
||||
.state
|
||||
.downcast_ref::<widget::text::State<Renderer::Paragraph>>();
|
||||
.downcast_mut::<widget::text::State<Renderer::Paragraph>>();
|
||||
|
||||
widget::text::layout(
|
||||
state,
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
@ -128,7 +128,7 @@ where
|
|||
self.spacing,
|
||||
self.align_items,
|
||||
&self.children,
|
||||
&tree.children,
|
||||
&mut tree.children,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -72,7 +72,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &Tree,
|
||||
_tree: &mut Tree,
|
||||
_renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -230,7 +230,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
@ -242,7 +242,7 @@ where
|
|||
&self.direction,
|
||||
|renderer, limits| {
|
||||
self.content.as_widget().layout(
|
||||
&tree.children[0],
|
||||
&mut tree.children[0],
|
||||
renderer,
|
||||
limits,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -169,7 +169,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &Tree,
|
||||
_tree: &mut Tree,
|
||||
_renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &Tree,
|
||||
_tree: &mut Tree,
|
||||
_renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &Tree,
|
||||
_tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
|
|
@ -30,8 +30,6 @@ use crate::core::{
|
|||
};
|
||||
use crate::runtime::Command;
|
||||
|
||||
use std::cell::RefCell;
|
||||
|
||||
pub use iced_style::text_input::{Appearance, StyleSheet};
|
||||
|
||||
/// A field that can be filled with text.
|
||||
|
|
@ -267,7 +265,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
@ -280,7 +278,7 @@ where
|
|||
self.font,
|
||||
self.line_height,
|
||||
self.icon.as_ref(),
|
||||
tree.state.downcast_ref::<State<Renderer::Paragraph>>(),
|
||||
tree.state.downcast_mut::<State<Renderer::Paragraph>>(),
|
||||
&self.value,
|
||||
&self.placeholder,
|
||||
self.is_secure,
|
||||
|
|
@ -469,7 +467,7 @@ pub fn layout<Renderer>(
|
|||
font: Option<Renderer::Font>,
|
||||
line_height: text::LineHeight,
|
||||
icon: Option<&Icon<Renderer::Font>>,
|
||||
state: &State<Renderer::Paragraph>,
|
||||
state: &mut State<Renderer::Paragraph>,
|
||||
value: &Value,
|
||||
placeholder: &str,
|
||||
is_secure: bool,
|
||||
|
|
@ -499,14 +497,12 @@ where
|
|||
shaping: text::Shaping::Advanced,
|
||||
};
|
||||
|
||||
renderer.update_paragraph(
|
||||
&mut state.placeholder_paragraph.borrow_mut(),
|
||||
placeholder_text,
|
||||
);
|
||||
renderer
|
||||
.update_paragraph(&mut state.placeholder_paragraph, placeholder_text);
|
||||
|
||||
if is_secure {
|
||||
renderer.update_paragraph(
|
||||
&mut state.paragraph.borrow_mut(),
|
||||
&mut state.paragraph,
|
||||
Text {
|
||||
content: &value.secure().to_string(),
|
||||
..placeholder_text
|
||||
|
|
@ -514,7 +510,7 @@ where
|
|||
);
|
||||
} else {
|
||||
renderer.update_paragraph(
|
||||
&mut state.paragraph.borrow_mut(),
|
||||
&mut state.paragraph,
|
||||
Text {
|
||||
content: &value.to_string(),
|
||||
..placeholder_text
|
||||
|
|
@ -1072,7 +1068,6 @@ pub fn draw<Renderer>(
|
|||
}
|
||||
|
||||
let text = value.to_string();
|
||||
let paragraph = &state.paragraph.borrow() as &Renderer::Paragraph;
|
||||
|
||||
let (cursor, offset) = if let Some(focus) = state
|
||||
.is_focused
|
||||
|
|
@ -1083,7 +1078,7 @@ pub fn draw<Renderer>(
|
|||
cursor::State::Index(position) => {
|
||||
let (text_value_width, offset) =
|
||||
measure_cursor_and_scroll_offset(
|
||||
paragraph,
|
||||
&state.paragraph,
|
||||
text_bounds,
|
||||
position,
|
||||
);
|
||||
|
|
@ -1121,14 +1116,14 @@ pub fn draw<Renderer>(
|
|||
|
||||
let (left_position, left_offset) =
|
||||
measure_cursor_and_scroll_offset(
|
||||
paragraph,
|
||||
&state.paragraph,
|
||||
text_bounds,
|
||||
left,
|
||||
);
|
||||
|
||||
let (right_position, right_offset) =
|
||||
measure_cursor_and_scroll_offset(
|
||||
paragraph,
|
||||
&state.paragraph,
|
||||
text_bounds,
|
||||
right,
|
||||
);
|
||||
|
|
@ -1162,7 +1157,7 @@ pub fn draw<Renderer>(
|
|||
(None, 0.0)
|
||||
};
|
||||
|
||||
let text_width = paragraph.min_width();
|
||||
let text_width = state.paragraph.min_width();
|
||||
|
||||
let render = |renderer: &mut Renderer| {
|
||||
if let Some((cursor, color)) = cursor {
|
||||
|
|
@ -1171,13 +1166,11 @@ pub fn draw<Renderer>(
|
|||
renderer.with_translation(Vector::ZERO, |_| {});
|
||||
}
|
||||
|
||||
let placeholder_paragraph = state.placeholder_paragraph.borrow();
|
||||
|
||||
renderer.fill_paragraph(
|
||||
if text.is_empty() {
|
||||
&placeholder_paragraph
|
||||
&state.placeholder_paragraph
|
||||
} else {
|
||||
paragraph
|
||||
&state.paragraph
|
||||
},
|
||||
Point::new(text_bounds.x, text_bounds.center_y()),
|
||||
if text.is_empty() {
|
||||
|
|
@ -1219,8 +1212,8 @@ pub fn mouse_interaction(
|
|||
/// The state of a [`TextInput`].
|
||||
#[derive(Debug, Default, Clone)]
|
||||
pub struct State<P: text::Paragraph> {
|
||||
paragraph: RefCell<P>,
|
||||
placeholder_paragraph: RefCell<P>,
|
||||
paragraph: P,
|
||||
placeholder_paragraph: P,
|
||||
is_focused: Option<Focus>,
|
||||
is_dragging: bool,
|
||||
is_pasting: Option<Value>,
|
||||
|
|
@ -1246,8 +1239,8 @@ impl<P: text::Paragraph> State<P> {
|
|||
/// Creates a new [`State`], representing a focused [`TextInput`].
|
||||
pub fn focused() -> Self {
|
||||
Self {
|
||||
paragraph: RefCell::new(P::default()),
|
||||
placeholder_paragraph: RefCell::new(P::default()),
|
||||
paragraph: P::default(),
|
||||
placeholder_paragraph: P::default(),
|
||||
is_focused: None,
|
||||
is_dragging: false,
|
||||
is_pasting: None,
|
||||
|
|
@ -1364,7 +1357,7 @@ fn offset<P: text::Paragraph>(
|
|||
};
|
||||
|
||||
let (_, offset) = measure_cursor_and_scroll_offset(
|
||||
&state.paragraph.borrow() as &P,
|
||||
&state.paragraph,
|
||||
text_bounds,
|
||||
focus_position,
|
||||
);
|
||||
|
|
@ -1402,7 +1395,6 @@ fn find_cursor_position<P: text::Paragraph>(
|
|||
|
||||
let char_offset = state
|
||||
.paragraph
|
||||
.borrow()
|
||||
.hit_test(Point::new(x + offset, text_bounds.height / 2.0))
|
||||
.map(text::Hit::cursor)?;
|
||||
|
||||
|
|
@ -1432,7 +1424,7 @@ fn replace_paragraph<Renderer>(
|
|||
let mut children_layout = layout.children();
|
||||
let text_bounds = children_layout.next().unwrap().bounds();
|
||||
|
||||
*state.paragraph.get_mut() = renderer.create_paragraph(Text {
|
||||
state.paragraph = renderer.create_paragraph(Text {
|
||||
font,
|
||||
line_height,
|
||||
content: &value.to_string(),
|
||||
|
|
|
|||
|
|
@ -178,7 +178,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &Tree,
|
||||
tree: &mut Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
@ -192,7 +192,7 @@ where
|
|||
if let Some(label) = self.label.as_deref() {
|
||||
let state = tree
|
||||
.state
|
||||
.downcast_ref::<widget::text::State<Renderer::Paragraph>>();
|
||||
.downcast_mut::<widget::text::State<Renderer::Paragraph>>();
|
||||
|
||||
widget::text::layout(
|
||||
state,
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
tree: &widget::Tree,
|
||||
tree: &mut widget::Tree,
|
||||
renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
@ -302,7 +302,7 @@ where
|
|||
Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
|
||||
{
|
||||
tooltip: &'b Text<'a, Renderer>,
|
||||
state: &'b widget::Tree,
|
||||
state: &'b mut widget::Tree,
|
||||
cursor_position: Point,
|
||||
content_bounds: Rectangle,
|
||||
snap_within_viewport: bool,
|
||||
|
|
@ -319,7 +319,7 @@ where
|
|||
Renderer::Theme: container::StyleSheet + widget::text::StyleSheet,
|
||||
{
|
||||
fn layout(
|
||||
&self,
|
||||
&mut self,
|
||||
renderer: &Renderer,
|
||||
bounds: Size,
|
||||
position: Point,
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@ where
|
|||
|
||||
fn layout(
|
||||
&self,
|
||||
_tree: &Tree,
|
||||
_tree: &mut Tree,
|
||||
_renderer: &Renderer,
|
||||
limits: &layout::Limits,
|
||||
) -> layout::Node {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue