2023-08-19 19:56:36 +08:00
|
|
|
// Copyright 2020 Arthur Sonzogni. All rights reserved.
|
|
|
|
// Use of this source code is governed by the MIT license that can be found in
|
|
|
|
// the LICENSE file.
|
2018-10-10 01:06:03 +08:00
|
|
|
#ifndef FTXUI_DOM_ELEMENTS_HPP
|
|
|
|
#define FTXUI_DOM_ELEMENTS_HPP
|
2018-09-18 14:48:40 +08:00
|
|
|
|
2019-01-03 07:35:59 +08:00
|
|
|
#include <functional>
|
2020-05-21 02:36:47 +08:00
|
|
|
#include <memory>
|
2019-01-03 07:35:59 +08:00
|
|
|
|
2021-12-23 21:17:33 +08:00
|
|
|
#include "ftxui/dom/canvas.hpp"
|
2023-03-10 03:21:23 +08:00
|
|
|
#include "ftxui/dom/direction.hpp"
|
2021-12-12 00:58:25 +08:00
|
|
|
#include "ftxui/dom/flexbox_config.hpp"
|
2023-03-22 20:59:02 +08:00
|
|
|
#include "ftxui/dom/linear_gradient.hpp"
|
2018-10-10 01:06:03 +08:00
|
|
|
#include "ftxui/dom/node.hpp"
|
2021-04-19 04:33:41 +08:00
|
|
|
#include "ftxui/screen/box.hpp"
|
2019-01-07 00:10:35 +08:00
|
|
|
#include "ftxui/screen/color.hpp"
|
2021-08-03 05:19:29 +08:00
|
|
|
#include "ftxui/screen/terminal.hpp"
|
2021-12-23 21:17:33 +08:00
|
|
|
#include "ftxui/util/ref.hpp"
|
2018-09-18 14:48:40 +08:00
|
|
|
|
2019-01-12 22:00:08 +08:00
|
|
|
namespace ftxui {
|
2020-05-21 02:36:47 +08:00
|
|
|
class Node;
|
|
|
|
using Element = std::shared_ptr<Node>;
|
2019-01-13 01:24:46 +08:00
|
|
|
using Elements = std::vector<Element>;
|
2019-01-03 07:35:59 +08:00
|
|
|
using Decorator = std::function<Element(Element)>;
|
2020-02-12 04:44:55 +08:00
|
|
|
using GraphFunction = std::function<std::vector<int>(int, int)>;
|
2018-09-20 03:52:25 +08:00
|
|
|
|
2023-03-16 05:50:27 +08:00
|
|
|
enum BorderStyle {
|
|
|
|
LIGHT,
|
|
|
|
DASHED,
|
|
|
|
HEAVY,
|
|
|
|
DOUBLE,
|
|
|
|
ROUNDED,
|
|
|
|
EMPTY,
|
|
|
|
};
|
2021-09-12 06:36:59 +08:00
|
|
|
|
2020-06-07 21:54:45 +08:00
|
|
|
// Pipe elements into decorator togethers.
|
|
|
|
// For instance the next lines are equivalents:
|
2020-05-25 07:34:13 +08:00
|
|
|
// -> text("ftxui") | bold | underlined
|
2021-08-09 06:27:37 +08:00
|
|
|
// -> underlined(bold(text("FTXUI")))
|
2020-06-07 21:54:45 +08:00
|
|
|
Element operator|(Element, Decorator);
|
2022-03-12 22:18:36 +08:00
|
|
|
Element& operator|=(Element&, Decorator);
|
2020-06-07 21:54:45 +08:00
|
|
|
Elements operator|(Elements, Decorator);
|
|
|
|
Decorator operator|(Decorator, Decorator);
|
|
|
|
|
2019-01-20 05:06:05 +08:00
|
|
|
// --- Widget ---
|
2021-08-09 05:25:20 +08:00
|
|
|
Element text(std::string text);
|
|
|
|
Element vtext(std::string text);
|
2022-03-31 08:17:43 +08:00
|
|
|
Element separator();
|
2021-09-12 06:36:59 +08:00
|
|
|
Element separatorLight();
|
2023-03-16 05:50:27 +08:00
|
|
|
Element separatorDashed();
|
2021-09-12 06:36:59 +08:00
|
|
|
Element separatorHeavy();
|
|
|
|
Element separatorDouble();
|
2021-10-16 05:04:11 +08:00
|
|
|
Element separatorEmpty();
|
2021-09-12 06:36:59 +08:00
|
|
|
Element separatorStyled(BorderStyle);
|
2019-01-27 09:33:06 +08:00
|
|
|
Element separator(Pixel);
|
2021-10-16 05:04:11 +08:00
|
|
|
Element separatorCharacter(std::string);
|
2022-03-14 01:51:46 +08:00
|
|
|
Element separatorHSelector(float left,
|
|
|
|
float right,
|
2022-03-31 08:17:43 +08:00
|
|
|
Color unselected_color,
|
|
|
|
Color selected_color);
|
2022-03-14 01:51:46 +08:00
|
|
|
Element separatorVSelector(float up,
|
|
|
|
float down,
|
2022-03-31 08:17:43 +08:00
|
|
|
Color unselected_color,
|
|
|
|
Color selected_color);
|
|
|
|
Element gauge(float progress);
|
|
|
|
Element gaugeLeft(float progress);
|
|
|
|
Element gaugeRight(float progress);
|
|
|
|
Element gaugeUp(float progress);
|
|
|
|
Element gaugeDown(float progress);
|
2023-03-10 03:21:23 +08:00
|
|
|
Element gaugeDirection(float progress, Direction direction);
|
2019-01-20 05:06:05 +08:00
|
|
|
Element border(Element);
|
2021-09-12 06:36:59 +08:00
|
|
|
Element borderLight(Element);
|
2023-03-16 05:50:27 +08:00
|
|
|
Element borderDashed(Element);
|
2021-09-12 06:36:59 +08:00
|
|
|
Element borderHeavy(Element);
|
|
|
|
Element borderDouble(Element);
|
|
|
|
Element borderRounded(Element);
|
2021-10-16 05:04:11 +08:00
|
|
|
Element borderEmpty(Element);
|
2021-09-12 06:36:59 +08:00
|
|
|
Decorator borderStyled(BorderStyle);
|
2023-03-16 20:15:14 +08:00
|
|
|
Decorator borderStyled(BorderStyle, Color);
|
|
|
|
Decorator borderStyled(Color);
|
2022-03-31 08:17:43 +08:00
|
|
|
Decorator borderWith(const Pixel&);
|
2024-05-01 17:40:49 +08:00
|
|
|
Element window(Element title, Element content, BorderStyle border = ROUNDED);
|
2019-01-07 05:28:15 +08:00
|
|
|
Element spinner(int charset_index, size_t image_index);
|
2022-03-31 08:17:43 +08:00
|
|
|
Element paragraph(const std::string& text);
|
|
|
|
Element paragraphAlignLeft(const std::string& text);
|
|
|
|
Element paragraphAlignRight(const std::string& text);
|
|
|
|
Element paragraphAlignCenter(const std::string& text);
|
|
|
|
Element paragraphAlignJustify(const std::string& text);
|
2019-01-27 09:33:06 +08:00
|
|
|
Element graph(GraphFunction);
|
2021-10-16 05:04:11 +08:00
|
|
|
Element emptyElement();
|
2021-12-25 00:29:39 +08:00
|
|
|
Element canvas(ConstRef<Canvas>);
|
|
|
|
Element canvas(int width, int height, std::function<void(Canvas&)>);
|
|
|
|
Element canvas(std::function<void(Canvas&)>);
|
2018-10-10 01:06:03 +08:00
|
|
|
|
2019-01-05 09:03:49 +08:00
|
|
|
// -- Decorator ---
|
2018-10-10 01:06:03 +08:00
|
|
|
Element bold(Element);
|
|
|
|
Element dim(Element);
|
|
|
|
Element inverted(Element);
|
|
|
|
Element underlined(Element);
|
2023-01-22 18:02:27 +08:00
|
|
|
Element underlinedDouble(Element);
|
2018-10-21 20:18:11 +08:00
|
|
|
Element blink(Element);
|
2023-01-22 18:02:27 +08:00
|
|
|
Element strikethrough(Element);
|
2019-01-03 07:35:59 +08:00
|
|
|
Decorator color(Color);
|
|
|
|
Decorator bgcolor(Color);
|
2023-03-22 20:59:02 +08:00
|
|
|
Decorator color(const LinearGradient&);
|
|
|
|
Decorator bgcolor(const LinearGradient&);
|
2019-01-07 05:28:15 +08:00
|
|
|
Element color(Color, Element);
|
|
|
|
Element bgcolor(Color, Element);
|
2023-03-22 20:59:02 +08:00
|
|
|
Element color(const LinearGradient&, Element);
|
|
|
|
Element bgcolor(const LinearGradient&, Element);
|
2021-12-13 18:38:31 +08:00
|
|
|
Decorator focusPosition(int x, int y);
|
|
|
|
Decorator focusPositionRelative(float x, float y);
|
2022-03-31 08:17:43 +08:00
|
|
|
Element automerge(Element child);
|
2023-06-05 03:06:19 +08:00
|
|
|
Decorator hyperlink(std::string link);
|
|
|
|
Element hyperlink(std::string link, Element child);
|
2018-09-20 03:52:25 +08:00
|
|
|
|
2019-06-23 23:47:33 +08:00
|
|
|
// --- Layout is
|
2019-01-20 05:06:05 +08:00
|
|
|
// Horizontal, Vertical or stacked set of elements.
|
|
|
|
Element hbox(Elements);
|
2019-01-23 06:42:57 +08:00
|
|
|
Element vbox(Elements);
|
2019-01-20 05:06:05 +08:00
|
|
|
Element dbox(Elements);
|
2021-12-12 00:58:25 +08:00
|
|
|
Element flexbox(Elements, FlexboxConfig config = FlexboxConfig());
|
2021-08-23 01:36:11 +08:00
|
|
|
Element gridbox(std::vector<Elements> lines);
|
2021-12-12 00:58:25 +08:00
|
|
|
|
|
|
|
Element hflow(Elements); // Helper: default flexbox with row direction.
|
|
|
|
Element vflow(Elements); // Helper: default flexbox with column direction.
|
2019-01-20 05:06:05 +08:00
|
|
|
|
|
|
|
// -- Flexibility ---
|
|
|
|
// Define how to share the remaining space when not all of it is used inside a
|
|
|
|
// container.
|
2020-05-25 07:34:13 +08:00
|
|
|
Element flex(Element); // Expand/Minimize if possible/needed.
|
|
|
|
Element flex_grow(Element); // Expand element if possible.
|
|
|
|
Element flex_shrink(Element); // Minimize element if needed.
|
2020-07-17 06:27:39 +08:00
|
|
|
|
2020-08-16 08:24:50 +08:00
|
|
|
Element xflex(Element); // Expand/Minimize if possible/needed on X axis.
|
|
|
|
Element xflex_grow(Element); // Expand element if possible on X axis.
|
|
|
|
Element xflex_shrink(Element); // Minimize element if needed on X axis.
|
2020-07-17 06:27:39 +08:00
|
|
|
|
2020-08-16 08:24:50 +08:00
|
|
|
Element yflex(Element); // Expand/Minimize if possible/needed on Y axis.
|
|
|
|
Element yflex_grow(Element); // Expand element if possible on Y axis.
|
|
|
|
Element yflex_shrink(Element); // Minimize element if needed on Y axis.
|
2020-07-17 06:27:39 +08:00
|
|
|
|
2020-05-25 07:34:13 +08:00
|
|
|
Element notflex(Element); // Reset the flex attribute.
|
|
|
|
Element filler(); // A blank expandable element.
|
2019-01-21 06:04:10 +08:00
|
|
|
|
|
|
|
// -- Size override;
|
2023-03-10 03:21:23 +08:00
|
|
|
enum WidthOrHeight { WIDTH, HEIGHT };
|
2019-01-21 06:04:10 +08:00
|
|
|
enum Constraint { LESS_THAN, EQUAL, GREATER_THAN };
|
2023-03-10 03:21:23 +08:00
|
|
|
Decorator size(WidthOrHeight, Constraint, int value);
|
2019-01-20 05:06:05 +08:00
|
|
|
|
|
|
|
// --- Frame ---
|
|
|
|
// A frame is a scrollable area. The internal area is potentially larger than
|
|
|
|
// the external one. The internal area is scrolled in order to make visible the
|
|
|
|
// focused element.
|
|
|
|
Element frame(Element);
|
2020-06-07 21:54:45 +08:00
|
|
|
Element xframe(Element);
|
|
|
|
Element yframe(Element);
|
2019-01-20 05:06:05 +08:00
|
|
|
Element focus(Element);
|
|
|
|
Element select(Element);
|
|
|
|
|
2022-11-11 21:09:53 +08:00
|
|
|
// --- Cursor ---
|
|
|
|
// Those are similar to `focus`, but also change the shape of the cursor.
|
|
|
|
Element focusCursorBlock(Element);
|
|
|
|
Element focusCursorBlockBlinking(Element);
|
|
|
|
Element focusCursorBar(Element);
|
|
|
|
Element focusCursorBarBlinking(Element);
|
|
|
|
Element focusCursorUnderline(Element);
|
|
|
|
Element focusCursorUnderlineBlinking(Element);
|
|
|
|
|
|
|
|
// --- Misc ---
|
2021-09-26 21:19:17 +08:00
|
|
|
Element vscroll_indicator(Element);
|
2023-09-27 05:08:42 +08:00
|
|
|
Element hscroll_indicator(Element);
|
2022-11-11 21:09:53 +08:00
|
|
|
Decorator reflect(Box& box);
|
|
|
|
// Before drawing the |element| clear the pixel below. This is useful in
|
|
|
|
// combinaison with dbox.
|
|
|
|
Element clear_under(Element element);
|
2021-09-26 21:19:17 +08:00
|
|
|
|
2019-01-20 05:06:05 +08:00
|
|
|
// --- Util --------------------------------------------------------------------
|
2018-09-22 15:49:43 +08:00
|
|
|
Element hcenter(Element);
|
|
|
|
Element vcenter(Element);
|
|
|
|
Element center(Element);
|
2019-01-07 01:53:02 +08:00
|
|
|
Element align_right(Element);
|
2018-10-21 20:18:11 +08:00
|
|
|
Element nothing(Element element);
|
|
|
|
|
2021-08-03 05:19:29 +08:00
|
|
|
namespace Dimension {
|
|
|
|
Dimensions Fit(Element&);
|
|
|
|
} // namespace Dimension
|
|
|
|
|
2020-02-12 04:44:55 +08:00
|
|
|
} // namespace ftxui
|
2018-09-18 14:48:40 +08:00
|
|
|
|
2021-07-10 20:23:46 +08:00
|
|
|
// Make container able to take any number of children as input.
|
|
|
|
#include "ftxui/dom/take_any_args.hpp"
|
|
|
|
|
2021-08-09 05:25:20 +08:00
|
|
|
// Include old definitions using wstring.
|
|
|
|
#include "ftxui/dom/deprecated.hpp"
|
2022-03-31 08:17:43 +08:00
|
|
|
#endif // FTXUI_DOM_ELEMENTS_HPP
|