summaryrefslogtreecommitdiffstats
path: root/widget/src/overlay
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-08-30 04:31:21 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-08-30 04:31:21 +0200
commited3454301e663a7cb7d73cd56b57b188f4d14a2f (patch)
tree8118d1305c2eba3a1b45d04634cd0e8d050fc0fa /widget/src/overlay
parentc9bd48704dd9679c033dd0b8588e2744a3df44a0 (diff)
downloadiced-ed3454301e663a7cb7d73cd56b57b188f4d14a2f.tar.gz
iced-ed3454301e663a7cb7d73cd56b57b188f4d14a2f.tar.bz2
iced-ed3454301e663a7cb7d73cd56b57b188f4d14a2f.zip
Implement explicit text caching in the widget state tree
Diffstat (limited to 'widget/src/overlay')
-rw-r--r--widget/src/overlay/menu.rs54
1 files changed, 26 insertions, 28 deletions
diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs
index f7bdeef6..71703e71 100644
--- a/widget/src/overlay/menu.rs
+++ b/widget/src/overlay/menu.rs
@@ -31,7 +31,7 @@ where
on_option_hovered: Option<&'a dyn Fn(T) -> Message>,
width: f32,
padding: Padding,
- text_size: Option<f32>,
+ text_size: Option<Pixels>,
text_line_height: text::LineHeight,
text_shaping: text::Shaping,
font: Option<Renderer::Font>,
@@ -85,7 +85,7 @@ where
/// Sets the text size of the [`Menu`].
pub fn text_size(mut self, text_size: impl Into<Pixels>) -> Self {
- self.text_size = Some(text_size.into().0);
+ self.text_size = Some(text_size.into());
self
}
@@ -253,7 +253,7 @@ where
)
.width(self.width);
- let mut node = self.container.layout(renderer, &limits);
+ let mut node = self.container.layout(self.state, renderer, &limits);
node.move_to(if space_below > space_above {
position + Vector::new(0.0, self.target_height)
@@ -328,7 +328,7 @@ where
on_selected: Box<dyn FnMut(T) -> Message + 'a>,
on_option_hovered: Option<&'a dyn Fn(T) -> Message>,
padding: Padding,
- text_size: Option<f32>,
+ text_size: Option<Pixels>,
text_line_height: text::LineHeight,
text_shaping: text::Shaping,
font: Option<Renderer::Font>,
@@ -352,6 +352,7 @@ where
fn layout(
&self,
+ _tree: &Tree,
renderer: &Renderer,
limits: &layout::Limits,
) -> layout::Node {
@@ -361,8 +362,7 @@ where
let text_size =
self.text_size.unwrap_or_else(|| renderer.default_size());
- let text_line_height =
- self.text_line_height.to_absolute(Pixels(text_size));
+ let text_line_height = self.text_line_height.to_absolute(text_size);
let size = {
let intrinsic = Size::new(
@@ -407,9 +407,9 @@ where
.text_size
.unwrap_or_else(|| renderer.default_size());
- let option_height = f32::from(
- self.text_line_height.to_absolute(Pixels(text_size)),
- ) + self.padding.vertical();
+ let option_height =
+ f32::from(self.text_line_height.to_absolute(text_size))
+ + self.padding.vertical();
let new_hovered_option =
(cursor_position.y / option_height) as usize;
@@ -436,9 +436,9 @@ where
.text_size
.unwrap_or_else(|| renderer.default_size());
- let option_height = f32::from(
- self.text_line_height.to_absolute(Pixels(text_size)),
- ) + self.padding.vertical();
+ let option_height =
+ f32::from(self.text_line_height.to_absolute(text_size))
+ + self.padding.vertical();
*self.hovered_option =
Some((cursor_position.y / option_height) as usize);
@@ -490,7 +490,7 @@ where
let text_size =
self.text_size.unwrap_or_else(|| renderer.default_size());
let option_height =
- f32::from(self.text_line_height.to_absolute(Pixels(text_size)))
+ f32::from(self.text_line_height.to_absolute(text_size))
+ self.padding.vertical();
let offset = viewport.y - bounds.y;
@@ -526,26 +526,24 @@ where
);
}
- renderer.fill_text(Text {
- content: &option.to_string(),
- bounds: Rectangle {
- x: bounds.x + self.padding.left,
- y: bounds.center_y(),
- width: f32::INFINITY,
- ..bounds
+ renderer.fill_text(
+ Text {
+ content: &option.to_string(),
+ bounds: Size::new(f32::INFINITY, bounds.height),
+ size: text_size,
+ line_height: self.text_line_height,
+ font: self.font.unwrap_or_else(|| renderer.default_font()),
+ horizontal_alignment: alignment::Horizontal::Left,
+ vertical_alignment: alignment::Vertical::Center,
+ shaping: self.text_shaping,
},
- size: text_size,
- line_height: self.text_line_height,
- font: self.font.unwrap_or_else(|| renderer.default_font()),
- color: if is_selected {
+ Point::new(bounds.x + self.padding.left, bounds.center_y()),
+ if is_selected {
appearance.selected_text_color
} else {
appearance.text_color
},
- horizontal_alignment: alignment::Horizontal::Left,
- vertical_alignment: alignment::Vertical::Center,
- shaping: self.text_shaping,
- });
+ );
}
}
}