From ccb437f4da38d01cd0423526fe05a5b01c4d83cc Mon Sep 17 00:00:00 2001 From: Arthur Sonzogni Date: Sun, 6 Jan 2019 19:17:27 +0100 Subject: [PATCH] Add size(width, height) decorator. --- examples/dom/package_manager.cpp | 5 +--- ftxui/CMakeLists.txt | 1 + ftxui/include/ftxui/dom/elements.hpp | 3 +++ ftxui/src/ftxui/dom/size.cpp | 35 ++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 ftxui/src/ftxui/dom/size.cpp diff --git a/examples/dom/package_manager.cpp b/examples/dom/package_manager.cpp index 590797bd..b57ebb46 100644 --- a/examples/dom/package_manager.cpp +++ b/examples/dom/package_manager.cpp @@ -44,10 +44,7 @@ int main(int argc, const char *argv[]) int nb_done = 0; auto to_text = [](int number) { - std::wstring t = to_wstring(number); - while(t.size() < 3) - t = L" " + t; - return text(t); + return text(to_wstring(number)) | size(3,1); }; auto renderTask = [&](const Task& task) { diff --git a/ftxui/CMakeLists.txt b/ftxui/CMakeLists.txt index 78d32144..e77020f6 100644 --- a/ftxui/CMakeLists.txt +++ b/ftxui/CMakeLists.txt @@ -37,6 +37,7 @@ add_library(dom src/ftxui/dom/node.cpp src/ftxui/dom/node_decorator.cpp src/ftxui/dom/separator.cpp + src/ftxui/dom/size.cpp src/ftxui/dom/text.cpp src/ftxui/dom/underlined.cpp src/ftxui/dom/util.cpp diff --git a/ftxui/include/ftxui/dom/elements.hpp b/ftxui/include/ftxui/dom/elements.hpp index 1f72615a..52eaac3b 100644 --- a/ftxui/include/ftxui/dom/elements.hpp +++ b/ftxui/include/ftxui/dom/elements.hpp @@ -18,8 +18,11 @@ using Color = ftxui::screen::Color; Element vbox(Children); Element hbox(Children); Element dbox(Children); + +// -- Flexibility -- Element filler(); Element flex(Element); +Decorator size(size_t width, size_t height); // --- Widget -- Element text(std::wstring text); diff --git a/ftxui/src/ftxui/dom/size.cpp b/ftxui/src/ftxui/dom/size.cpp new file mode 100644 index 00000000..68d0af5d --- /dev/null +++ b/ftxui/src/ftxui/dom/size.cpp @@ -0,0 +1,35 @@ +#include "ftxui/dom/node.hpp" +#include "ftxui/dom/elements.hpp" + +namespace ftxui::dom { + +class Size : public Node { + public: + Size(Element child, size_t width, size_t height) + : Node(unpack(std::move(child))), width_(width), height_(height) {} + ~Size() override {} + void ComputeRequirement() override { + Node::ComputeRequirement(); + requirement_.min.x = width_; + requirement_.min.y = height_; + requirement_.flex.x = 0; + requirement_.flex.y = 0; + } + + void SetBox(Box box) override { + Node::SetBox(box); + children[0]->SetBox(box); + } + + private: + size_t width_; + size_t height_; +}; + +Decorator size(size_t width, size_t height) { + return [=](Element e) { + return std::make_unique(std::move(e), width, height); + }; +} + +}; // namespace ftxui::dom