diff --git a/README.md b/README.md new file mode 100644 index 0000000..79bd16a --- /dev/null +++ b/README.md @@ -0,0 +1,92 @@ +# FTXUI Template + +![Static Badge](https://img.shields.io/badge/builds_on-Linux-brightgreen) +![Static Badge](https://img.shields.io/badge/builds_on-Windows-brightgreen) + +Template example using the [FTXUI](https://github.com/ArthurSonzogni/FTXUI) library with a proper logger, thread-safe event handler and multiple pages paradigm. This template can be used in any project and is a good way to start a project using a simple and not-so-verbose approach. + +## Build the project + +You can simply use CMake with the following commands: + +```bash +mkdir build && cd build +cmake .. +cmake --build . --parallel +``` + +## Using the Interface + +### Event + +Main thread-safe event handler. You can set a custom function in it that will be called once the +loop is starting. It is recommended to run the eventhandler in a separated thread. + +Each event that is added or handled is thread safe. + +_main.cpp_ +```cpp + +static inline void loop_event(EventHandler &handler, const EventPayload &payload) +{ + // Called each time there is a new event in the event buffer... +} + +int main(void) +{ + // Basic usage + EventHandler handler; + handler.set_handler(loop_event); + Page1 page1(handler); + // Starting the event loop in a separated thread. + std::thread t_event(&EventHandler::loop, &handler); + t_event.join(); + return 0; +} +``` + +_page1.cpp_ +```cpp +void Page1::change_screen() +{ + this->send_event(EventType::SWITCH_SCREEN, static_cast(1)); +} +``` + +### Logger + +_'Logger'_ is a general Logger that can be instanciated anywhere as a singleton. It can have a maximum size for its buffer that can be changed on the go.Each LoggerType can be gathered from each data which can lead to multiple ways to print out a log. + +```cpp +Logger& logger = Logger::GetInstance(); +logger.push_back("Hello, world!", LoggerType::PRINT); +// std::vector& buffer = logger.get_buffer(); +``` + +### UserInterface + +_'UserInterface'_ is the main object that can be instanciated anywhere as a singleton you can add any pages to it and cycle through them using the select_screen function. + +```cpp +UserInterface &ui = UserInterface::GetInstance(); + +int main(void) +{ + // Event declaration + EventHandler handler; + + // Page declaration + PageX pagex(handler); + // other pages... + + ui.add_screen(&pagex); + // other pages... + + ui.start(); + return 0; +} +``` + +## Creating a new page + +To create a new page, just create a parent class from `Page` and create a `ftxui::Component` named `_page` in the constructor. You can follow the examples given in the [pages folder](src/pages). \ No newline at end of file