diff --git a/crates/kas-core/src/core/events.rs b/crates/kas-core/src/core/events.rs index d75aa52de..8b9747609 100644 --- a/crates/kas-core/src/core/events.rs +++ b/crates/kas-core/src/core/events.rs @@ -6,8 +6,8 @@ //! Widget and Events traits use super::{Tile, Widget}; +use crate::ChildIndices; use crate::event::{ConfigCx, CursorIcon, Event, EventCx, IsUsed, Scroll, Unused}; -use crate::{ActionResize, ChildIndices}; use crate::{Id, geom::Coord}; #[allow(unused)] use crate::{Layout, event::EventState}; #[allow(unused)] use kas_macros as macros; @@ -308,26 +308,26 @@ pub trait Events: Widget + Sized { /// /// # Calling /// - /// This method may only be called after the widget is sized. - /// - /// This method is called during [event handling](crate::event) whenever a - /// resize action is required (see [`ConfigCx::resize`]). + /// This method may be called when processing an [update](Self#update) or + /// handling an event ([`Self::handle_event`]) or message + /// ([`Self::handle_messages`]) when a child widget requires resizing, but + /// only after the initial sizing of the widget. /// /// # Implementation /// /// Some widgets (for example, a scroll region) are able to handle resizes - /// locally and should implement this method to do so - /// (thus avoiding the need for a full-window resize). + /// locally and should implement this method to do so, avoiding the need for + /// a full-window resize. /// - /// Return `Some(ActionResize)` if further resizing is needed, or `None` if - /// resizing is complete. + /// Return `true` if resizing is complete, otherwise return `false` to + /// indicate that further resizing is required. /// - /// The default implementation simply returns `Some(ActionResize)`. + /// The default implementation simply returns `false`. #[inline] #[must_use] - fn handle_resize(&mut self, cx: &mut ConfigCx, data: &Self::Data) -> Option { - let _ = (cx, data); - Some(ActionResize) + fn handle_resize(&mut self, cx: &mut ConfigCx) -> bool { + let _ = cx; + false } /// Handler for scrolling diff --git a/crates/kas-core/src/core/impls.rs b/crates/kas-core/src/core/impls.rs index 4bfab202a..e31fde302 100644 --- a/crates/kas-core/src/core/impls.rs +++ b/crates/kas-core/src/core/impls.rs @@ -42,8 +42,9 @@ pub fn _update(widget: &mut W, cx: &mut ConfigCx, data: &W::Data) { } if cx.needs_resize() && widget.status().is_sized() { - let opt_resize = widget.handle_resize(cx, data); - cx.set_resize(opt_resize); + if widget.handle_resize(cx) { + cx.set_resize(None); + } } } } @@ -99,8 +100,9 @@ pub fn _send( if cx.needs_resize() { debug_assert!(widget.status().is_sized()); - let opt_resize = widget.handle_resize(cx, data); - cx.set_resize(opt_resize); + if widget.handle_resize(cx) { + cx.set_resize(None); + } } if let Some(scroll) = cx.post_send(index) { @@ -147,8 +149,9 @@ pub fn _replay(widget: &mut W, cx: &mut EventCx, data: & } if cx.needs_resize() && widget.status().is_sized() { - let opt_resize = widget.handle_resize(cx, data); - cx.set_resize(opt_resize); + if widget.handle_resize(cx) { + cx.set_resize(None); + } } if let Some(scroll) = cx.post_send(index) { diff --git a/crates/kas-view/src/grid_view.rs b/crates/kas-view/src/grid_view.rs index b05655c10..b6876fd38 100644 --- a/crates/kas-view/src/grid_view.rs +++ b/crates/kas-view/src/grid_view.rs @@ -462,8 +462,11 @@ mod GridView { data_len = result.len(); if data_len != self.data_len { self.data_len = data_len; - cx.resize(); self.token_update = Update::Token; + + // TODO(opt): notify that content_size() has changed without + // requiring re-evaluation of size_rules() or set_rect(): + cx.resize(); } } else { data_len = self.data_len; diff --git a/crates/kas-view/src/list_view.rs b/crates/kas-view/src/list_view.rs index 09ece9876..369c705ff 100644 --- a/crates/kas-view/src/list_view.rs +++ b/crates/kas-view/src/list_view.rs @@ -567,6 +567,9 @@ mod ListView { data_len = result.len(); if data_len != usize::conv(self.data_len) { self.data_len = data_len.cast(); + + // TODO(opt): notify that content_size() has changed without + // requiring re-evaluation of size_rules() or set_rect(): cx.resize(); } } else { diff --git a/crates/kas-widgets/src/edit/edit_box.rs b/crates/kas-widgets/src/edit/edit_box.rs index b8dea6f94..b13c7d01e 100644 --- a/crates/kas-widgets/src/edit/edit_box.rs +++ b/crates/kas-widgets/src/edit/edit_box.rs @@ -213,14 +213,10 @@ mod EditBox { } } - fn handle_resize(&mut self, cx: &mut ConfigCx, _: &Self::Data) -> Option { - let size = self.inner.rect().size; - let axis = AxisInfo::new(false, Some(size.1)); - let mut resize = self.inner.size_rules(&mut cx.size_cx(), axis).min_size() > size.0; - let axis = AxisInfo::new(true, Some(size.0)); - resize |= self.inner.size_rules(&mut cx.size_cx(), axis).min_size() > size.1; + fn handle_resize(&mut self, cx: &mut ConfigCx) -> bool { + // Assumption: content does not require re-evaluation of size_rules() or set_rect() self.update_content_size(cx); - resize.then_some(ActionResize) + true } fn handle_scroll(&mut self, cx: &mut EventCx<'_>, _: &G::Data, scroll: Scroll) { diff --git a/crates/kas-widgets/src/scroll.rs b/crates/kas-widgets/src/scroll.rs index bfda0dcff..957205f1c 100644 --- a/crates/kas-widgets/src/scroll.rs +++ b/crates/kas-widgets/src/scroll.rs @@ -456,12 +456,12 @@ mod ScrollRegion { .update_offset(cx, data, self.inner.rect(), offset); } - fn handle_resize(&mut self, cx: &mut ConfigCx, _: &Self::Data) -> Option { + fn handle_resize(&mut self, cx: &mut ConfigCx) -> bool { let _ = self.size_rules(&mut cx.size_cx(), AxisInfo::new(false, None)); let width = self.rect().size.0; let _ = self.size_rules(&mut cx.size_cx(), AxisInfo::new(true, Some(width))); self.set_rect(&mut cx.size_cx(), self.rect(), self.hints); - None + true } fn handle_scroll(&mut self, cx: &mut EventCx, data: &Self::Data, scroll: Scroll) { diff --git a/crates/kas-widgets/src/scroll_label.rs b/crates/kas-widgets/src/scroll_label.rs index d3f2cf0f5..a38db0a36 100644 --- a/crates/kas-widgets/src/scroll_label.rs +++ b/crates/kas-widgets/src/scroll_label.rs @@ -547,7 +547,7 @@ mod ScrollText { } } - fn handle_resize(&mut self, cx: &mut ConfigCx, _: &Self::Data) -> Option { + fn handle_resize(&mut self, cx: &mut ConfigCx) -> bool { let size = self.text.rect().size; let axis = AxisInfo::new(false, Some(size.1)); let mut resize = self.text.size_rules(&mut cx.size_cx(), axis).min_size() > size.0; @@ -556,7 +556,7 @@ mod ScrollText { self.text .set_rect(&mut cx.size_cx(), self.text.rect(), Default::default()); self.update_content_size(cx); - resize.then_some(ActionResize) + !resize } fn handle_scroll(&mut self, cx: &mut EventCx, _: &Self::Data, scroll: Scroll) {