diff --git a/doc/example_list.h b/doc/example_list.h index 834ea10..7d3c8d3 100644 --- a/doc/example_list.h +++ b/doc/example_list.h @@ -1,7 +1,10 @@ /// @example ./examples/util/print_key_press.cpp +/// @example ./examples/dom/color_truecolor_HSV.cpp /// @example ./examples/dom/dbox.cpp /// @example ./examples/dom/separator.cpp /// @example ./examples/dom/style_color.cpp +/// @example ./examples/dom/color_info_palette256.cpp +/// @example ./examples/dom/color_truecolor_RGB.cpp /// @example ./examples/dom/paragraph.cpp /// @example ./examples/dom/style_blink.cpp /// @example ./examples/dom/style_dim.cpp @@ -12,6 +15,7 @@ /// @example ./examples/dom/html_like.cpp /// @example ./examples/dom/border.cpp /// @example ./examples/dom/style_underlined.cpp +/// @example ./examples/dom/color_gallery.cpp /// @example ./examples/dom/gauge.cpp /// @example ./examples/dom/style_bold.cpp /// @example ./examples/dom/spinner.cpp @@ -25,10 +29,15 @@ /// @example ./examples/component/checkbox_in_frame.cpp /// @example ./examples/component/menu2.cpp /// @example ./examples/component/tab_horizontal.cpp +/// @example ./examples/component/slider.cpp +/// @example ./examples/component/slider_rgb.cpp /// @example ./examples/component/input.cpp /// @example ./examples/component/homescreen.cpp /// @example ./examples/component/radiobox.cpp +/// @example ./examples/component/resizable_split.cpp /// @example ./examples/component/menu.cpp /// @example ./examples/component/menu_style.cpp /// @example ./examples/component/radiobox_in_frame.cpp +/// @example ./examples/component/button.cpp /// @example ./examples/component/toggle.cpp +/// @example ./examples/component/modal_dialog.cpp diff --git a/doc/example_list.md b/doc/example_list.md index 5f65403..e7b25c8 100644 --- a/doc/example_list.md +++ b/doc/example_list.md @@ -31,10 +31,11 @@ @example ./examples/component/menu2.cpp @example ./examples/component/tab_horizontal.cpp @example ./examples/component/slider.cpp +@example ./examples/component/slider_rgb.cpp @example ./examples/component/input.cpp @example ./examples/component/homescreen.cpp @example ./examples/component/radiobox.cpp -@example ./examples/component/slider_rgb.cpp +@example ./examples/component/resizable_split.cpp @example ./examples/component/menu.cpp @example ./examples/component/menu_style.cpp @example ./examples/component/radiobox_in_frame.cpp diff --git a/doc/mainpage.md b/doc/mainpage.md index 38434b9..6f9faa7 100644 --- a/doc/mainpage.md +++ b/doc/mainpage.md @@ -459,6 +459,12 @@ Produced by: ftxui::Renderer() from \ref "ftxui/component/component.hpp". This component decorate another one by using a different function to render an interface. +## CatchEvent + +Produced by: ftxui::CatchEvent() from \ref "ftxui/component/component.hpp". This +component decorate another one and catch the events before the underlying +component. + ## Container::Horizontal Produced by: ftxui::Container::Horizontal() from @@ -476,3 +482,21 @@ and handles keyboard/mouse navigation. Produced by: ftxui::Container::Tab() from "ftxui/component/component.hpp". It take a list of component and display only one of them. This is useful for implementing a tab bar. + +## ResizableSplit::{Left, Right, Top, Bottom} + +Produced by: +- ftxui::ResizableSplitLeft() +- ftxui::ResizableSplitRight() +- ftxui::ResizableSplitTop() +- ftxui::ResizableSplitBottom() + +from "ftxui/component/component.hpp" + +It defines an horizontal or vertical separation in between two chilren +component. The position of the split is variable and controlable using the +mouse. + +@htmlonly + +@endhtmlonly diff --git a/examples/component/resizable_split.cpp b/examples/component/resizable_split.cpp index 7a72adf..4f81697 100644 --- a/examples/component/resizable_split.cpp +++ b/examples/component/resizable_split.cpp @@ -18,10 +18,10 @@ int main(int argc, const char* argv[]) { int bottom_size = 10; auto container = middle; - container = ResizableSplit::Left(left, container, &left_size); - container = ResizableSplit::Right(right, container, &right_size); - container = ResizableSplit::Top(top, container, &top_size); - container = ResizableSplit::Bottom(bottom, container, &bottom_size); + container = ResizableSplitLeft(left, container, &left_size); + container = ResizableSplitRight(right, container, &right_size); + container = ResizableSplitTop(top, container, &top_size); + container = ResizableSplitBottom(bottom, container, &bottom_size); auto renderer = Renderer(container, [&] { return container->Render() | border; }); diff --git a/include/ftxui/component/component.hpp b/include/ftxui/component/component.hpp index bc32123..8bddb2c 100644 --- a/include/ftxui/component/component.hpp +++ b/include/ftxui/component/component.hpp @@ -44,12 +44,10 @@ Component Tab(Components children, int* selector); } // namespace Container -namespace ResizableSplit { -Component Left(Component main, Component back, int* main_size); -Component Right(Component main, Component back, int* main_size); -Component Top(Component main, Component back, int* main_size); -Component Bottom(Component main, Component back, int* main_size); -} // namespace ResizableSplit +Component ResizableSplitLeft(Component main, Component back, int* main_size); +Component ResizableSplitRight(Component main, Component back, int* main_size); +Component ResizableSplitTop(Component main, Component back, int* main_size); +Component ResizableSplitBottom(Component main, Component back, int* main_size); } // namespace ftxui diff --git a/src/ftxui/component/resizable_split.cpp b/src/ftxui/component/resizable_split.cpp index f16c33d..137d762 100644 --- a/src/ftxui/component/resizable_split.cpp +++ b/src/ftxui/component/resizable_split.cpp @@ -7,9 +7,9 @@ namespace ftxui { namespace { -class ResizableSplitLeft : public ComponentBase { +class ResizableSplitLeftBase : public ComponentBase { public: - ResizableSplitLeft(Component main, Component child, int* main_size) + ResizableSplitLeftBase(Component main, Component child, int* main_size) : main_(main), child_(child), main_size_(main_size) { Add(Container::Horizontal({ main, @@ -63,9 +63,9 @@ class ResizableSplitLeft : public ComponentBase { Box global_box_; }; -class ResizableSplitRight: public ComponentBase { +class ResizableSplitRightBase: public ComponentBase { public: - ResizableSplitRight(Component main, Component child, int* main_size) + ResizableSplitRightBase(Component main, Component child, int* main_size) : main_(main), child_(child), main_size_(main_size) { Add(Container::Horizontal({ child, @@ -119,9 +119,9 @@ class ResizableSplitRight: public ComponentBase { Box global_box_; }; -class ResizableSplitTop: public ComponentBase { +class ResizableSplitTopBase: public ComponentBase { public: - ResizableSplitTop(Component main, Component child, int* main_size) + ResizableSplitTopBase(Component main, Component child, int* main_size) : main_(main), child_(child), main_size_(main_size) { Add(Container::Vertical({ main, @@ -175,9 +175,9 @@ class ResizableSplitTop: public ComponentBase { Box global_box_; }; -class ResizableSplitBottom: public ComponentBase { +class ResizableSplitBottomBase: public ComponentBase { public: - ResizableSplitBottom(Component main, Component child, int* main_size) + ResizableSplitBottomBase(Component main, Component child, int* main_size) : main_(main), child_(child), main_size_(main_size) { Add(Container::Vertical({ child, @@ -233,25 +233,120 @@ class ResizableSplitBottom: public ComponentBase { } // namespace -namespace ResizableSplit { -Component Left(Component main, Component back, int* main_size) { - return Make(std::move(main), std::move(back), main_size); +/// @brief An horizontal split in between two components, configurable using the +/// mouse. +/// @param main The main component of size |main_size|, on the left. +/// @param back The back component taking the remaining size, on the right. +/// @param main_size The size of the |main| component. +/// @ingroup component +/// +/// ### Example +/// +/// ```cpp +/// auto screen = ScreenInteractive::Fullscreen(); +/// int left_size = 10; +/// auto left = Renderer([] { return text(L"Left") | center;}); +/// auto right = Renderer([] { return text(L"right") | center;}); +/// auto split = ResizableSplitLeft(left, right, &left_size); +/// screen.Loop(split); +/// ``` +/// +/// ### Output +/// +/// ```bash +/// │ +/// left │ right +/// │ +/// ``` +Component ResizableSplitLeft(Component main, Component back, int* main_size) { + return Make(std::move(main), std::move(back), main_size); } -Component Right(Component main, Component back, int* main_size) { - return Make(std::move(main), std::move(back), main_size); + +/// @brief An horizontal split in between two components, configurable using the +/// mouse. +/// @param main The main component of size |main_size|, on the right. +/// @param back The back component taking the remaining size, on the left. +/// @param main_size The size of the |main| component. +/// @ingroup component +/// +/// ### Example +/// +/// ```cpp +/// auto screen = ScreenInteractive::Fullscreen(); +/// int right_size = 10; +/// auto left = Renderer([] { return text(L"Left") | center;}); +/// auto right = Renderer([] { return text(L"right") | center;}); +/// auto split = ResizableSplitRight(right, left, &right_size); +/// screen.Loop(split); +/// ``` +/// +/// ### Output +/// +/// ```bash +/// │ +/// left │ right +/// │ +/// ``` +Component ResizableSplitRight(Component main, Component back, int* main_size) { + return Make(std::move(main), std::move(back), + main_size); } -Component Top(Component main, Component back, int* main_size) { - return Make(std::move(main), std::move(back), main_size); + +/// @brief An vertical split in between two components, configurable using the +/// mouse. +/// @param main The main component of size |main_size|, on the top. +/// @param back The back component taking the remaining size, on the bottom. +/// @param main_size The size of the |main| component. +/// @ingroup component +/// +/// ### Example +/// +/// ```cpp +/// auto screen = ScreenInteractive::Fullscreen(); +/// int top_size = 1; +/// auto top = Renderer([] { return text(L"Top") | center;}); +/// auto bottom = Renderer([] { return text(L"Bottom") | center;}); +/// auto split = ResizableSplitTop(top, bottom, &top_size); +/// screen.Loop(split); +/// ``` +/// +/// ### Output +/// +/// ```bash +/// top +/// ──────────── +/// bottom +/// ``` +Component ResizableSplitTop(Component main, Component back, int* main_size) { + return Make(std::move(main), std::move(back), main_size); } -Component Bottom(Component main, Component back, int* main_size) { - return Make(std::move(main), std::move(back), main_size); + +/// @brief An vertical split in between two components, configurable using the +/// mouse. +/// @param main The main component of size |main_size|, on the bottom. +/// @param back The back component taking the remaining size, on the top. +/// @param main_size The size of the |main| component. +/// @ingroup component +/// +/// ### Example +/// +/// ```cpp +/// auto screen = ScreenInteractive::Fullscreen(); +/// int bottom_size = 1; +/// auto top = Renderer([] { return text(L"Top") | center;}); +/// auto bottom = Renderer([] { return text(L"Bottom") | center;}); +/// auto split = ResizableSplit::Bottom(bottom, top, &bottom_size); +/// screen.Loop(split); +/// ``` +/// +/// ### Output +/// +/// ```bash +/// top +/// ──────────── +/// bottom +/// ``` +Component ResizableSplitBottom(Component main, Component back, int* main_size) { + return Make(std::move(main), std::move(back), main_size); } -//Component Top(Component main, Component back, int main_size) { - //return Make(std::move(main), std::move(back), main_size); -//} -//Component Bottom(Component main, Component back, int main_size) { - //return Make(std::move(main), std::move(back), - //main_size); -//} -} // namespace ResizableSplit } // namespace ftxui