diff options
Diffstat (limited to 'widget/src')
| -rw-r--r-- | widget/src/checkbox.rs | 4 | ||||
| -rw-r--r-- | widget/src/column.rs | 20 | ||||
| -rw-r--r-- | widget/src/combo_box.rs | 3 | ||||
| -rw-r--r-- | widget/src/container.rs | 32 | ||||
| -rw-r--r-- | widget/src/overlay/menu.rs | 1 | ||||
| -rw-r--r-- | widget/src/pick_list.rs | 6 | ||||
| -rw-r--r-- | widget/src/radio.rs | 3 | ||||
| -rw-r--r-- | widget/src/row.rs | 20 | ||||
| -rw-r--r-- | widget/src/text_editor.rs | 3 | ||||
| -rw-r--r-- | widget/src/text_input.rs | 59 | ||||
| -rw-r--r-- | widget/src/toggler.rs | 3 | 
11 files changed, 84 insertions, 70 deletions
diff --git a/widget/src/checkbox.rs b/widget/src/checkbox.rs index d7fdf339..a0d9559b 100644 --- a/widget/src/checkbox.rs +++ b/widget/src/checkbox.rs @@ -266,7 +266,7 @@ where          style: &renderer::Style,          layout: Layout<'_>,          cursor: mouse::Cursor, -        _viewport: &Rectangle, +        viewport: &Rectangle,      ) {          let is_mouse_over = cursor.is_over(layout.bounds()); @@ -315,6 +315,7 @@ where                      },                      bounds.center(),                      custom_style.icon_color, +                    *viewport,                  );              }          } @@ -330,6 +331,7 @@ where                  crate::text::Appearance {                      color: custom_style.text_color,                  }, +                viewport,              );          }      } diff --git a/widget/src/column.rs b/widget/src/column.rs index 42e90ac1..abb522be 100644 --- a/widget/src/column.rs +++ b/widget/src/column.rs @@ -224,15 +224,17 @@ where          cursor: mouse::Cursor,          viewport: &Rectangle,      ) { -        for ((child, state), layout) in self -            .children -            .iter() -            .zip(&tree.children) -            .zip(layout.children()) -        { -            child -                .as_widget() -                .draw(state, renderer, theme, style, layout, cursor, viewport); +        if let Some(viewport) = layout.bounds().intersection(viewport) { +            for ((child, state), layout) in self +                .children +                .iter() +                .zip(&tree.children) +                .zip(layout.children()) +            { +                child.as_widget().draw( +                    state, renderer, theme, style, layout, cursor, &viewport, +                ); +            }          }      } diff --git a/widget/src/combo_box.rs b/widget/src/combo_box.rs index 768c2402..31ec27fc 100644 --- a/widget/src/combo_box.rs +++ b/widget/src/combo_box.rs @@ -622,7 +622,7 @@ where          _style: &renderer::Style,          layout: Layout<'_>,          cursor: mouse::Cursor, -        _viewport: &Rectangle, +        viewport: &Rectangle,      ) {          let is_focused = {              let text_input_state = tree.children[0] @@ -645,6 +645,7 @@ where              layout,              cursor,              selection, +            viewport,          );      } diff --git a/widget/src/container.rs b/widget/src/container.rs index ee7a4965..5dd7705b 100644 --- a/widget/src/container.rs +++ b/widget/src/container.rs @@ -252,21 +252,23 @@ where      ) {          let style = theme.appearance(&self.style); -        draw_background(renderer, &style, layout.bounds()); - -        self.content.as_widget().draw( -            tree, -            renderer, -            theme, -            &renderer::Style { -                text_color: style -                    .text_color -                    .unwrap_or(renderer_style.text_color), -            }, -            layout.children().next().unwrap(), -            cursor, -            viewport, -        ); +        if let Some(viewport) = layout.bounds().intersection(viewport) { +            draw_background(renderer, &style, layout.bounds()); + +            self.content.as_widget().draw( +                tree, +                renderer, +                theme, +                &renderer::Style { +                    text_color: style +                        .text_color +                        .unwrap_or(renderer_style.text_color), +                }, +                layout.children().next().unwrap(), +                cursor, +                &viewport, +            ); +        }      }      fn overlay<'b>( diff --git a/widget/src/overlay/menu.rs b/widget/src/overlay/menu.rs index 5098fa17..e45b44ae 100644 --- a/widget/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -544,6 +544,7 @@ where                  } else {                      appearance.text_color                  }, +                *viewport,              );          }      } diff --git a/widget/src/pick_list.rs b/widget/src/pick_list.rs index 00c1a7ff..022ca8d9 100644 --- a/widget/src/pick_list.rs +++ b/widget/src/pick_list.rs @@ -235,7 +235,7 @@ where          _style: &renderer::Style,          layout: Layout<'_>,          cursor: mouse::Cursor, -        _viewport: &Rectangle, +        viewport: &Rectangle,      ) {          let font = self.font.unwrap_or_else(|| renderer.default_font());          draw( @@ -253,6 +253,7 @@ where              &self.handle,              &self.style,              || tree.state.downcast_ref::<State<Renderer::Paragraph>>(), +            viewport,          );      } @@ -631,6 +632,7 @@ pub fn draw<'a, T, Renderer>(      handle: &Handle<Renderer::Font>,      style: &<Renderer::Theme as StyleSheet>::Style,      state: impl FnOnce() -> &'a State<Renderer::Paragraph>, +    viewport: &Rectangle,  ) where      Renderer: text::Renderer,      Renderer::Theme: StyleSheet, @@ -715,6 +717,7 @@ pub fn draw<'a, T, Renderer>(                  bounds.center_y(),              ),              style.handle_color, +            *viewport,          );      } @@ -743,6 +746,7 @@ pub fn draw<'a, T, Renderer>(              } else {                  style.placeholder_color              }, +            *viewport,          );      }  } diff --git a/widget/src/radio.rs b/widget/src/radio.rs index 57acc033..ae2365dd 100644 --- a/widget/src/radio.rs +++ b/widget/src/radio.rs @@ -291,7 +291,7 @@ where          style: &renderer::Style,          layout: Layout<'_>,          cursor: mouse::Cursor, -        _viewport: &Rectangle, +        viewport: &Rectangle,      ) {          let is_mouse_over = cursor.is_over(layout.bounds()); @@ -349,6 +349,7 @@ where                  crate::text::Appearance {                      color: custom_style.text_color,                  }, +                viewport,              );          }      } diff --git a/widget/src/row.rs b/widget/src/row.rs index 7ca90fbb..d52b8c43 100644 --- a/widget/src/row.rs +++ b/widget/src/row.rs @@ -213,15 +213,17 @@ where          cursor: mouse::Cursor,          viewport: &Rectangle,      ) { -        for ((child, state), layout) in self -            .children -            .iter() -            .zip(&tree.children) -            .zip(layout.children()) -        { -            child -                .as_widget() -                .draw(state, renderer, theme, style, layout, cursor, viewport); +        if let Some(viewport) = layout.bounds().intersection(viewport) { +            for ((child, state), layout) in self +                .children +                .iter() +                .zip(&tree.children) +                .zip(layout.children()) +            { +                child.as_widget().draw( +                    state, renderer, theme, style, layout, cursor, &viewport, +                ); +            }          }      } diff --git a/widget/src/text_editor.rs b/widget/src/text_editor.rs index 1708a2e5..63d48868 100644 --- a/widget/src/text_editor.rs +++ b/widget/src/text_editor.rs @@ -429,7 +429,7 @@ where          style: &renderer::Style,          layout: Layout<'_>,          cursor: mouse::Cursor, -        _viewport: &Rectangle, +        viewport: &Rectangle,      ) {          let bounds = layout.bounds(); @@ -470,6 +470,7 @@ where              bounds.position()                  + Vector::new(self.padding.left, self.padding.top),              style.text_color, +            *viewport,          );          let translation = Vector::new( diff --git a/widget/src/text_input.rs b/widget/src/text_input.rs index 27efe755..b56e3167 100644 --- a/widget/src/text_input.rs +++ b/widget/src/text_input.rs @@ -238,6 +238,7 @@ where          layout: Layout<'_>,          cursor: mouse::Cursor,          value: Option<&Value>, +        viewport: &Rectangle,      ) {          draw(              renderer, @@ -250,6 +251,7 @@ where              self.is_secure,              self.icon.as_ref(),              &self.style, +            viewport,          );      }  } @@ -362,7 +364,7 @@ where          _style: &renderer::Style,          layout: Layout<'_>,          cursor: mouse::Cursor, -        _viewport: &Rectangle, +        viewport: &Rectangle,      ) {          draw(              renderer, @@ -375,6 +377,7 @@ where              self.is_secure,              self.icon.as_ref(),              &self.style, +            viewport,          );      } @@ -1055,6 +1058,7 @@ pub fn draw<Renderer>(      is_secure: bool,      icon: Option<&Icon<Renderer::Font>>,      style: &<Renderer::Theme as StyleSheet>::Style, +    viewport: &Rectangle,  ) where      Renderer: text::Renderer,      Renderer::Theme: StyleSheet, @@ -1096,6 +1100,7 @@ pub fn draw<Renderer>(              &state.icon,              icon_layout.bounds().center(),              appearance.icon_color, +            *viewport,          );      } @@ -1189,39 +1194,31 @@ pub fn draw<Renderer>(          (None, 0.0)      }; -    let text_width = state.value.min_width(); - -    let render = |renderer: &mut Renderer| { -        if let Some((cursor, color)) = cursor { -            renderer.fill_quad(cursor, color); -        } else { -            renderer.with_translation(Vector::ZERO, |_| {}); -        } - -        renderer.fill_paragraph( -            if text.is_empty() { -                &state.placeholder -            } else { -                &state.value -            }, -            Point::new(text_bounds.x, text_bounds.center_y()), -            if text.is_empty() { -                theme.placeholder_color(style) -            } else if is_disabled { -                theme.disabled_color(style) -            } else { -                theme.value_color(style) -            }, -        ); -    }; - -    if text_width > text_bounds.width { -        renderer.with_layer(text_bounds, |renderer| { -            renderer.with_translation(Vector::new(-offset, 0.0), render); +    if let Some((cursor, color)) = cursor { +        renderer.with_translation(Vector::new(-offset, 0.0), |renderer| { +            renderer.fill_quad(cursor, color)          });      } else { -        render(renderer); +        renderer.with_translation(Vector::ZERO, |_| {});      } + +    renderer.fill_paragraph( +        if text.is_empty() { +            &state.placeholder +        } else { +            &state.value +        }, +        Point::new(text_bounds.x, text_bounds.center_y()) +            - Vector::new(offset, 0.0), +        if text.is_empty() { +            theme.placeholder_color(style) +        } else if is_disabled { +            theme.disabled_color(style) +        } else { +            theme.value_color(style) +        }, +        text_bounds, +    );  }  /// Computes the current [`mouse::Interaction`] of the [`TextInput`]. diff --git a/widget/src/toggler.rs b/widget/src/toggler.rs index 476c8330..d8723080 100644 --- a/widget/src/toggler.rs +++ b/widget/src/toggler.rs @@ -266,7 +266,7 @@ where          style: &renderer::Style,          layout: Layout<'_>,          cursor: mouse::Cursor, -        _viewport: &Rectangle, +        viewport: &Rectangle,      ) {          /// Makes sure that the border radius of the toggler looks good at every size.          const BORDER_RADIUS_RATIO: f32 = 32.0 / 13.0; @@ -287,6 +287,7 @@ where                  label_layout,                  tree.state.downcast_ref(),                  crate::text::Appearance::default(), +                viewport,              );          }  | 
