Merge branch 'master' into virtual-widgets
This commit is contained in:
commit
fbbb864aaa
3 changed files with 52 additions and 20 deletions
|
|
@ -211,6 +211,11 @@ where
|
|||
use iced_native::Renderer as _;
|
||||
|
||||
let bounds = layout.bounds();
|
||||
|
||||
if bounds.width < 1.0 || bounds.height < 1.0 {
|
||||
return;
|
||||
}
|
||||
|
||||
let translation = Vector::new(bounds.x, bounds.y);
|
||||
let cursor = Cursor::from_window_position(cursor_position);
|
||||
|
||||
|
|
|
|||
|
|
@ -253,6 +253,27 @@ impl Frame {
|
|||
self.transforms.current = self.transforms.previous.pop().unwrap();
|
||||
}
|
||||
|
||||
/// Executes the given drawing operations within a [`Rectangle`] region,
|
||||
/// clipping any geometry that overflows its bounds. Any transformations
|
||||
/// performed are local to the provided closure.
|
||||
///
|
||||
/// This method is useful to perform drawing operations that need to be
|
||||
/// clipped.
|
||||
#[inline]
|
||||
pub fn with_clip(&mut self, region: Rectangle, f: impl FnOnce(&mut Frame)) {
|
||||
let mut frame = Frame::new(region.size());
|
||||
|
||||
f(&mut frame);
|
||||
|
||||
self.primitives.push(Primitive::Clip {
|
||||
bounds: region,
|
||||
content: Box::new(Primitive::Translate {
|
||||
translation: Vector::new(region.x, region.y),
|
||||
content: Box::new(frame.into_geometry().into_primitive()),
|
||||
}),
|
||||
});
|
||||
}
|
||||
|
||||
/// Applies a translation to the current transform of the [`Frame`].
|
||||
#[inline]
|
||||
pub fn translate(&mut self, translation: Vector) {
|
||||
|
|
|
|||
|
|
@ -345,30 +345,36 @@ where
|
|||
|
||||
let viewport = Rectangle::with_size(self.bounds);
|
||||
|
||||
if let Some(layout) = &self.overlay {
|
||||
let base_cursor = if layout.bounds().contains(cursor_position) {
|
||||
Point::new(-1.0, -1.0)
|
||||
} else {
|
||||
cursor_position
|
||||
};
|
||||
let base_cursor = if let Some(overlay) =
|
||||
self.root.overlay(Layout::new(&self.base), renderer)
|
||||
{
|
||||
let overlay_layout = self
|
||||
.overlay
|
||||
.take()
|
||||
.unwrap_or_else(|| overlay.layout(renderer, self.bounds));
|
||||
|
||||
self.root.widget.draw(
|
||||
renderer,
|
||||
&renderer::Style::default(),
|
||||
Layout::new(&self.base),
|
||||
base_cursor,
|
||||
&viewport,
|
||||
);
|
||||
let new_cursor_position =
|
||||
if overlay_layout.bounds().contains(cursor_position) {
|
||||
Point::new(-1.0, -1.0)
|
||||
} else {
|
||||
cursor_position
|
||||
};
|
||||
|
||||
self.overlay = Some(overlay_layout);
|
||||
|
||||
new_cursor_position
|
||||
} else {
|
||||
self.root.widget.draw(
|
||||
renderer,
|
||||
&renderer::Style::default(),
|
||||
Layout::new(&self.base),
|
||||
cursor_position,
|
||||
&viewport,
|
||||
);
|
||||
cursor_position
|
||||
};
|
||||
|
||||
self.root.widget.draw(
|
||||
renderer,
|
||||
&renderer::Style::default(),
|
||||
Layout::new(&self.base),
|
||||
base_cursor,
|
||||
&viewport,
|
||||
);
|
||||
|
||||
let base_interaction = self.root.widget.mouse_interaction(
|
||||
Layout::new(&self.base),
|
||||
cursor_position,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue