From 9e9baa725ba90b88dfd252844966e83944a46487 Mon Sep 17 00:00:00 2001 From: Olivier 'reivilibre Date: Sun, 27 Jun 2021 00:47:34 +0100 Subject: [PATCH] Big overhaul with scroll offset threaded through --- glutin/src/application.rs | 3 ++- native/src/element.rs | 8 +++++++- native/src/overlay.rs | 3 ++- native/src/overlay/element.rs | 4 ++++ native/src/overlay/menu.rs | 3 +++ native/src/program/state.rs | 5 ++++- native/src/user_interface.rs | 5 ++++- native/src/widget.rs | 3 ++- native/src/widget/button.rs | 14 ++++++++++---- native/src/widget/checkbox.rs | 3 ++- native/src/widget/column.rs | 4 +++- native/src/widget/container.rs | 4 +++- native/src/widget/image/viewer.rs | 1 + native/src/widget/pane_grid.rs | 2 ++ native/src/widget/pane_grid/content.rs | 5 ++++- native/src/widget/pane_grid/title_bar.rs | 5 ++++- native/src/widget/pick_list.rs | 3 ++- native/src/widget/radio.rs | 3 ++- native/src/widget/row.rs | 4 +++- native/src/widget/scrollable.rs | 2 ++ native/src/widget/slider.rs | 3 ++- native/src/widget/text_input.rs | 3 ++- native/src/widget/toggler.rs | 11 ++++++----- native/src/widget/tooltip.rs | 4 +++- winit/src/application.rs | 3 ++- 25 files changed, 81 insertions(+), 27 deletions(-) diff --git a/glutin/src/application.rs b/glutin/src/application.rs index a8e5dbf9..91175591 100644 --- a/glutin/src/application.rs +++ b/glutin/src/application.rs @@ -1,5 +1,5 @@ //! Create interactive, native cross-platform applications. -use crate::{mouse, Error, Executor, Runtime}; +use crate::{mouse, Error, Executor, Runtime, Vector}; pub use iced_winit::Application; @@ -187,6 +187,7 @@ async fn run_instance( let statuses = user_interface.update( &events, state.cursor_position(), + Vector::new(0.0, 0.0), &mut renderer, &mut clipboard, &mut messages, diff --git a/native/src/element.rs b/native/src/element.rs index 5c84a388..f4d768d1 100644 --- a/native/src/element.rs +++ b/native/src/element.rs @@ -1,6 +1,6 @@ use crate::event::{self, Event}; -use crate::layout; use crate::overlay; +use crate::{layout, Vector}; use crate::{ Clipboard, Color, Hasher, Layout, Length, Point, Rectangle, Widget, }; @@ -223,6 +223,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -231,6 +232,7 @@ where event, layout, cursor_position, + scroll_offset, renderer, clipboard, messages, @@ -311,6 +313,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -321,6 +324,7 @@ where event, layout, cursor_position, + scroll_offset, renderer, clipboard, &mut original_messages, @@ -401,6 +405,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -409,6 +414,7 @@ where event, layout, cursor_position, + scroll_offset, renderer, clipboard, messages, diff --git a/native/src/overlay.rs b/native/src/overlay.rs index 84145e7f..fe96c419 100644 --- a/native/src/overlay.rs +++ b/native/src/overlay.rs @@ -7,7 +7,7 @@ pub use element::Element; pub use menu::Menu; use crate::event::{self, Event}; -use crate::layout; +use crate::{layout, Vector}; use crate::{Clipboard, Hasher, Layout, Point, Size}; /// An interactive component that can be displayed on top of other widgets. @@ -67,6 +67,7 @@ where _event: Event, _layout: Layout<'_>, _cursor_position: Point, + _scroll_offset: Vector, _renderer: &Renderer, _clipboard: &mut dyn Clipboard, _messages: &mut Vec, diff --git a/native/src/overlay/element.rs b/native/src/overlay/element.rs index e4819037..652c6e89 100644 --- a/native/src/overlay/element.rs +++ b/native/src/overlay/element.rs @@ -53,6 +53,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -61,6 +62,7 @@ where event, layout, cursor_position, + scroll_offset, renderer, clipboard, messages, @@ -117,6 +119,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -127,6 +130,7 @@ where event, layout, cursor_position, + scroll_offset, renderer, clipboard, &mut original_messages, diff --git a/native/src/overlay/menu.rs b/native/src/overlay/menu.rs index f62dcb46..5c6b5d5b 100644 --- a/native/src/overlay/menu.rs +++ b/native/src/overlay/menu.rs @@ -219,6 +219,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -227,6 +228,7 @@ where event.clone(), layout, cursor_position, + scroll_offset, renderer, clipboard, messages, @@ -320,6 +322,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + _scroll_offset: Vector, renderer: &Renderer, _clipboard: &mut dyn Clipboard, _messages: &mut Vec, diff --git a/native/src/program/state.rs b/native/src/program/state.rs index fd1f2b52..c635aee2 100644 --- a/native/src/program/state.rs +++ b/native/src/program/state.rs @@ -1,5 +1,6 @@ use crate::{ - Cache, Command, Debug, Event, Point, Program, Renderer, Size, UserInterface, + Cache, Command, Debug, Event, Point, Program, Renderer, Size, + UserInterface, Vector, }; /// The execution state of a [`Program`]. It leverages caching, event @@ -90,6 +91,7 @@ where &mut self, bounds: Size, cursor_position: Point, + scroll_offset: Vector, renderer: &mut P::Renderer, clipboard: &mut P::Clipboard, debug: &mut Debug, @@ -108,6 +110,7 @@ where let _ = user_interface.update( &self.queued_events, cursor_position, + scroll_offset, renderer, clipboard, &mut messages, diff --git a/native/src/user_interface.rs b/native/src/user_interface.rs index 8e0d7d1c..e5fa3ddb 100644 --- a/native/src/user_interface.rs +++ b/native/src/user_interface.rs @@ -1,6 +1,6 @@ use crate::event::{self, Event}; -use crate::layout; use crate::overlay; +use crate::{layout, Vector}; use crate::{Clipboard, Element, Layout, Point, Rectangle, Size}; use std::hash::Hasher; @@ -194,6 +194,7 @@ where &mut self, events: &[Event], cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -216,6 +217,7 @@ where event, Layout::new(&layer.layout), cursor_position, + scroll_offset, renderer, clipboard, messages, @@ -247,6 +249,7 @@ where event, Layout::new(&self.base.layout), base_cursor, + Vector::new(0.0, 0.0), renderer, clipboard, messages, diff --git a/native/src/widget.rs b/native/src/widget.rs index 43c1b023..40caa58e 100644 --- a/native/src/widget.rs +++ b/native/src/widget.rs @@ -79,8 +79,8 @@ pub use toggler::Toggler; pub use tooltip::Tooltip; use crate::event::{self, Event}; -use crate::layout; use crate::overlay; +use crate::{layout, Vector}; use crate::{Clipboard, Hasher, Layout, Length, Point, Rectangle}; /// A component that displays information and allows interaction. @@ -167,6 +167,7 @@ where _event: Event, _layout: Layout<'_>, _cursor_position: Point, + _scroll_offset: Vector, _renderer: &Renderer, _clipboard: &mut dyn Clipboard, _messages: &mut Vec, diff --git a/native/src/widget/button.rs b/native/src/widget/button.rs index 88c6feb2..851ef46d 100644 --- a/native/src/widget/button.rs +++ b/native/src/widget/button.rs @@ -2,16 +2,15 @@ //! //! A [`Button`] has some local [`State`]. use crate::event::{self, Event}; -use crate::layout; use crate::mouse; use crate::overlay; use crate::touch; use crate::touch::Finger; +use crate::{layout, Vector}; use crate::{ Clipboard, Element, Hasher, Layout, Length, Padding, Point, Rectangle, Widget, }; -use std::any::Any; use std::collections::HashSet; use std::hash::Hash; @@ -194,6 +193,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -202,6 +202,7 @@ where event.clone(), layout.children().next().unwrap(), cursor_position, + scroll_offset, renderer, clipboard, messages, @@ -237,7 +238,12 @@ where } } Event::Touch(x) => { - eprintln!("B {:?} Bds {:?} P {:?}", x, layout.bounds(), self.fingers_mid_press); + eprintln!( + "B {:?} Bds {:?} P {:?}", + x, + layout.bounds(), + self.fingers_mid_press + ); match x { touch::Event::FingerPressed { id, position } => { if layout.bounds().contains(position) { @@ -255,7 +261,7 @@ where return event::Status::Captured; } } - touch::Event::FingerLifted { id, position } => { + touch::Event::FingerLifted { id, .. } => { // !!! The finger position seems to be buggy on the Lift event. if self.fingers_mid_press.remove(&id) { eprintln!("lifted"); diff --git a/native/src/widget/checkbox.rs b/native/src/widget/checkbox.rs index 0f21c873..3fd8d053 100644 --- a/native/src/widget/checkbox.rs +++ b/native/src/widget/checkbox.rs @@ -2,11 +2,11 @@ use std::hash::Hash; use crate::event::{self, Event}; -use crate::layout; use crate::mouse; use crate::row; use crate::text; use crate::touch; +use crate::{layout, Vector}; use crate::{ Align, Clipboard, Color, Element, Hasher, HorizontalAlignment, Layout, Length, Point, Rectangle, Row, Text, VerticalAlignment, Widget, @@ -158,6 +158,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + _scroll_offset: Vector, _renderer: &Renderer, _clipboard: &mut dyn Clipboard, messages: &mut Vec, diff --git a/native/src/widget/column.rs b/native/src/widget/column.rs index 52a2e80c..b8601e17 100644 --- a/native/src/widget/column.rs +++ b/native/src/widget/column.rs @@ -2,8 +2,8 @@ use std::hash::Hash; use crate::event::{self, Event}; -use crate::layout; use crate::overlay; +use crate::{layout, Vector}; use crate::{ Align, Clipboard, Element, Hasher, Layout, Length, Padding, Point, Rectangle, Widget, @@ -142,6 +142,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -154,6 +155,7 @@ where event.clone(), layout, cursor_position, + scroll_offset, renderer, clipboard, messages, diff --git a/native/src/widget/container.rs b/native/src/widget/container.rs index 69aee64d..8c4bbff7 100644 --- a/native/src/widget/container.rs +++ b/native/src/widget/container.rs @@ -2,8 +2,8 @@ use std::hash::Hash; use crate::event::{self, Event}; -use crate::layout; use crate::overlay; +use crate::{layout, Vector}; use crate::{ Align, Clipboard, Element, Hasher, Layout, Length, Padding, Point, Rectangle, Widget, @@ -153,6 +153,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -161,6 +162,7 @@ where event, layout.children().next().unwrap(), cursor_position, + scroll_offset, renderer, clipboard, messages, diff --git a/native/src/widget/image/viewer.rs b/native/src/widget/image/viewer.rs index a006c0af..c8e76dab 100644 --- a/native/src/widget/image/viewer.rs +++ b/native/src/widget/image/viewer.rs @@ -155,6 +155,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + _scroll_offset: Vector, renderer: &Renderer, _clipboard: &mut dyn Clipboard, _messages: &mut Vec, diff --git a/native/src/widget/pane_grid.rs b/native/src/widget/pane_grid.rs index b72172cc..b33372e1 100644 --- a/native/src/widget/pane_grid.rs +++ b/native/src/widget/pane_grid.rs @@ -362,6 +362,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -461,6 +462,7 @@ where event.clone(), layout, cursor_position, + scroll_offset, renderer, clipboard, messages, diff --git a/native/src/widget/pane_grid/content.rs b/native/src/widget/pane_grid/content.rs index b0110393..44fb5183 100644 --- a/native/src/widget/pane_grid/content.rs +++ b/native/src/widget/pane_grid/content.rs @@ -1,8 +1,8 @@ -use crate::container; use crate::event::{self, Event}; use crate::layout; use crate::overlay; use crate::pane_grid::{self, TitleBar}; +use crate::{container, Vector}; use crate::{Clipboard, Element, Hasher, Layout, Point, Rectangle, Size}; /// The content of a [`Pane`]. @@ -146,6 +146,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -159,6 +160,7 @@ where event.clone(), children.next().unwrap(), cursor_position, + scroll_offset, renderer, clipboard, messages, @@ -173,6 +175,7 @@ where event, body_layout, cursor_position, + scroll_offset, renderer, clipboard, messages, diff --git a/native/src/widget/pane_grid/title_bar.rs b/native/src/widget/pane_grid/title_bar.rs index efdc1e54..3dd73315 100644 --- a/native/src/widget/pane_grid/title_bar.rs +++ b/native/src/widget/pane_grid/title_bar.rs @@ -1,8 +1,8 @@ -use crate::container; use crate::event::{self, Event}; use crate::layout; use crate::overlay; use crate::pane_grid; +use crate::{container, Vector}; use crate::{ Clipboard, Element, Hasher, Layout, Padding, Point, Rectangle, Size, }; @@ -207,6 +207,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -224,6 +225,7 @@ where event.clone(), controls_layout, cursor_position, + scroll_offset, renderer, clipboard, messages, @@ -236,6 +238,7 @@ where event, title_layout, cursor_position, + scroll_offset, renderer, clipboard, messages, diff --git a/native/src/widget/pick_list.rs b/native/src/widget/pick_list.rs index 92c183f3..29504505 100644 --- a/native/src/widget/pick_list.rs +++ b/native/src/widget/pick_list.rs @@ -1,12 +1,12 @@ //! Display a dropdown list of selectable values. use crate::event::{self, Event}; -use crate::layout; use crate::mouse; use crate::overlay; use crate::overlay::menu::{self, Menu}; use crate::scrollable; use crate::text; use crate::touch; +use crate::{layout, Vector}; use crate::{ Clipboard, Element, Hasher, Layout, Length, Padding, Point, Rectangle, Size, Widget, @@ -211,6 +211,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + _scroll_offset: Vector, _renderer: &Renderer, _clipboard: &mut dyn Clipboard, messages: &mut Vec, diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index dee82d1f..e4668ab4 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -2,11 +2,11 @@ use std::hash::Hash; use crate::event::{self, Event}; -use crate::mouse; use crate::row; use crate::text; use crate::touch; use crate::{layout, Color}; +use crate::{mouse, Vector}; use crate::{ Align, Clipboard, Element, Hasher, HorizontalAlignment, Layout, Length, Point, Rectangle, Row, Text, VerticalAlignment, Widget, @@ -172,6 +172,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + _scroll_offset: Vector, _renderer: &Renderer, _clipboard: &mut dyn Clipboard, messages: &mut Vec, diff --git a/native/src/widget/row.rs b/native/src/widget/row.rs index 9ebc9145..a0aa465d 100644 --- a/native/src/widget/row.rs +++ b/native/src/widget/row.rs @@ -1,7 +1,7 @@ //! Distribute content horizontally. use crate::event::{self, Event}; -use crate::layout; use crate::overlay; +use crate::{layout, Vector}; use crate::{ Align, Clipboard, Element, Hasher, Layout, Length, Padding, Point, Rectangle, Widget, @@ -141,6 +141,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -153,6 +154,7 @@ where event.clone(), layout, cursor_position, + scroll_offset, renderer, clipboard, messages, diff --git a/native/src/widget/scrollable.rs b/native/src/widget/scrollable.rs index 68da2e67..767a159a 100644 --- a/native/src/widget/scrollable.rs +++ b/native/src/widget/scrollable.rs @@ -192,6 +192,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -235,6 +236,7 @@ where event.clone(), content, cursor_position, + scroll_offset, renderer, clipboard, messages, diff --git a/native/src/widget/slider.rs b/native/src/widget/slider.rs index 2a74d5a3..7ff2e7ef 100644 --- a/native/src/widget/slider.rs +++ b/native/src/widget/slider.rs @@ -2,9 +2,9 @@ //! //! A [`Slider`] has some local [`State`]. use crate::event::{self, Event}; -use crate::layout; use crate::mouse; use crate::touch; +use crate::{layout, Vector}; use crate::{ Clipboard, Element, Hasher, Layout, Length, Point, Rectangle, Size, Widget, }; @@ -180,6 +180,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + _scroll_offset: Vector, _renderer: &Renderer, _clipboard: &mut dyn Clipboard, messages: &mut Vec, diff --git a/native/src/widget/text_input.rs b/native/src/widget/text_input.rs index 20117fa0..3737323d 100644 --- a/native/src/widget/text_input.rs +++ b/native/src/widget/text_input.rs @@ -12,11 +12,11 @@ pub use value::Value; use editor::Editor; use crate::event::{self, Event}; -use crate::keyboard; use crate::layout; use crate::mouse::{self, click}; use crate::text; use crate::touch; +use crate::{keyboard, Vector}; use crate::{ Clipboard, Element, Hasher, Layout, Length, Padding, Point, Rectangle, Size, Widget, @@ -246,6 +246,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + _scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, diff --git a/native/src/widget/toggler.rs b/native/src/widget/toggler.rs index bf8b2a39..d76f6ee2 100644 --- a/native/src/widget/toggler.rs +++ b/native/src/widget/toggler.rs @@ -5,7 +5,7 @@ use crate::touch::Finger; use crate::{ event, layout, mouse, row, text, touch, Align, Clipboard, Element, Event, Hasher, HorizontalAlignment, Layout, Length, Point, Rectangle, Row, Text, - VerticalAlignment, Widget, + Vector, VerticalAlignment, Widget, }; use std::collections::HashSet; @@ -164,6 +164,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, _renderer: &Renderer, _clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -183,7 +184,7 @@ where Event::Touch(x) => { match x { touch::Event::FingerPressed { id, position } => { - if layout.bounds().contains(position) { + if layout.bounds().contains(position + scroll_offset) { let _ = self.fingers_mid_press.insert(id); event::Status::Captured @@ -192,7 +193,7 @@ where } } touch::Event::FingerMoved { id, position } => { - if !layout.bounds().contains(position) { + if !layout.bounds().contains(position + scroll_offset) { let _ = self.fingers_mid_press.remove(&id); event::Status::Captured @@ -200,10 +201,10 @@ where event::Status::Ignored } } - touch::Event::FingerLifted { id, position } => { + touch::Event::FingerLifted { id, .. } => { // !!! The finger position seems to be buggy on the Lift event. if self.fingers_mid_press.remove(&id) - // && layout.bounds().contains(position) + // && layout.bounds().contains(position) { // this should be treated as a click messages.push((self.on_toggle)(!self.is_active)); diff --git a/native/src/widget/tooltip.rs b/native/src/widget/tooltip.rs index 276afd41..88b07d9d 100644 --- a/native/src/widget/tooltip.rs +++ b/native/src/widget/tooltip.rs @@ -7,7 +7,7 @@ use crate::widget::container; use crate::widget::text::{self, Text}; use crate::{ event, layout, Clipboard, Element, Event, Hasher, Layout, Length, Point, - Widget, + Vector, Widget, }; /// An element to display a widget over another. @@ -120,6 +120,7 @@ where event: Event, layout: Layout<'_>, cursor_position: Point, + scroll_offset: Vector, renderer: &Renderer, clipboard: &mut dyn Clipboard, messages: &mut Vec, @@ -128,6 +129,7 @@ where event, layout, cursor_position, + scroll_offset, renderer, clipboard, messages, diff --git a/winit/src/application.rs b/winit/src/application.rs index 49f2f513..bc76b9e4 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -3,8 +3,8 @@ mod state; pub use state::State; -use crate::conversion; use crate::mouse; +use crate::{conversion, Vector}; use crate::{ Clipboard, Color, Command, Debug, Error, Executor, Mode, Proxy, Runtime, Settings, Size, Subscription, @@ -261,6 +261,7 @@ async fn run_instance( let statuses = user_interface.update( &events, state.cursor_position(), + Vector::new(0.0, 0.0), &mut renderer, &mut clipboard, &mut messages,