Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions crates/kas-core/src/core/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<ActionResize> {
let _ = (cx, data);
Some(ActionResize)
fn handle_resize(&mut self, cx: &mut ConfigCx) -> bool {
let _ = cx;
false
}

/// Handler for scrolling
Expand Down
15 changes: 9 additions & 6 deletions crates/kas-core/src/core/impls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,9 @@ pub fn _update<W: Events>(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);
}
}
}
}
Expand Down Expand Up @@ -99,8 +100,9 @@ pub fn _send<W: Events>(

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) {
Expand Down Expand Up @@ -147,8 +149,9 @@ pub fn _replay<W: Events>(widget: &mut W, cx: &mut EventCx, data: &<W as Widget>
}

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) {
Expand Down
5 changes: 4 additions & 1 deletion crates/kas-view/src/grid_view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions crates/kas-view/src/list_view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
10 changes: 3 additions & 7 deletions crates/kas-widgets/src/edit/edit_box.rs
Original file line number Diff line number Diff line change
Expand Up @@ -213,14 +213,10 @@ mod EditBox {
}
}

fn handle_resize(&mut self, cx: &mut ConfigCx, _: &Self::Data) -> Option<ActionResize> {
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) {
Expand Down
4 changes: 2 additions & 2 deletions crates/kas-widgets/src/scroll.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<ActionResize> {
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) {
Expand Down
4 changes: 2 additions & 2 deletions crates/kas-widgets/src/scroll_label.rs
Original file line number Diff line number Diff line change
Expand Up @@ -547,7 +547,7 @@ mod ScrollText {
}
}

fn handle_resize(&mut self, cx: &mut ConfigCx, _: &Self::Data) -> Option<ActionResize> {
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;
Expand All @@ -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) {
Expand Down