Implement `Widget::overlay` for `Scrollable`

This commit is contained in:
Héctor Ramón Jiménez 2020-04-18 19:28:05 +02:00
parent f7a370b6b9
commit ada8d7c77f
2 changed files with 27 additions and 5 deletions

View File

@ -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)

View File

@ -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`].