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>
before this change, the example in the doxygen document for CatchEvent()
does not use the documented function. hence the example is not that
useful for developers interested in a typical usage of this function.
after this change, the example is improved to added the call to
CatchEvent(), which allows the application to the Loop() function at
user input.
Signed-off-by: Kefu Chai <tchaikov@gmail.com>
- Provide better defaults for ComponentBase `Focusable()` and
`ActiveChild()` methods. This resolves:
https://github.com/ArthurSonzogni/FTXUI/issues/335
- Implement `Container::Tab` 's `Focusable()` methods. This prevents
the users to navigate into a tab with no interactivity.
- Add support for SIGTSTP:
https://github.com/ArthurSonzogni/FTXUI/issues/330
This
- Add support for task posting.
This allows folks to defer function execution, and execute it directly
below the main loop. The task are executed in a FIFO order.
fix: https://github.com/ArthurSonzogni/FTXUI/issues/296#issue-1092343846
When the list in Radiobox/Menu/Toggle is resized, clamp the |selected_| values so that it stays within bounds.
Clamping is executed in Render() and in OnEvent()
Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
Use std::string by default for the implementation of FTXUI's input
component.
Along the way:
- Give a correct implementation for fullwidth characters.
- Add tests
- Modify the way the cursor is drawn.
This implement the flexbox elements, following the HTML one.
Built from them, there is also the following elements:
- `paragraph`
- `paragraphAlignLeft`
- `paragraphAlignRight`
- `paragraphAlignCenter`
- `paragraphAlignJustify`
This is a breaking change.
Dom
- `vscroll_indicator`. Show a scrollback indicator on the right.
Component
- `Maybe`: Display an component conditionnally based on a boolean.
- `Dropdown`: A dropdown select list.
This address:
https://github.com/ArthurSonzogni/FTXUI/issues/204
- Password is now taking a ref, allowing a shared state to be used by
multiple passwords.
- Password cursor position is now optional. It will be used only when
set to something different from -1.
In the past, FTXUI switched from std::string to std::wstring to support
fullwidth characters. The reasons was that fullwidth characters can be
stored inside a single wchar_t.
Then FTXUI added support for combining characters. A single glygh
doesn't even fit a wchar_t. Instead, a glyph can be arbitrary large.
The usage of wstring doesn't really fit the new model and have several
drawbacks:
1. It doesn't simplify the implementation of FTXUI, because of combining
characters.
2. It reduces drawing performance by 2x.
3. It increase Screen's memory allocation by 2x.
This patch converts FTXUI to use std::string internally. It now exposes
std::string based API. The std::wstring API remains, but is now
deprecated.
Tests and examples haven't been update to show the breakage is limited.
They will be updated in a second set of patches.
Bug: https://github.com/ArthurSonzogni/FTXUI/issues/153
Co-authored-by: Tushar Maheshwari <tushar27192@gmail.com>
- Invoke DetachAllChildren from ~ComponentBase
- Define Focused using Active
- Compact TakeFocus loop code
- const-correctness for Parent, Active and Focused
* Reorganize ContainerBase
- Reduce Container overloads using default arguments
- Extract member function pointers to virtual functions
- Separate classes for Vertical, Horizontal and Tab containers
* Collect unpack from NodeDecorator subclasses
* Reduce redundant expansion for aliases
From CppCoreGuidelines:
Rule of Zero: C.20: If you can avoid defining default operations, do.
C.52: Use inheriting constructors to import constructors into a derived class that does not need further explicit initialization.
DRY forward and using declarations.
Miscellaneous:
Fix format.sh to output examples with normalised paths in sorted order.
Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
Allows components to remove a child or access to children in general.
Co-authored-by: Felix Heitmann <fheitmann@se-gpu-03.intern.plath.de>
Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
I finally got access to a computer using the Microsoft's Windows OS.
That's the opportunity to find and mitigate all the problems
encountered. This patch:
1. Introduce an option and a C++ definition to enable fallback for
Microsoft's terminal emulators. This allows me to see/test the
Microsoft output from Linux. This also allows Windows users to remove
the fallback and target non Microsoft terminals on Windows if needed.
2. Microsoft's terminal suffer from a race condition bug when reporting
the cursor position:
https://github.com/microsoft/terminal/pull/7583.
The mitigation is not to ask for the cursor position in fullscreen
mode where it isn't really needed and request it less often.
This fixes: https://github.com/ArthurSonzogni/FTXUI/issues/136
3. Microsoft's terminal do not handle properly hidding the cursor. Instead
the character under the cursor is hidden, which is a big problem. As
a result, we don't enable setting the cursor to the best position for
[input method editors](https://en.wikipedia.org/wiki/Input_method),
It will be displayed at the bottom right corner.
See:
- https://github.com/microsoft/terminal/issues/1203
- https://github.com/microsoft/terminal/issues/3093
4. Microsoft's terminals do not provide a way to query if they support
colors. As a fallback, assume true colors is supported.
See issue:
- https://github.com/microsoft/terminal/issues/1040
This mitigates:
- https://github.com/ArthurSonzogni/FTXUI/issues/135
5. The "cmd" on Windows do not properly report its dimension. Powershell
works correctly. As a fallback, use a 80x80 size instead of 0x0.
6. There are several dom elements and component displayed incorrectly,
because the font used is missing several unicode glyph. Use
alternatives or less detailled one as a fallback.
Allow Container::Vertical and Container::Horizontal to have an
external selector, similar to Container::Tab.
This is useful for implementing a menu of menu.
Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
When switching from raw pointers toward shared_ptr, the destructor
wasn't updated correctly.
This patch:
- Fixes the issue.
- Add two regression tests.
- Use address sanitizer for the tests.
This fixes: https://github.com/ArthurSonzogni/FTXUI/issues/115
Make sure code points parsed are always valid UTF8. Don't assume stdin
is filled with valid data. Check for overlong UTF8 and add some tests.
The fuzzer has reached the following coverage:
- cov : 204
- ft : 754
- corp : 62/12257b
- lim : 2798
- exec/s : 1748
- rss : 445Mb
- L : 155/1946
- MS : 3
Fixed:https://github.com/ArthurSonzogni/FTXUI/issues/118
Current state: the fuzzer find interesting input immediately...
```
terminate called after throwing an instance of 'std::range_error'
what(): wstring_convert::from_bytes
```
See: https://github.com/ArthurSonzogni/FTXUI/issues/118
There was some undefined behavior to be fixed in the terminal input
parser.
The behavior of flush seems to have change. The fix was to invert '\0'
and std::flush.
The ESC key generates sequences that are prefix of others. For instance:
- ESC => [27]
- F1 => [27, 79, 8]
As a result, we can't generate the ESC event when receiving [27],
because it might be the start of the [27, 79, 8] sequence (or not).
Application usually applies a timeout to help detecting the ESC key.
This patch introduce a timeout. It is set to 50ms.
Bug: https://github.com/ArthurSonzogni/FTXUI/issues/55
This allows developers to set child children component must be the
currently active/focused one.
This can be used to "control" where the focus is, without user
interactions.
This was an old features, but it has been removed mistakenly when
merging some patches.
This allow the terminal to be restored when the user kill the
application.
Previously, the thread pooling new characters being typed was waiting
for "one more char" being typed before being able to exit.
This patch adds a timeout for getchar(). This way, event if the user do
not press his/her keyboard, the program is still able to exit.
This fixes issue:
https://github.com/GiuseppeCesarano/just-fast/issues/2
This fix the bug from:
https://github.com/ArthurSonzogni/FTXUI/pull/11
About:
~~~
Bug: Focus handling not working
in the examples (e.g. checkbox.cpp) I can toggle the individual
checkboxes but I cannot move between items, I tried to understand the
focus implementation but am I unsure which keypresses would move focus
between different components
~~~
It allow you to create the two end of a pipe: A producer and consumer.
The producer can be moved into another thread.
Several producer can be created if necessary.
This will ease merging:
https://github.com/ArthurSonzogni/FTXUI/pull/11