Skip to content

Commit

Permalink
Allow a Dimension::Fit to extend beyond the terminal maximum height (#…
Browse files Browse the repository at this point in the history
…950)

For long tables (and other DOM elements), one may want the screen to render on dimensions higher than the terminal.  
Hence, this PR proposes a way to do so, with an optional parameter in the `Dimension::Fit` util function.

Discussions / Issues :  
- #572
- #949

Bug:#572
Fixed:Bug:#572
Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
  • Loading branch information
LordWhiro and ArthurSonzogni authored Nov 7, 2024
1 parent 55af678 commit 70bc44d
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 7 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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()`.
Expand Down
3 changes: 2 additions & 1 deletion examples/dom/table.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion include/ftxui/dom/elements.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ Element align_right(Element);
Element nothing(Element element);

namespace Dimension {
Dimensions Fit(Element&);
Dimensions Fit(Element&, bool extend_beyond_screen = false);
} // namespace Dimension

} // namespace ftxui
Expand Down
17 changes: 12 additions & 5 deletions src/ftxui/dom/util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ Element& operator|=(Element& e, Decorator d) {
/// The minimal dimension that will fit the given element.
/// @see Fixed
/// @see Full
Dimensions Dimension::Fit(Element& e) {
Dimensions Dimension::Fit(Element& e, bool extend_beyond_screen) {
const Dimensions fullsize = Dimension::Full();
Box box;
box.x_min = 0;
Expand All @@ -106,7 +106,10 @@ Dimensions Dimension::Fit(Element& e) {

// 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 = 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;
Expand All @@ -116,10 +119,14 @@ Dimensions Dimension::Fit(Element& e) {
if (!status.need_iteration) {
break;
}
// Increase the size of the box until it fits, but not more than the with 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 = 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 {
Expand Down

0 comments on commit 70bc44d

Please sign in to comment.