diff --git a/CHANGELOG.md b/CHANGELOG.md index 476b6336..bfbcfb15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,9 @@ current (development) - Feature: Add `hscroll_indicator`. It display an horizontal indicator reflecting the current scroll position. Proposed by @ibrahimnasson in [issue 752](https://github.com/ArthurSonzogni/FTXUI/issues/752) +- Feature: Add `extend_beyond_screen` option to `Dimension::Fit(..)`, allowing + the element to be larger than the screen. Proposed by @LordWhiro. See #572 and + #949. ### Screen - Feature: Add `Box::IsEmpty()`. diff --git a/examples/dom/table.cpp b/examples/dom/table.cpp index 020a2afe..690dae4c 100644 --- a/examples/dom/table.cpp +++ b/examples/dom/table.cpp @@ -55,7 +55,8 @@ int main() { content.DecorateCellsAlternateRow(color(Color::White), 3, 2); auto document = table.Render(); - auto screen = Screen::Create(Dimension::Fit(document)); + auto screen = + Screen::Create(Dimension::Fit(document, /*extend_beyond_screen=*/true)); Render(screen, document); screen.Print(); std::cout << std::endl; diff --git a/src/ftxui/dom/util.cpp b/src/ftxui/dom/util.cpp index 74a05432..9bf2086e 100644 --- a/src/ftxui/dom/util.cpp +++ b/src/ftxui/dom/util.cpp @@ -106,9 +106,10 @@ Dimensions Dimension::Fit(Element& e, bool extend_beyond_screen) { // Don't give the element more space than it needs: box.x_max = std::min(box.x_max, e->requirement().min_x); - box.y_max = extend_beyond_screen - ? e->requirement().min_y // can exceed size in Y if extend_beyond_screen==true - : std::min(box.y_max, e->requirement().min_y); + box.y_max = e->requirement().min_y; + if (!extend_beyond_screen) { + box.y_max = std::min(box.y_max, fullsize.dimy); + } e->SetBox(box); status.need_iteration = false; @@ -118,12 +119,14 @@ Dimensions Dimension::Fit(Element& e, bool extend_beyond_screen) { if (!status.need_iteration) { break; } - // Increase the size of the box until it fits, but not more than the size of - // the terminal emulator: + // Increase the size of the box until it fits... box.x_max = std::min(e->requirement().min_x, fullsize.dimx); - box.y_max = extend_beyond_screen - ? e->requirement().min_y // can exceed size in Y if extend_beyond_screen==true - : std::min(e->requirement().min_y, fullsize.dimy); + box.y_max = e->requirement().min_y; + + // ... but don't go beyond the screen size: + if (!extend_beyond_screen) { + box.y_max = std::min(box.y_max, fullsize.dimy); + } } return {