From 5349f0f3d08bad245df5764e7370cbe12c7abda7 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Tue, 8 Apr 2025 15:56:10 -0700 Subject: [PATCH] row_col_toplevel_layout: Take into account max cross axis in scale factor Previous definition assumed the cross axis of a single window would not need more downscaling than the total main axis of all children. But that doesn't always work out. --- .../row_col_toplevel_layout.rs | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/widgets/toplevels/toplevel_layout/row_col_toplevel_layout.rs b/src/widgets/toplevels/toplevel_layout/row_col_toplevel_layout.rs index 1ec209c..d9e176f 100644 --- a/src/widgets/toplevels/toplevel_layout/row_col_toplevel_layout.rs +++ b/src/widgets/toplevels/toplevel_layout/row_col_toplevel_layout.rs @@ -12,10 +12,28 @@ pub(crate) struct RowColToplevelLayout { impl RowColToplevelLayout { // Get total requested main axis length if widget could have all the space - fn requested_main_total(&self, toplevels: &[LayoutToplevel<'_, AxisSize>]) -> f32 { + pub fn requested_main_total(&self, toplevels: &[LayoutToplevel<'_, AxisSize>]) -> f32 { let total_spacing = self.spacing as usize * (toplevels.len().saturating_sub(1)).max(0); toplevels.iter().map(|t| t.preferred_size.main).sum::() + total_spacing as f32 } + + pub fn requested_cross_max(&self, toplevels: &[LayoutToplevel<'_, AxisSize>]) -> f32 { + toplevels + .iter() + .map(|t| t.preferred_size.cross) + .max_by(f32::total_cmp) + .unwrap_or(1.0) + } + + pub fn scale_factor( + &self, + max_limit: AxisSize, + toplevels: &[LayoutToplevel<'_, AxisSize>], + ) -> f32 { + let scale_factor_main = max_limit.main / self.requested_main_total(toplevels); + let scale_factor_cross = max_limit.cross / self.requested_cross_max(toplevels); + scale_factor_main.min(scale_factor_cross).min(1.) + } } impl AxisToplevelLayout for RowColToplevelLayout { @@ -36,10 +54,10 @@ impl AxisToplevelLayout for RowColToplevelLayout { toplevels: &[LayoutToplevel<'_, AxisSize>], ) -> impl Iterator { let requested_main_total = self.requested_main_total(&toplevels); - let scale_factor = (max_limit.main / requested_main_total).min(1.0); + let scale_factor = self.scale_factor(max_limit, toplevels); // Add padding to center if total requested size doesn't fill available space - let padding = (max_limit.main - requested_main_total).max(0.) / 2.; + let padding = (max_limit.main - scale_factor * requested_main_total).max(0.) / 2.; let mut total_main = padding; let mut first = true;