From 06485495d475fb1f93b0aa20aee3082f4c9d1c3a Mon Sep 17 00:00:00 2001 From: Will McGugan Date: Sat, 19 Feb 2022 11:39:11 +0000 Subject: [PATCH] optimization, more tests --- src/textual/_layout_resolve.py | 6 +++--- tests/test_layout_resolve.py | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/textual/_layout_resolve.py b/src/textual/_layout_resolve.py index a896616a6..5a4f08435 100644 --- a/src/textual/_layout_resolve.py +++ b/src/textual/_layout_resolve.py @@ -58,18 +58,18 @@ def layout_resolve(total: int, edges: Sequence[Edge]) -> list[int]: for size, edge in zip(sizes, edges) ] + total_flexible = sum((edge.fraction or 1) for _, edge in flexible_edges) _Fraction = Fraction while flexible_edges: # Calculate number of characters in a ratio portion - portion = _Fraction( - remaining, sum((edge.fraction or 1) for _, edge in flexible_edges) - ) + portion = _Fraction(remaining, total_flexible) # If any edges will be less than their minimum, replace size with the minimum for flexible_index, (index, edge) in enumerate(flexible_edges): if portion * edge.fraction <= edge.min_size: sizes[index] = edge.min_size remaining -= edge.min_size + total_flexible -= edge.fraction del flexible_edges[flexible_index] # New fixed size will invalidate calculations, so we need to repeat the process break diff --git a/tests/test_layout_resolve.py b/tests/test_layout_resolve.py index f187d8f1d..9f44bcc5c 100644 --- a/tests/test_layout_resolve.py +++ b/tests/test_layout_resolve.py @@ -64,6 +64,28 @@ def test_two(): [5, 2, 1, 2], ), (2, [Edge(None, 1), Edge(None, 1), Edge(None, 1)], [1, 1, 1]), + ( + 2, + [ + Edge(None, 1, min_size=5), + Edge(None, 1, min_size=4), + Edge(None, 1, min_size=3), + ], + [5, 4, 3], + ), + ( + 18, + [ + Edge(None, 1, min_size=1), + Edge(3), + Edge(None, 1, min_size=1), + Edge(4), + Edge(None, 1, min_size=1), + Edge(5), + Edge(None, 1, min_size=1), + ], + [1, 3, 2, 4, 1, 5, 2], + ), ], ) def test_multiple(size, edges, result):