FTXUI 6.1.9
C++ functional terminal UI.
Chargement...
Recherche...
Aucune correspondance
dom/util.cpp
Aller à la documentation de ce fichier.
1// Copyright 2020 Arthur Sonzogni. Tous droits réservés.
2// L'utilisation de ce code source est régie par la licence MIT que l'on peut trouver dans
3// le fichier LICENSE.
4#include <algorithm> // for min
5#include <functional> // for function
6#include <memory> // for __shared_ptr_access, make_unique
7#include <utility> // for move
8
9#include "ftxui/dom/elements.hpp" // for Element, Decorator, Elements, operator|, Fit, emptyElement, nothing, operator|=
10#include "ftxui/dom/node.hpp" // for Node, Node::Status
11#include "ftxui/dom/requirement.hpp" // for Requirement
12#include "ftxui/screen/box.hpp" // for Box
13#include "ftxui/screen/screen.hpp" // for Full
14#include "ftxui/screen/terminal.hpp" // for Dimensions
15
16namespace ftxui {
17
18namespace {
19Decorator compose(Decorator a, Decorator b) {
20 return [a = std::move(a), b = std::move(b)](Element element) {
21 return b(a(std::move(element)));
22 };
23}
24} // namespace
25
26/// @brief Une décoration qui ne fait absolument rien.
27/// @ingroup dom
29 return element;
30}
31
32/// @brief Compose deux décorateurs en un seul.
33///
34/// ### Exemple
35///
36/// ```cpp
37/// auto decorator = bold | blink;
38/// ```
40 return compose(std::move(a), //
41 std::move(b));
42}
43
44/// À partir d'un ensemble d'éléments, appliquer un décorateur à tous les éléments.
45/// @return l'ensemble des éléments décorés.
46/// @ingroup dom
47Elements operator|(Elements elements, Decorator decorator) { // NOLINT
48 Elements output;
49 output.reserve(elements.size());
50 for (auto& it : elements) {
51 output.push_back(std::move(it) | decorator);
52 }
53 return output;
54}
55
56/// @brief À partir d'un élément, appliquer un décorateur.
57/// @return l'élément décoré.
58///
59/// ### Exemple
60///
61/// Les deux sont équivalents :
62Element operator|(Element element, Decorator decorator) { // NOLINT
63 return decorator(std::move(element));
64}
65
66/// @brief Applique un décorateur à un élément.
67/// @return l'élément décoré.
68/// @ingroup dom
69///
70/// ### Exemple
71///
72/// Les deux sont équivalents :
73/// ```cpp
74/// auto element = text("Hello");
75/// element |= bold;
76/// ```
78 e = e | std::move(d);
79 return e;
80}
81
82/// La dimension minimale qui correspondra à l'élément donné.
83/// @see Fixed
84/// @see Full
85Dimensions Dimension::Fit(Element& e, bool extend_beyond_screen) {
86 const Dimensions fullsize = Dimension::Full();
87 Box box;
88 box.x_min = 0;
89 box.y_min = 0;
90 box.x_max = fullsize.dimx;
91 box.y_max = fullsize.dimy;
92
93 Node::Status status;
94 e->Check(&status);
95 const int max_iteration = 20;
96 while (status.need_iteration && status.iteration < max_iteration) {
97 e->ComputeRequirement();
98
99 // Don't give the element more space than it needs:
100 box.x_max = std::min(box.x_max, e->requirement().min_x);
101 box.y_max = e->requirement().min_y;
102 if (!extend_beyond_screen) {
103 box.y_max = std::min(box.y_max, fullsize.dimy);
104 }
105
106 e->SetBox(box);
107 status.need_iteration = false;
108 status.iteration++;
109 e->Check(&status);
110
111 if (!status.need_iteration) {
112 break;
113 }
114 // Increase the size of the box until it fits...
115 box.x_max = std::min(e->requirement().min_x, fullsize.dimx);
116 box.y_max = e->requirement().min_y;
117
118 // ... but don't go beyond the screen size:
119 if (!extend_beyond_screen) {
120 box.y_max = std::min(box.y_max, fullsize.dimy);
121 }
122 }
123
124 return {
125 box.x_max,
126 box.y_max,
127 };
128}
129
130/// Un élément de taille 0x0 ne dessinant rien.
131/// @ingroup dom
133 class Impl : public Node {
134 void ComputeRequirement() override {
135 requirement_.min_x = 0;
136 requirement_.min_y = 0;
137 }
138 };
139 return std::make_unique<Impl>();
140}
141
142} // namespace ftxui
Node est la classe de base pour tous les éléments de l'arbre DOM.
Definition node.hpp:36
Element nothing(Element element)
Une décoration qui ne fait absolument rien.
Definition dom/util.cpp:28
Element emptyElement()
Definition dom/util.cpp:132
Dimensions Fit(Element &, bool extend_beyond_screen=false)
Dimensions Full()
L'espace de noms FTXUI ftxui::
Definition animation.hpp:10
std::function< Element(Element)> Decorator
Definition elements.hpp:24
std::shared_ptr< Node > Element
Definition elements.hpp:22
std::vector< Element > Elements
Definition elements.hpp:23
Component operator|(Component component, ComponentDecorator decorator)
Component & operator|=(Component &component, ComponentDecorator decorator)