4 Commits

Author SHA1 Message Date
KenReneris
09ddb27934 Merge 2d50269730 into 994915dbb9 2025-07-27 12:27:41 -07:00
tattwamasi
994915dbb9 Add ftxui convenience/umbrella module to cmake rules to fix #1083 (#1085)
Some checks failed
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (cl, cl, windows-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (clang, clang++, macos-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (clang, clang++, ubuntu-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (gcc, g++, macos-latest) (push) Has been cancelled
Build / Bazel, ${{ matrix.cxx }}, ${{ matrix.os }} (gcc, g++, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (cl, Windows MSVC, windows-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (gcc, Linux GCC, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, Linux Clang, ubuntu-latest) (push) Has been cancelled
Build / CMake, ${{ matrix.compiler }}, ${{ matrix.os }} (llvm, llvm-cov gcov, MacOS clang, macos-latest) (push) Has been cancelled
Build / Test modules (llvm, ubuntu-latest) (push) Has been cancelled
Documentation / documentation (push) Has been cancelled
* Add the umbrella module ftxui to the cmake module build.

* Update cpp20 modules documentation.
2025-07-27 11:39:46 +02:00
Ken Reneris
2d50269730 private changes. don't shrink table content 2025-06-28 09:15:37 -07:00
Ken Reneris
df2ddcc588 Add gridbox children to children_ so that layout will see need_iteration when a flex node is in the grid 2025-06-28 08:51:41 -07:00
6 changed files with 83 additions and 19 deletions

View File

@@ -6,6 +6,7 @@ add_library(ftxui-modules)
target_sources(ftxui-modules
PUBLIC FILE_SET CXX_MODULES FILES
src/ftxui/ftxui.cppm
src/ftxui/component.cppm
src/ftxui/component/animation.cppm
src/ftxui/component/captured_mouse.cppm

View File

@@ -12,8 +12,24 @@ FTXUI experimentally supports
compilation times and improve code organization. Each header has a
corresponding module.
**Example with CMake and Ninja**
Use the FTXUI_BUILD_MODULES option to build the FTXUI project itself to provide C++ 20 modules,
for example with CMake and Ninja:
```sh
cmake \
-DCMAKE_GENERATOR=Ninja \
-DFTXUI_BUILD_MODULES=ON \
..
ninja
```
> [!NOTE]
> To use modules, you need a C++20 compatible compiler, CMake version 3.20 or
> higher, and use a compatible generator like Ninja. Note that Makefile
> generators **do not support modules**.
Then, in your own code you can consume the modules and code as normal:
```cpp
import ftxui;
@@ -26,23 +42,30 @@ int main() {
}
```
```sh
cmake \
-DCMAKE_GENERATOR=Ninja \
-DFTXUI_BUILD_MODULES=ON \
..
Note, the `ftxui` convenience module which simply pulls together all the modules:
ninja
```cpp
export import ftxui.component;
export import ftxui.dom;
export import ftxui.screen;
export import ftxui.util;
```
You can instead import only the module(s) you need if desired.
To properly find and link the modules with CMake, use `target_link_libraries` to get the right
compiler, linker, etc. flags.
```cmake
target_link_libraries(my_executable
#...whatever...
PRIVATE ftxui::modules
)
```
> [!NOTE]
> To use modules, you need a C++20 compatible compiler, CMake version 3.20 or
> higher, and use a compatible generator like Ninja. Note that Makefile
> generators **do not support modules**.
### Module list
The modules directly reference the corresponding header, or a group of related
headers to provide a more convenient interface. The following modules
headers to provide a more convenient interface. The following modules
are available:
- `ftxui`

View File

@@ -58,11 +58,39 @@ void ComputeShrinkHard(std::vector<Element>* elements,
element.size = element.min_size + added_space;
}
}
// Called when the size allowed is lower than the requested size, and the
// shrinkable element can not absorbe the (negative) extra_space. This assign
// zero to shrinkable elements and distribute the remaining (negative)
// extra_space toward the other non shrinkable elements.
void ComputeShrinkHardHack(std::vector<Element>* elements,
int extra_space,
int size)
{
for (Element& element : *elements)
{
if (element.flex_shrink != 0)
{
element.size = 0;
}
}
for (auto it = elements->rbegin(); it != elements->rend(); ++it)
{
Element& element = *it;
auto remove = std::min(element.min_size, -extra_space);
element.size = element.min_size - remove;
extra_space += remove;
}
}
} // namespace
void Compute(std::vector<Element>* elements, int target_size) {
void Compute(std::vector<Element>* elements, int target_size, bool hack) {
int size = 0;
int flex_grow_sum = 0;
int flex_shrink_sum = 0;
@@ -84,8 +112,14 @@ void Compute(std::vector<Element>* elements, int target_size) {
ComputeShrinkEasy(elements, extra_space, flex_shrink_sum);
} else {
ComputeShrinkHard(elements, extra_space + flex_shrink_size,
size - flex_shrink_size);
if (hack)
{
ComputeShrinkHardHack(elements, extra_space + flex_shrink_size, size - flex_shrink_size);
}
else
{
ComputeShrinkHard(elements, extra_space + flex_shrink_size, size - flex_shrink_size);
}
}
}

View File

@@ -19,7 +19,7 @@ struct Element {
int size = 0;
};
void Compute(std::vector<Element>* elements, int target_size);
void Compute(std::vector<Element>* elements, int target_size, bool hack=false);
} // namespace ftxui::box_helper
#endif /* end of include guard: FTXUI_DOM_BOX_HELPER_HPP */

View File

@@ -46,6 +46,12 @@ class GridBox : public Node {
line.push_back(filler());
}
}
for (const auto& line : lines_) {
for (const auto &element : line) {
children_.push_back( element );
}
}
}
void ComputeRequirement() override {
@@ -109,7 +115,7 @@ class GridBox : public Node {
const int target_size_x = box.x_max - box.x_min + 1;
const int target_size_y = box.y_max - box.y_min + 1;
box_helper::Compute(&elements_x, target_size_x);
box_helper::Compute(&elements_x, target_size_x, true);
box_helper::Compute(&elements_y, target_size_y);
Box box_y = box;

View File

@@ -216,13 +216,13 @@ Element Table::Render() {
// Line
if ((x + y) % 2 == 1) {
it = std::move(it) | flex;
it = std::move(it)| flex; //it = std::move(it); // | flex;
continue;
}
// Cells
if ((x % 2) == 1 && (y % 2) == 1) {
it = std::move(it) | flex_shrink;
// it = std::move(it) | flex_shrink; //it = std::move(it) | flex_shrink;
continue;
}