Skip to content

Commit 63f1e79

Browse files
authored
Merge pull request #685 from kas-gui/push-plvrmmyyvpuo
Simplify fn `Events::handle_resize`
2 parents 8664857 + b4debb8 commit 63f1e79

File tree

7 files changed

+36
-31
lines changed

7 files changed

+36
-31
lines changed

crates/kas-core/src/core/events.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
//! Widget and Events traits
77
88
use super::{Tile, Widget};
9+
use crate::ChildIndices;
910
use crate::event::{ConfigCx, CursorIcon, Event, EventCx, IsUsed, Scroll, Unused};
10-
use crate::{ActionResize, ChildIndices};
1111
use crate::{Id, geom::Coord};
1212
#[allow(unused)] use crate::{Layout, event::EventState};
1313
#[allow(unused)] use kas_macros as macros;
@@ -308,26 +308,26 @@ pub trait Events: Widget + Sized {
308308
///
309309
/// # Calling
310310
///
311-
/// This method may only be called after the widget is sized.
312-
///
313-
/// This method is called during [event handling](crate::event) whenever a
314-
/// resize action is required (see [`ConfigCx::resize`]).
311+
/// This method may be called when processing an [update](Self#update) or
312+
/// handling an event ([`Self::handle_event`]) or message
313+
/// ([`Self::handle_messages`]) when a child widget requires resizing, but
314+
/// only after the initial sizing of the widget.
315315
///
316316
/// # Implementation
317317
///
318318
/// Some widgets (for example, a scroll region) are able to handle resizes
319-
/// locally and should implement this method to do so
320-
/// (thus avoiding the need for a full-window resize).
319+
/// locally and should implement this method to do so, avoiding the need for
320+
/// a full-window resize.
321321
///
322-
/// Return `Some(ActionResize)` if further resizing is needed, or `None` if
323-
/// resizing is complete.
322+
/// Return `true` if resizing is complete, otherwise return `false` to
323+
/// indicate that further resizing is required.
324324
///
325-
/// The default implementation simply returns `Some(ActionResize)`.
325+
/// The default implementation simply returns `false`.
326326
#[inline]
327327
#[must_use]
328-
fn handle_resize(&mut self, cx: &mut ConfigCx, data: &Self::Data) -> Option<ActionResize> {
329-
let _ = (cx, data);
330-
Some(ActionResize)
328+
fn handle_resize(&mut self, cx: &mut ConfigCx) -> bool {
329+
let _ = cx;
330+
false
331331
}
332332

333333
/// Handler for scrolling

crates/kas-core/src/core/impls.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ pub fn _update<W: Events>(widget: &mut W, cx: &mut ConfigCx, data: &W::Data) {
4242
}
4343

4444
if cx.needs_resize() && widget.status().is_sized() {
45-
let opt_resize = widget.handle_resize(cx, data);
46-
cx.set_resize(opt_resize);
45+
if widget.handle_resize(cx) {
46+
cx.set_resize(None);
47+
}
4748
}
4849
}
4950
}
@@ -99,8 +100,9 @@ pub fn _send<W: Events>(
99100

100101
if cx.needs_resize() {
101102
debug_assert!(widget.status().is_sized());
102-
let opt_resize = widget.handle_resize(cx, data);
103-
cx.set_resize(opt_resize);
103+
if widget.handle_resize(cx) {
104+
cx.set_resize(None);
105+
}
104106
}
105107

106108
if let Some(scroll) = cx.post_send(index) {
@@ -147,8 +149,9 @@ pub fn _replay<W: Events>(widget: &mut W, cx: &mut EventCx, data: &<W as Widget>
147149
}
148150

149151
if cx.needs_resize() && widget.status().is_sized() {
150-
let opt_resize = widget.handle_resize(cx, data);
151-
cx.set_resize(opt_resize);
152+
if widget.handle_resize(cx) {
153+
cx.set_resize(None);
154+
}
152155
}
153156

154157
if let Some(scroll) = cx.post_send(index) {

crates/kas-view/src/grid_view.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,8 +462,11 @@ mod GridView {
462462
data_len = result.len();
463463
if data_len != self.data_len {
464464
self.data_len = data_len;
465-
cx.resize();
466465
self.token_update = Update::Token;
466+
467+
// TODO(opt): notify that content_size() has changed without
468+
// requiring re-evaluation of size_rules() or set_rect():
469+
cx.resize();
467470
}
468471
} else {
469472
data_len = self.data_len;

crates/kas-view/src/list_view.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,9 @@ mod ListView {
567567
data_len = result.len();
568568
if data_len != usize::conv(self.data_len) {
569569
self.data_len = data_len.cast();
570+
571+
// TODO(opt): notify that content_size() has changed without
572+
// requiring re-evaluation of size_rules() or set_rect():
570573
cx.resize();
571574
}
572575
} else {

crates/kas-widgets/src/edit/edit_box.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -213,14 +213,10 @@ mod EditBox {
213213
}
214214
}
215215

216-
fn handle_resize(&mut self, cx: &mut ConfigCx, _: &Self::Data) -> Option<ActionResize> {
217-
let size = self.inner.rect().size;
218-
let axis = AxisInfo::new(false, Some(size.1));
219-
let mut resize = self.inner.size_rules(&mut cx.size_cx(), axis).min_size() > size.0;
220-
let axis = AxisInfo::new(true, Some(size.0));
221-
resize |= self.inner.size_rules(&mut cx.size_cx(), axis).min_size() > size.1;
216+
fn handle_resize(&mut self, cx: &mut ConfigCx) -> bool {
217+
// Assumption: content does not require re-evaluation of size_rules() or set_rect()
222218
self.update_content_size(cx);
223-
resize.then_some(ActionResize)
219+
true
224220
}
225221

226222
fn handle_scroll(&mut self, cx: &mut EventCx<'_>, _: &G::Data, scroll: Scroll) {

crates/kas-widgets/src/scroll.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -456,12 +456,12 @@ mod ScrollRegion {
456456
.update_offset(cx, data, self.inner.rect(), offset);
457457
}
458458

459-
fn handle_resize(&mut self, cx: &mut ConfigCx, _: &Self::Data) -> Option<ActionResize> {
459+
fn handle_resize(&mut self, cx: &mut ConfigCx) -> bool {
460460
let _ = self.size_rules(&mut cx.size_cx(), AxisInfo::new(false, None));
461461
let width = self.rect().size.0;
462462
let _ = self.size_rules(&mut cx.size_cx(), AxisInfo::new(true, Some(width)));
463463
self.set_rect(&mut cx.size_cx(), self.rect(), self.hints);
464-
None
464+
true
465465
}
466466

467467
fn handle_scroll(&mut self, cx: &mut EventCx, data: &Self::Data, scroll: Scroll) {

crates/kas-widgets/src/scroll_label.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ mod ScrollText {
547547
}
548548
}
549549

550-
fn handle_resize(&mut self, cx: &mut ConfigCx, _: &Self::Data) -> Option<ActionResize> {
550+
fn handle_resize(&mut self, cx: &mut ConfigCx) -> bool {
551551
let size = self.text.rect().size;
552552
let axis = AxisInfo::new(false, Some(size.1));
553553
let mut resize = self.text.size_rules(&mut cx.size_cx(), axis).min_size() > size.0;
@@ -556,7 +556,7 @@ mod ScrollText {
556556
self.text
557557
.set_rect(&mut cx.size_cx(), self.text.rect(), Default::default());
558558
self.update_content_size(cx);
559-
resize.then_some(ActionResize)
559+
!resize
560560
}
561561

562562
fn handle_scroll(&mut self, cx: &mut EventCx, _: &Self::Data, scroll: Scroll) {

0 commit comments

Comments
 (0)