Implement `Widget::overlay` for `Scrollable`
This commit is contained in:
parent
f7a370b6b9
commit
ada8d7c77f
|
@ -1,6 +1,6 @@
|
||||||
use iced::{
|
use iced::{
|
||||||
button, combo_box, Button, Column, ComboBox, Container, Element, Length,
|
button, combo_box, scrollable, Align, Button, ComboBox, Container, Element,
|
||||||
Sandbox, Settings, Text,
|
Length, Sandbox, Scrollable, Settings, Space, Text,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
|
@ -9,6 +9,7 @@ pub fn main() {
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct Example {
|
struct Example {
|
||||||
|
scroll: scrollable::State,
|
||||||
button: button::State,
|
button: button::State,
|
||||||
combo_box: combo_box::State,
|
combo_box: combo_box::State,
|
||||||
selected_language: Language,
|
selected_language: Language,
|
||||||
|
@ -51,8 +52,11 @@ impl Sandbox for Example {
|
||||||
let button = Button::new(&mut self.button, Text::new("Press me!"))
|
let button = Button::new(&mut self.button, Text::new("Press me!"))
|
||||||
.on_press(Message::ButtonPressed);
|
.on_press(Message::ButtonPressed);
|
||||||
|
|
||||||
let mut content = Column::new()
|
let mut content = Scrollable::new(&mut self.scroll)
|
||||||
|
.width(Length::Fill)
|
||||||
|
.align_items(Align::Center)
|
||||||
.spacing(10)
|
.spacing(10)
|
||||||
|
.push(Space::with_height(Length::Units(800)))
|
||||||
.push(Text::new("Which is your favorite language?"))
|
.push(Text::new("Which is your favorite language?"))
|
||||||
.push(combo_box);
|
.push(combo_box);
|
||||||
|
|
||||||
|
@ -60,7 +64,9 @@ impl Sandbox for Example {
|
||||||
content = content.push(Text::new("You are wrong!"));
|
content = content.push(Text::new("You are wrong!"));
|
||||||
}
|
}
|
||||||
|
|
||||||
content = content.push(button);
|
content = content
|
||||||
|
.push(button)
|
||||||
|
.push(Space::with_height(Length::Units(800)));
|
||||||
|
|
||||||
Container::new(content)
|
Container::new(content)
|
||||||
.width(Length::Fill)
|
.width(Length::Fill)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//! Navigate an endless amount of content with a scrollbar.
|
//! Navigate an endless amount of content with a scrollbar.
|
||||||
use crate::{
|
use crate::{
|
||||||
column, layout, mouse, Align, Clipboard, Column, Element, Event, Hasher,
|
column, layout, mouse, Align, Clipboard, Column, Element, Event, Hasher,
|
||||||
Layout, Length, Point, Rectangle, Size, Widget,
|
Layout, Length, Overlay, Point, Rectangle, Size, Vector, Widget,
|
||||||
};
|
};
|
||||||
|
|
||||||
use std::{f32, hash::Hash, u32};
|
use std::{f32, hash::Hash, u32};
|
||||||
|
@ -315,6 +315,22 @@ where
|
||||||
|
|
||||||
self.content.hash_layout(state)
|
self.content.hash_layout(state)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn overlay(
|
||||||
|
&mut self,
|
||||||
|
layout: Layout<'_>,
|
||||||
|
) -> Option<Overlay<'a, Message, Renderer>> {
|
||||||
|
self.content
|
||||||
|
.overlay(layout.children().next().unwrap())
|
||||||
|
.map(|overlay| {
|
||||||
|
let bounds = layout.bounds();
|
||||||
|
let content_layout = layout.children().next().unwrap();
|
||||||
|
let content_bounds = content_layout.bounds();
|
||||||
|
let offset = self.state.offset(bounds, content_bounds);
|
||||||
|
|
||||||
|
overlay.translate(Vector::new(0.0, -(offset as f32)))
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The local state of a [`Scrollable`].
|
/// The local state of a [`Scrollable`].
|
||||||
|
|
Loading…
Reference in New Issue