diff --git a/examples/component/CMakeLists.txt b/examples/component/CMakeLists.txt index 5d80fd8..fadf647 100644 --- a/examples/component/CMakeLists.txt +++ b/examples/component/CMakeLists.txt @@ -38,6 +38,7 @@ example(radiobox) example(radiobox_in_frame) example(renderer) example(resizable_split) +example(selectable_input) example(slider) example(slider_direction) example(slider_rgb) diff --git a/examples/component/input.cpp b/examples/component/input.cpp index a4c31ec..9768359 100644 --- a/examples/component/input.cpp +++ b/examples/component/input.cpp @@ -12,7 +12,6 @@ #include "ftxui/dom/elements.hpp" // for text, hbox, separator, Element, operator|, vbox, border #include "ftxui/util/ref.hpp" // for Ref - int main() { using namespace ftxui; @@ -21,10 +20,6 @@ int main() { std::string last_name; std::string password; std::string phoneNumber; - Region selection; - std::string textToCopy; - - auto screen = ScreenInteractive::TerminalOutput(); // The basic input components: Component input_first_name = Input(&first_name, "first name"); @@ -64,22 +59,10 @@ int main() { text("Hello " + first_name + " " + last_name), text("Your password is " + password), text("Your phone number is " + phoneNumber), - text("select_start " + std::to_string(selection.startx) + ";" + std::to_string(selection.starty)), - text("select_end " + std::to_string(selection.endx) + ";" + std::to_string(selection.endy)), - text("textToCopy " + textToCopy) }) | - border | selectable([&textToCopy](std::string txtSelected){textToCopy = txtSelected;}); - }); - - // TODO: Implement the double click on word to select the word - // TODO: Implement the double click and drag to select word by word (optional) - // TODO: Implement the tripple click to select an entire line - // TODO: Add a "selectable" flag in the pixel class and take it into account when selecting things - - renderer |= CatchEvent([&](Event event) { - - return selectableCatchEvent(event); + border; }); + auto screen = ScreenInteractive::TerminalOutput(); screen.Loop(renderer); } diff --git a/examples/component/selectable_input.cpp b/examples/component/selectable_input.cpp new file mode 100644 index 0000000..a4c31ec --- /dev/null +++ b/examples/component/selectable_input.cpp @@ -0,0 +1,85 @@ +// 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. +#include // for allocator, __shared_ptr_access +#include // for char_traits, operator+, string, basic_string + +#include "ftxui/component/captured_mouse.hpp" // for ftxui +#include "ftxui/component/component.hpp" // for Input, Renderer, Vertical +#include "ftxui/component/component_base.hpp" // for ComponentBase +#include "ftxui/component/component_options.hpp" // for InputOption +#include "ftxui/component/screen_interactive.hpp" // for Component, ScreenInteractive +#include "ftxui/dom/elements.hpp" // for text, hbox, separator, Element, operator|, vbox, border +#include "ftxui/util/ref.hpp" // for Ref + + +int main() { + using namespace ftxui; + + // The data: + std::string first_name; + std::string last_name; + std::string password; + std::string phoneNumber; + Region selection; + std::string textToCopy; + + auto screen = ScreenInteractive::TerminalOutput(); + + // The basic input components: + Component input_first_name = Input(&first_name, "first name"); + Component input_last_name = Input(&last_name, "last name"); + + // The password input component: + InputOption password_option; + password_option.password = true; + Component input_password = Input(&password, "password", password_option); + + // The phone number input component: + // We are using `CatchEvent` to filter out non-digit characters. + Component input_phone_number = Input(&phoneNumber, "phone number"); + input_phone_number |= CatchEvent([&](Event event) { + return event.is_character() && !std::isdigit(event.character()[0]); + }); + input_phone_number |= CatchEvent([&](Event event) { + return event.is_character() && phoneNumber.size() > 10; + }); + + // The component tree: + auto component = Container::Vertical({ + input_first_name, + input_last_name, + input_password, + input_phone_number, + }); + + // Tweak how the component tree is rendered: + auto renderer = Renderer(component, [&] { + return vbox({ + hbox(text(" First name : "), input_first_name->Render()), + hbox(text(" Last name : "), input_last_name->Render()), + hbox(text(" Password : "), input_password->Render()), + hbox(text(" Phone num : "), input_phone_number->Render()), + separator(), + text("Hello " + first_name + " " + last_name), + text("Your password is " + password), + text("Your phone number is " + phoneNumber), + text("select_start " + std::to_string(selection.startx) + ";" + std::to_string(selection.starty)), + text("select_end " + std::to_string(selection.endx) + ";" + std::to_string(selection.endy)), + text("textToCopy " + textToCopy) + }) | + border | selectable([&textToCopy](std::string txtSelected){textToCopy = txtSelected;}); + }); + + // TODO: Implement the double click on word to select the word + // TODO: Implement the double click and drag to select word by word (optional) + // TODO: Implement the tripple click to select an entire line + // TODO: Add a "selectable" flag in the pixel class and take it into account when selecting things + + renderer |= CatchEvent([&](Event event) { + + return selectableCatchEvent(event); + }); + + screen.Loop(renderer); +}