Add dom::blink and component::Input

This commit is contained in:
Arthur Sonzogni 2018-10-21 14:18:11 +02:00
parent 50a732c651
commit 20eaeae4c3
11 changed files with 96 additions and 31 deletions

View File

@ -17,6 +17,10 @@ class MyComponent : ComponentVertical {
input_1(delegate->NewChild()), input_1(delegate->NewChild()),
input_2(delegate->NewChild()), input_2(delegate->NewChild()),
input_3(delegate->NewChild()) { input_3(delegate->NewChild()) {
input_1.placeholder = L"input1";
input_2.placeholder = L"input2";
input_3.placeholder = L"input3";
Focus(&input_1); Focus(&input_1);
} }

View File

@ -9,6 +9,7 @@ add_library(ftxui
src/ftxui/component/input.cpp src/ftxui/component/input.cpp
src/ftxui/component/menu.cpp src/ftxui/component/menu.cpp
src/ftxui/component/toggle.cpp src/ftxui/component/toggle.cpp
src/ftxui/dom/blink.cpp
src/ftxui/dom/bold.cpp src/ftxui/dom/bold.cpp
src/ftxui/dom/color.cpp src/ftxui/dom/color.cpp
src/ftxui/dom/composite_decorator.cpp src/ftxui/dom/composite_decorator.cpp
@ -23,6 +24,7 @@ add_library(ftxui
src/ftxui/dom/separator.cpp src/ftxui/dom/separator.cpp
src/ftxui/dom/text.cpp src/ftxui/dom/text.cpp
src/ftxui/dom/underlined.cpp src/ftxui/dom/underlined.cpp
src/ftxui/dom/util.cpp
src/ftxui/dom/vbox.cpp src/ftxui/dom/vbox.cpp
src/ftxui/event.cpp src/ftxui/event.cpp
src/ftxui/screen.cpp src/ftxui/screen.cpp

View File

@ -28,4 +28,4 @@
* mouse * mouse
* terminal event * terminal event
You can make implement your own. Implement your own!

View File

@ -14,8 +14,8 @@ class Input : public Component {
~Input() override; ~Input() override;
// State. // State.
std::wstring content = L"input"; std::wstring content;
std::wstring placeholder = L"placeholder"; std::wstring placeholder;
// State update callback. // State update callback.
std::function<void()> on_change = [](){}; std::function<void()> on_change = [](){};

View File

@ -28,6 +28,7 @@ Element bold(Element);
Element dim(Element); Element dim(Element);
Element inverted(Element); Element inverted(Element);
Element underlined(Element); Element underlined(Element);
Element blink(Element);
Element color(Color, Element); Element color(Color, Element);
Element bgcolor(Color, Element); Element bgcolor(Color, Element);
@ -37,6 +38,9 @@ Element vcenter(Element);
Element center(Element); Element center(Element);
Element flex(Element); Element flex(Element);
// --- Util ---
Element nothing(Element element);
template <class... Args> template <class... Args>
Children unpack(Args... args) { Children unpack(Args... args) {
Children vec; Children vec;

View File

@ -9,7 +9,7 @@ namespace ftxui {
struct Event{ struct Event{
public: public:
// --- Character --- // --- Character ---
static Event Character(char); static Event Character(int);
// --- Arrow --- // --- Arrow ---
static Event ArrowLeft; static Event ArrowLeft;
@ -27,7 +27,7 @@ struct Event{
bool operator==(const Event& other) { return values == other.values; } bool operator==(const Event& other) { return values == other.values; }
// Internal representation. // Internal representation.
std::array<char, 5> values = {0, 0, 0, 0, 0}; std::array<int, 5> values = {0, 0, 0, 0, 0};
}; };

View File

@ -14,10 +14,11 @@ namespace dom {
struct Pixel { struct Pixel {
wchar_t character = U' '; wchar_t character = U' ';
bool blink = false;
bool bold = false; bool bold = false;
bool dim = false;
bool inverted = false; bool inverted = false;
bool underlined = false; bool underlined = false;
bool dim = false;
Color background_color = Color::Default; Color background_color = Color::Default;
Color foreground_color = Color::Default; Color foreground_color = Color::Default;
}; };

View File

@ -9,36 +9,69 @@ Input::~Input() {}
// Component implementation. // Component implementation.
dom::Element Input::Render() { dom::Element Input::Render() {
bool is_place_ho
std::wstring& displayed_text = content.size() ? content : placeholder;
using namespace dom; using namespace dom;
if (Focused()) bool is_focused = Focused();
return flex(inverted(text(displayed_text)));
// Placeholder.
if (content.size() == 0) {
if (is_focused)
return flex(inverted(dim(text(placeholder))));
else else
return flex(text(displayed_text)); return flex(dim(text(placeholder)));
}
// Not focused.
if (!is_focused)
return flex(text(content));
std::wstring part_before_cursor = content.substr(0,cursor_position);
std::wstring part_at_cursor = cursor_position < (int)content.size()
? content.substr(cursor_position, 1)
: L" ";
std::wstring part_after_cursor = cursor_position < (int)content.size() - 1
? content.substr(cursor_position + 1)
: L"";
return flex(inverted(hbox( //
text(part_before_cursor), //
underlined(text(part_at_cursor)), //
text(part_after_cursor) //
))); //
} }
bool Input::OnEvent(Event event) { bool Input::OnEvent(Event event) {
std::wstring c; std::wstring c;
// Backspace // Backspace.
if (event == Event::Backspace) { if (event == Event::Backspace) {
if (content.size() != 0) if (cursor_position == 0)
content = content.substr(0, content.size()-1); return false;
content.erase(cursor_position - 1, 1);
cursor_position--;
return true; return true;
} }
// Enter // Enter.
if (event == Event::Return) { if (event == Event::Return) {
return true; return true;
} }
constexpr char ESC = char(27); if (event == Event::ArrowLeft && cursor_position > 0) {
if (event.values[0] != ESC) { cursor_position--;
content += event.values[0];
return true; return true;
} }
if (event == Event::ArrowRight && cursor_position < (int)content.size()) {
cursor_position++;
return true;
}
// Content
constexpr char ESC = char(27);
if (event.values[0] != ESC) {
wchar_t v = (char)event.values[0];
content.insert(cursor_position, 1, v);
cursor_position++;
return true;
}
return false; return false;
} }

View File

@ -2,10 +2,10 @@
namespace ftxui { namespace ftxui {
constexpr char ESC = char(27); constexpr int ESC = int(27);
// --- Character --- // --- Character ---
Event Event::Character(char c) { Event Event::Character(int c) {
return Event{c}; return Event{c};
} }
@ -16,10 +16,10 @@ Event Event::ArrowUp{ESC, '[', 'A'};
Event Event::ArrowDown{ESC, '[', 'B'}; Event Event::ArrowDown{ESC, '[', 'B'};
// --- Other --- // --- Other ---
Event Event::Backspace{char(127)}; Event Event::Backspace{127};
Event Event::Delete{ESC, '[', '3', '~'}; Event Event::Delete{ESC, '[', '3', '~'};
Event Event::Escape{ESC}; Event Event::Escape{ESC};
Event Event::Return{char(10)}; Event Event::Return{10};
Event Event::F1{ESC, '[', 'O', 'P'}; Event Event::F1{ESC, '[', 'O', 'P'};
Event Event::F2{ESC, '[', 'O', 'Q'}; Event Event::F2{ESC, '[', 'O', 'Q'};

View File

@ -45,6 +45,13 @@ std::string Screen::ToString() {
ss << L"\e[22m"; ss << L"\e[22m";
} }
} }
if (pixels_[y][x].blink != previous_pixel.blink) {
if (pixels_[y][x].blink) {
ss << L"\e[5m";
} else {
ss << L"\e[25m";
}
}
if (pixels_[y][x].foreground_color != previous_pixel.foreground_color) { if (pixels_[y][x].foreground_color != previous_pixel.foreground_color) {
ss << L"\e[" + to_wstring(std::to_string( ss << L"\e[" + to_wstring(std::to_string(
(uint8_t)pixels_[y][x].foreground_color)) + (uint8_t)pixels_[y][x].foreground_color)) +

View File

@ -9,16 +9,30 @@
namespace ftxui { namespace ftxui {
namespace { namespace {
constexpr char ESC = char(27); constexpr int ESC = 27;
constexpr int WAT = 195;
constexpr int WATWAIT = 91;
Event GetEvent() { Event GetEvent() {
char v1 = char(getchar()); int v1 = getchar();
if (v1 != ESC) if (v1 == ESC) {
return Event{v1}; int v2 = getchar();
int v3 = getchar();
char v2 = char(getchar()); //if (v2 == WATWAIT) {
char v3 = char(getchar()); //int v4 = getchar();
return Event{v1,v2,v3}; //int v5 = getchar();
//return Event{v1, v2, v3, v4, v5};
//}
return Event{v1, v2, v3};
}
if (v1 == WAT) {
int v2 = getchar();
return Event{v1, v2};
}
return Event{v1};
}; };
}; };