summaryrefslogtreecommitdiffstats
path: root/examples/visible_bounds
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-07-27 01:02:47 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-07-27 01:04:22 +0200
commit09f2887da582ed7d39a56b2c0b37d0b24b6c1e57 (patch)
tree1a15edd4b43d49bc1152aee7f26ea0ec9a3e1701 /examples/visible_bounds
parente2ba7ece83f141c149659747977147392df008f4 (diff)
downloadiced-09f2887da582ed7d39a56b2c0b37d0b24b6c1e57.tar.gz
iced-09f2887da582ed7d39a56b2c0b37d0b24b6c1e57.tar.bz2
iced-09f2887da582ed7d39a56b2c0b37d0b24b6c1e57.zip
Create `visible_bounds` example
Diffstat (limited to 'examples/visible_bounds')
-rw-r--r--examples/visible_bounds/Cargo.toml10
-rw-r--r--examples/visible_bounds/src/main.rs151
2 files changed, 161 insertions, 0 deletions
diff --git a/examples/visible_bounds/Cargo.toml b/examples/visible_bounds/Cargo.toml
new file mode 100644
index 00000000..cfa56dd2
--- /dev/null
+++ b/examples/visible_bounds/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "visible_bounds"
+version = "0.1.0"
+authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"]
+edition = "2021"
+publish = false
+
+[dependencies]
+iced = { path = "../..", features = ["debug"] }
+once_cell = "1"
diff --git a/examples/visible_bounds/src/main.rs b/examples/visible_bounds/src/main.rs
new file mode 100644
index 00000000..bd7ccdc0
--- /dev/null
+++ b/examples/visible_bounds/src/main.rs
@@ -0,0 +1,151 @@
+use iced::executor;
+use iced::mouse;
+use iced::subscription::{self, Subscription};
+use iced::theme::{self, Theme};
+use iced::widget::{column, container, scrollable, text, vertical_space};
+use iced::{
+ Application, Command, Element, Event, Length, Point, Rectangle, Settings,
+};
+
+pub fn main() -> iced::Result {
+ Example::run(Settings::default())
+}
+
+struct Example {
+ mouse_position: Option<Point>,
+ outer_bounds: Option<Rectangle>,
+ inner_bounds: Option<Rectangle>,
+}
+
+#[derive(Debug, Clone, Copy)]
+enum Message {
+ MouseMoved(Point),
+ Scrolled(scrollable::Viewport),
+ OuterBoundsFetched(Option<Rectangle>),
+ InnerBoundsFetched(Option<Rectangle>),
+}
+
+impl Application for Example {
+ type Message = Message;
+ type Theme = Theme;
+ type Flags = ();
+ type Executor = executor::Default;
+
+ fn new(_flags: Self::Flags) -> (Self, Command<Message>) {
+ (
+ Self {
+ mouse_position: None,
+ outer_bounds: None,
+ inner_bounds: None,
+ },
+ Command::none(),
+ )
+ }
+
+ fn title(&self) -> String {
+ String::from("Visible bounds - Iced")
+ }
+
+ fn update(&mut self, message: Message) -> Command<Message> {
+ match message {
+ Message::MouseMoved(position) => {
+ self.mouse_position = Some(position);
+
+ Command::none()
+ }
+ Message::Scrolled(_) => Command::batch(vec![
+ container::visible_bounds(OUTER_CONTAINER.clone())
+ .map(Message::OuterBoundsFetched),
+ container::visible_bounds(INNER_CONTAINER.clone())
+ .map(Message::InnerBoundsFetched),
+ ]),
+ Message::OuterBoundsFetched(outer_bounds) => {
+ self.outer_bounds = outer_bounds;
+
+ Command::none()
+ }
+ Message::InnerBoundsFetched(inner_bounds) => {
+ self.inner_bounds = inner_bounds;
+
+ Command::none()
+ }
+ }
+ }
+
+ fn view(&self) -> Element<Message> {
+ let view_bounds = |label, bounds| {
+ text(format!(
+ "The {label} container is {}",
+ match bounds {
+ Some(bounds) => format!("visible at {:?}", bounds),
+ None => "not visible".to_string(),
+ }
+ ))
+ };
+
+ column![
+ text(format!(
+ "Mouse position is {}",
+ match self.mouse_position {
+ Some(Point { x, y }) => format!("({x}, {y})"),
+ None => "unknown".to_string(),
+ }
+ )),
+ view_bounds("outer", self.outer_bounds),
+ view_bounds("inner", self.inner_bounds),
+ scrollable(
+ column![
+ text("Scroll me!"),
+ vertical_space(400),
+ container(text("I am the outer container!"))
+ .id(OUTER_CONTAINER.clone())
+ .padding(40)
+ .style(theme::Container::Box),
+ vertical_space(400),
+ scrollable(
+ column![
+ text("Scroll me!"),
+ vertical_space(400),
+ container(text("I am the inner container!"))
+ .id(INNER_CONTAINER.clone())
+ .padding(40)
+ .style(theme::Container::Box),
+ vertical_space(400)
+ ]
+ .padding(20)
+ )
+ .on_scroll(Message::Scrolled)
+ .width(Length::Fill)
+ .height(300),
+ ]
+ .padding(20)
+ )
+ .on_scroll(Message::Scrolled)
+ .width(Length::Fill)
+ .height(300),
+ ]
+ .spacing(10)
+ .padding(20)
+ .into()
+ }
+
+ fn subscription(&self) -> Subscription<Message> {
+ subscription::events_with(|event, _| match event {
+ Event::Mouse(mouse::Event::CursorMoved { position }) => {
+ Some(Message::MouseMoved(position))
+ }
+ _ => None,
+ })
+ }
+
+ fn theme(&self) -> Theme {
+ Theme::Dark
+ }
+}
+
+use once_cell::sync::Lazy;
+
+static OUTER_CONTAINER: Lazy<container::Id> =
+ Lazy::new(|| container::Id::new("outer"));
+static INNER_CONTAINER: Lazy<container::Id> =
+ Lazy::new(|| container::Id::new("inner"));