FTXUI  0.8.1
C++ functional terminal UI.
renderer.cpp
Go to the documentation of this file.
1 #include <functional> // for function
2 #include <memory> // for __shared_ptr_access, shared_ptr
3 #include <utility> // for move
4 
5 #include "ftxui/component/captured_mouse.hpp" // for CapturedMouse
6 #include "ftxui/component/component.hpp" // for Make, Renderer
7 #include "ftxui/component/component_base.hpp" // for Component, ComponentBase
8 #include "ftxui/component/event.hpp" // for Event
9 #include "ftxui/component/mouse.hpp" // for Mouse
10 #include "ftxui/dom/elements.hpp" // for Element, operator|, reflect
11 #include "ftxui/screen/box.hpp" // for Box
12 
13 namespace ftxui {
14 
15 /// @brief Return a component, using |render| to render its interface.
16 /// @param render The function drawing the interface.
17 /// @ingroup component
18 ///
19 /// ### Example
20 ///
21 /// ```cpp
22 /// auto screen = ScreenInteractive::TerminalOutput();
23 /// auto renderer = Renderer([] {
24 /// return text("My interface");
25 /// });
26 /// screen.Loop(renderer);
27 /// ```
28 Component Renderer(std::function<Element()> render) {
29  class Impl : public ComponentBase {
30  public:
31  Impl(std::function<Element()> render) : render_(std::move(render)) {}
32  Element Render() override { return render_(); }
33  std::function<Element()> render_;
34  };
35 
36  return Make<Impl>(std::move(render));
37 }
38 
39 /// @brief Return a new Component, similar to |child|, but using |render| as the
40 /// Component::Render() event.
41 /// @param child The component to forward events to.
42 /// @param render The function drawing the interface.
43 /// @ingroup component
44 ///
45 /// ### Example
46 ///
47 /// ```cpp
48 /// auto screen = ScreenInteractive::TerminalOutput();
49 /// std::string label = "Click to quit";
50 /// auto button = Button(&label, screen.ExitLoopClosure());
51 /// auto renderer = Renderer(button, [&] {
52 /// return hbox({
53 /// text("A button:"),
54 /// button->Render(),
55 /// });
56 /// });
57 /// screen.Loop(renderer);
58 /// ```
59 Component Renderer(Component child, std::function<Element()> render) {
60  Component renderer = Renderer(std::move(render));
61  renderer->Add(std::move(child));
62  return renderer;
63 }
64 
65 /// @brief Return a focusable component, using |render| to render its interface.
66 /// @param render The function drawing the interface, taking a boolean telling
67 /// whether the component is focused or not.
68 /// @ingroup component
69 ///
70 /// ### Example
71 ///
72 /// ```cpp
73 /// auto screen = ScreenInteractive::TerminalOutput();
74 /// auto renderer = Renderer([] (bool focused) {
75 /// if (focused)
76 /// return text("My interface") | inverted;
77 /// else
78 /// return text("My interface");
79 /// });
80 /// screen.Loop(renderer);
81 /// ```
82 Component Renderer(std::function<Element(bool)> render) {
83  class Impl : public ComponentBase {
84  public:
85  Impl(std::function<Element(bool)> render) : render_(std::move(render)) {}
86 
87  private:
88  Element Render() override { return render_(Focused()) | reflect(box_); }
89  bool Focusable() const override { return true; }
90  bool OnEvent(Event event) override {
91  if (event.is_mouse() && box_.Contain(event.mouse().x, event.mouse().y)) {
92  if (!CaptureMouse(event))
93  return false;
94 
95  TakeFocus();
96  }
97 
98  return false;
99  }
100  Box box_;
101 
102  std::function<Element(bool)> render_;
103  };
104  return Make<Impl>(std::move(render));
105 }
106 
107 } // namespace ftxui
108 
109 // Copyright 2021 Arthur Sonzogni. All rights reserved.
110 // Use of this source code is governed by the MIT license that can be found in
111 // the LICENSE file.
ftxui::Box
Definition: box.hpp:6
ftxui
Definition: captured_mouse.hpp:6
ftxui::Component
std::shared_ptr< ComponentBase > Component
Definition: component_base.hpp:17
event.hpp
ftxui::reflect
Decorator reflect(Box &box)
Definition: reflect.cpp:38
box.hpp
ftxui::Mouse::y
int y
Definition: mouse.hpp:36
ftxui::Renderer
Component Renderer(Component child, std::function< Element()>)
Return a new Component, similar to |child|, but using |render| as the Component::Render() event.
Definition: renderer.cpp:59
elements.hpp
captured_mouse.hpp
component.hpp
component_base.hpp
ftxui::Element
std::shared_ptr< Node > Element
Definition: elements.hpp:15
ftxui::Event::mouse
struct Mouse & mouse()
Definition: event.hpp:63
ftxui::Mouse::x
int x
Definition: mouse.hpp:35
ftxui::Event::is_mouse
bool is_mouse() const
Definition: event.hpp:62
mouse.hpp
ftxui::Render
void Render(Screen &screen, const Element &node)
Display an element on a ftxui::Screen.
Definition: node.cpp:34
ftxui::ComponentBase
It implement rendering itself as ftxui::Element. It implement keyboard navigation by responding to ft...
Definition: component_base.hpp:23
ftxui::Event
Represent an event. It can be key press event, a terminal resize, or more ...
Definition: event.hpp:25