mirror of
				https://github.com/ArthurSonzogni/FTXUI.git
				synced 2025-10-31 18:48:11 +08:00 
			
		
		
		
	Component decorators (#354)
Add decorator variants for decorator components Add the "pipe" operator for components, similar to what was done for Elements. We are able to put something like: ``` Button(...) | Maybe(&show_button) ``` Add decorators for: - `Maybe` - `CatchEvent` - `Renderer` Signed-off-by: Kefu Chai <tchaikov@gmail.com> Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
This commit is contained in:
		| @@ -4,6 +4,7 @@ | ||||
| #include <functional>  // for function | ||||
| #include <memory>      // for make_shared, shared_ptr | ||||
| #include <string>      // for wstring | ||||
| #include <utility>     // for forward | ||||
| #include <vector>      // for vector | ||||
|  | ||||
| #include "ftxui/component/component_base.hpp"     // for Component, Components | ||||
| @@ -26,6 +27,14 @@ std::shared_ptr<T> Make(Args&&... args) { | ||||
|   return std::make_shared<T>(std::forward<Args>(args)...); | ||||
| } | ||||
|  | ||||
| // Pipe operator to decorate components. | ||||
| using ComponentDecorator = std::function<Component(Component)>; | ||||
| using ElementDecorator = std::function<Element(Element)>; | ||||
| Component operator|(Component component, ComponentDecorator decorator); | ||||
| Component operator|(Component component, ElementDecorator decorator); | ||||
| Component& operator|=(Component& component, ComponentDecorator decorator); | ||||
| Component& operator|=(Component& component, ElementDecorator decorator); | ||||
|  | ||||
| namespace Container { | ||||
| Component Vertical(Components children); | ||||
| Component Vertical(Components children, int* selector); | ||||
| @@ -38,38 +47,55 @@ Component Tab(Components children, int* selector); | ||||
| Component Button(ConstStringRef label, | ||||
|                  std::function<void()> on_click, | ||||
|                  Ref<ButtonOption> = {}); | ||||
|  | ||||
| Component Checkbox(ConstStringRef label, | ||||
|                    bool* checked, | ||||
|                    Ref<CheckboxOption> option = {}); | ||||
|  | ||||
| Component Input(StringRef content, | ||||
|                 ConstStringRef placeholder, | ||||
|                 Ref<InputOption> option = {}); | ||||
|  | ||||
| Component Menu(ConstStringListRef entries, | ||||
|                int* selected_, | ||||
|                Ref<MenuOption> = {}); | ||||
|  | ||||
| Component MenuEntry(ConstStringRef label, Ref<MenuEntryOption> = {}); | ||||
|  | ||||
| Component Dropdown(ConstStringListRef entries, int* selected); | ||||
|  | ||||
| Component Radiobox(ConstStringListRef entries, | ||||
|                    int* selected_, | ||||
|                    Ref<RadioboxOption> option = {}); | ||||
|  | ||||
| Component Toggle(ConstStringListRef entries, | ||||
|                  int* selected, | ||||
|                  Ref<ToggleOption> option = {}); | ||||
|  | ||||
| template <class T>  // T = {int, float, long} | ||||
| Component Slider(ConstStringRef label, T* value, T min, T max, T increment); | ||||
|  | ||||
| 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); | ||||
|  | ||||
| Component Renderer(Component child, std::function<Element()>); | ||||
| Component Renderer(std::function<Element()>); | ||||
| Component Renderer(std::function<Element(bool /* focused */)>); | ||||
| ComponentDecorator Renderer(ElementDecorator); | ||||
|  | ||||
| Component CatchEvent(Component child, std::function<bool(Event)>); | ||||
| ComponentDecorator CatchEvent(std::function<bool(Event)> on_event); | ||||
|  | ||||
| Component Maybe(Component, const bool* show); | ||||
| Component Maybe(Component, std::function<bool()>); | ||||
| ComponentDecorator Maybe(const bool* show); | ||||
| ComponentDecorator Maybe(std::function<bool()>); | ||||
|  | ||||
| Component Collapsible(ConstStringRef label, | ||||
|                       Component child, | ||||
|                       Ref<bool> show = false); | ||||
|  | ||||
| }  // namespace ftxui | ||||
|  | ||||
| // Include component using the old deprecated wstring. | ||||
|   | ||||
| @@ -5,9 +5,10 @@ | ||||
|  | ||||
| namespace ftxui { | ||||
|  | ||||
| Component Input(WideStringRef content, | ||||
|                 ConstStringRef placeholder, | ||||
|                 Ref<InputOption> option = {}); | ||||
| [[deprecated("use Input with normal std::string instead.")]] Component Input( | ||||
|     WideStringRef content, | ||||
|     ConstStringRef placeholder, | ||||
|     Ref<InputOption> option = {}); | ||||
| }  // namespace ftxui | ||||
|  | ||||
| #endif /* FTXUI_COMPONENT_DEPRECATED_HPP */ | ||||
|   | ||||
| @@ -28,6 +28,7 @@ enum class GaugeDirection { Left, Up, Right, Down }; | ||||
| // -> text("ftxui") | bold | underlined | ||||
| // -> underlined(bold(text("FTXUI"))) | ||||
| Element operator|(Element, Decorator); | ||||
| Element& operator|=(Element&, Decorator); | ||||
| Elements operator|(Elements, Decorator); | ||||
| Decorator operator|(Decorator, Decorator); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Kefu Chai
					Kefu Chai