Implement explicit text caching in the widget state tree

This commit is contained in:
Héctor Ramón Jiménez 2023-08-30 04:31:21 +02:00
parent c9bd48704d
commit ed3454301e
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
79 changed files with 1910 additions and 1705 deletions

View file

@ -3,8 +3,8 @@ use iced::mouse;
use iced::widget::canvas::{self, Canvas, Frame, Geometry, Path};
use iced::widget::{column, row, text, Slider};
use iced::{
Color, Element, Length, Point, Rectangle, Renderer, Sandbox, Settings,
Size, Vector,
Color, Element, Length, Pixels, Point, Rectangle, Renderer, Sandbox,
Settings, Size, Vector,
};
use palette::{
self, convert::FromColor, rgb::Rgb, Darken, Hsl, Lighten, ShiftHue,
@ -168,7 +168,7 @@ impl Theme {
let mut text = canvas::Text {
horizontal_alignment: alignment::Horizontal::Center,
vertical_alignment: alignment::Vertical::Top,
size: 15.0,
size: Pixels(15.0),
..canvas::Text::default()
};

View file

@ -40,7 +40,6 @@ impl Sandbox for Example {
Message::Selected(language) => {
self.selected_language = Some(language);
self.text = language.hello().to_string();
self.languages.unfocus();
}
Message::OptionHovered(language) => {
self.text = language.hello().to_string();

View file

@ -36,6 +36,7 @@ mod quad {
fn layout(
&self,
_tree: &widget::Tree,
_renderer: &Renderer,
_limits: &layout::Limits,
) -> layout::Node {

View file

@ -43,6 +43,7 @@ mod circle {
fn layout(
&self,
_tree: &widget::Tree,
_renderer: &Renderer,
_limits: &layout::Limits,
) -> layout::Node {

View file

@ -591,7 +591,7 @@ mod grid {
let text = Text {
color: Color::WHITE,
size: 14.0,
size: 14.0.into(),
position: Point::new(frame.width(), frame.height()),
horizontal_alignment: alignment::Horizontal::Right,
vertical_alignment: alignment::Vertical::Bottom,

View file

@ -26,6 +26,7 @@ mod rainbow {
fn layout(
&self,
_tree: &widget::Tree,
_renderer: &Renderer,
limits: &layout::Limits,
) -> layout::Node {

View file

@ -8,7 +8,7 @@ use iced_wgpu::graphics::Viewport;
use iced_wgpu::{wgpu, Backend, Renderer, Settings};
use iced_winit::core::mouse;
use iced_winit::core::renderer;
use iced_winit::core::{Color, Size};
use iced_winit::core::{Color, Font, Pixels, Size};
use iced_winit::runtime::program;
use iced_winit::runtime::Debug;
use iced_winit::style::Theme;
@ -143,12 +143,11 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {
// Initialize iced
let mut debug = Debug::new();
let mut renderer = Renderer::new(Backend::new(
&device,
&queue,
Settings::default(),
format,
));
let mut renderer = Renderer::new(
Backend::new(&device, &queue, Settings::default(), format),
Font::default(),
Pixels(16.0),
);
let mut state = program::State::new(
controls,

View file

@ -254,6 +254,7 @@ where
fn layout(
&self,
_tree: &Tree,
_renderer: &iced::Renderer<Theme>,
limits: &layout::Limits,
) -> layout::Node {

View file

@ -175,6 +175,7 @@ where
fn layout(
&self,
_tree: &Tree,
_renderer: &Renderer,
limits: &layout::Limits,
) -> layout::Node {

View file

@ -285,10 +285,13 @@ mod modal {
fn layout(
&self,
tree: &widget::Tree,
renderer: &Renderer,
limits: &layout::Limits,
) -> layout::Node {
self.base.as_widget().layout(renderer, limits)
self.base
.as_widget()
.layout(&tree.children[0], renderer, limits)
}
fn on_event(
@ -408,7 +411,11 @@ mod modal {
.width(Length::Fill)
.height(Length::Fill);
let mut child = self.content.as_widget().layout(renderer, &limits);
let mut child = self
.content
.as_widget()
.layout(self.tree, renderer, &limits);
child.align(Alignment::Center, Alignment::Center, limits.max());
let mut node = layout::Node::with_children(self.size, vec![child]);

View file

@ -326,10 +326,13 @@ mod toast {
fn layout(
&self,
tree: &Tree,
renderer: &Renderer,
limits: &layout::Limits,
) -> layout::Node {
self.content.as_widget().layout(renderer, limits)
self.content
.as_widget()
.layout(&tree.children[0], renderer, limits)
}
fn tag(&self) -> widget::tree::Tag {
@ -517,6 +520,7 @@ mod toast {
10.0,
Alignment::End,
self.toasts,
self.state,
)
.translate(Vector::new(position.x, position.y))
}

View file

@ -5,7 +5,7 @@ use iced::widget::{
scrollable, slider, text, text_input, toggler, vertical_space,
};
use iced::widget::{Button, Column, Container, Slider};
use iced::{Color, Element, Font, Length, Renderer, Sandbox, Settings};
use iced::{Color, Element, Font, Length, Pixels, Renderer, Sandbox, Settings};
pub fn main() -> iced::Result {
env_logger::init();
@ -571,7 +571,7 @@ impl<'a> Step {
text_input = text_input.icon(text_input::Icon {
font: Font::default(),
code_point: '🚀',
size: Some(28.0),
size: Some(Pixels(28.0)),
spacing: 10.0,
side: text_input::Side::Right,
});