mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2025-09-28 17:58:07 +08:00
Add Event.
This commit is contained in:
@@ -17,7 +17,7 @@ dom::Element Component::Render() {
|
||||
return text(L"Not implemented component");
|
||||
}
|
||||
|
||||
bool Component::Event(int key) {
|
||||
bool Component::OnEvent(Event event) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@@ -6,17 +6,17 @@ namespace component {
|
||||
ComponentDirection::ComponentDirection(Delegate* delegate)
|
||||
: Component(delegate), active_child_(nullptr) {}
|
||||
|
||||
bool ComponentDirection::Event(int key) {
|
||||
bool ComponentDirection::OnEvent(Event event) {
|
||||
if (!Focused())
|
||||
return false;
|
||||
|
||||
if (!active_child_)
|
||||
return false;
|
||||
|
||||
if (active_child_->Event(key))
|
||||
if (active_child_->OnEvent(event))
|
||||
return true;
|
||||
|
||||
return HandleDirection(key);
|
||||
return HandleDirection(event);
|
||||
}
|
||||
|
||||
Component* ComponentDirection::GetActiveChild() {
|
||||
|
@@ -6,9 +6,9 @@ namespace component {
|
||||
ComponentHorizontal::ComponentHorizontal(Delegate* delegate)
|
||||
: ComponentDirection(delegate) {}
|
||||
|
||||
bool ComponentHorizontal::HandleDirection(int key) {
|
||||
bool ComponentHorizontal::HandleDirection(Event event) {
|
||||
// Left pressed ?
|
||||
if (key == 68 || key == 'h') {
|
||||
if (event == Event::ArrowLeft || event == Event::Character('h')) {
|
||||
Component* previous_sibling = active_child_->PreviousSibling();
|
||||
if (previous_sibling) {
|
||||
active_child_ = previous_sibling;
|
||||
@@ -17,7 +17,7 @@ bool ComponentHorizontal::HandleDirection(int key) {
|
||||
}
|
||||
|
||||
// Left pressed ?
|
||||
if (key == 67 || key == 'l') {
|
||||
if (event == Event::ArrowRight || event == Event::Character('l')) {
|
||||
Component* next_sibling = active_child_->NextSibling();
|
||||
if (next_sibling) {
|
||||
active_child_ = next_sibling;
|
||||
|
@@ -6,9 +6,9 @@ namespace component {
|
||||
ComponentVertical::ComponentVertical(Delegate* delegate)
|
||||
: ComponentDirection(delegate) {}
|
||||
|
||||
bool ComponentVertical::HandleDirection(int key) {
|
||||
bool ComponentVertical::HandleDirection(Event event) {
|
||||
// Up pressed ?
|
||||
if (key == 65 || key == 'k') {
|
||||
if (event == Event::ArrowUp || event == Event::Character('k')) {
|
||||
Component* previous_sibling = active_child_->PreviousSibling();
|
||||
if (previous_sibling) {
|
||||
active_child_ = previous_sibling;
|
||||
@@ -17,7 +17,7 @@ bool ComponentVertical::HandleDirection(int key) {
|
||||
}
|
||||
|
||||
// Down pressed ?
|
||||
if (key == 66 || key == 'j') {
|
||||
if (event == Event::ArrowDown || event == Event::Character('j')) {
|
||||
Component* next_sibling = active_child_->NextSibling();
|
||||
if (next_sibling) {
|
||||
active_child_ = next_sibling;
|
||||
|
46
ftxui/src/ftxui/component/input.cpp
Normal file
46
ftxui/src/ftxui/component/input.cpp
Normal file
@@ -0,0 +1,46 @@
|
||||
#include "ftxui/component/input.hpp"
|
||||
#include "ftxui/util/string.hpp"
|
||||
|
||||
namespace ftxui {
|
||||
namespace component {
|
||||
|
||||
Input::Input(Delegate* delegate): Component(delegate) {}
|
||||
Input::~Input() {}
|
||||
|
||||
// Component implementation.
|
||||
dom::Element Input::Render() {
|
||||
bool is_place_ho
|
||||
std::wstring& displayed_text = content.size() ? content : placeholder;
|
||||
|
||||
using namespace dom;
|
||||
if (Focused())
|
||||
return flex(inverted(text(displayed_text)));
|
||||
else
|
||||
return flex(text(displayed_text));
|
||||
}
|
||||
bool Input::OnEvent(Event event) {
|
||||
std::wstring c;
|
||||
|
||||
// Backspace
|
||||
if (event == Event::Backspace) {
|
||||
if (content.size() != 0)
|
||||
content = content.substr(0, content.size()-1);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Enter
|
||||
if (event == Event::Return) {
|
||||
return true;
|
||||
}
|
||||
|
||||
constexpr char ESC = char(27);
|
||||
if (event.values[0] != ESC) {
|
||||
content += event.values[0];
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
} // namespace component
|
||||
} // namespace ftxui
|
@@ -1,5 +1,6 @@
|
||||
#include "ftxui/component/menu.hpp"
|
||||
#include <algorithm>
|
||||
#include <iostream>
|
||||
|
||||
namespace ftxui {
|
||||
namespace component {
|
||||
@@ -24,14 +25,14 @@ dom::Element Menu::Render() {
|
||||
return vbox(std::move(elements));
|
||||
}
|
||||
|
||||
bool Menu::Event(int key) {
|
||||
bool Menu::OnEvent(Event event) {
|
||||
if (!Focused())
|
||||
return false;
|
||||
|
||||
int new_selected = selected;
|
||||
if (key == 65 || key == 'k')
|
||||
if (event == Event::ArrowUp || event == Event::Character('k'))
|
||||
new_selected--;
|
||||
if (key == 66 || key == 'j')
|
||||
if (event == Event::ArrowDown || event == Event::Character('j'))
|
||||
new_selected++;
|
||||
new_selected = std::max(0, std::min(int(entries.size())-1, new_selected));
|
||||
|
||||
@@ -41,7 +42,7 @@ bool Menu::Event(int key) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (key == 10) {
|
||||
if (event == Event::Return) {
|
||||
on_enter();
|
||||
return true;
|
||||
}
|
||||
|
@@ -24,16 +24,15 @@ dom::Element Toggle::Render() {
|
||||
return hbox(std::move(children));
|
||||
}
|
||||
|
||||
bool Toggle::Event(int key) {
|
||||
|
||||
bool Toggle::OnEvent(Event event) {
|
||||
if (activated) {
|
||||
if (key == 67 || key == 'l') {
|
||||
if (event == Event::ArrowRight || event == Event::Character('l')) {
|
||||
activated = false;
|
||||
on_change();
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
if (key == 68 || key == 'h') {
|
||||
if (event == Event::ArrowLeft || event == Event::Character('h')) {
|
||||
activated = true;
|
||||
on_change();
|
||||
return true;
|
||||
|
37
ftxui/src/ftxui/event.cpp
Normal file
37
ftxui/src/ftxui/event.cpp
Normal file
@@ -0,0 +1,37 @@
|
||||
#include "ftxui/event.hpp"
|
||||
|
||||
namespace ftxui {
|
||||
|
||||
constexpr char ESC = char(27);
|
||||
|
||||
// --- Character ---
|
||||
Event Event::Character(char c) {
|
||||
return Event{c};
|
||||
}
|
||||
|
||||
// --- Arrow ---
|
||||
Event Event::ArrowLeft{ESC, '[', 'D'};
|
||||
Event Event::ArrowRight{ESC, '[', 'C'};
|
||||
Event Event::ArrowUp{ESC, '[', 'A'};
|
||||
Event Event::ArrowDown{ESC, '[', 'B'};
|
||||
|
||||
// --- Other ---
|
||||
Event Event::Backspace{char(127)};
|
||||
Event Event::Delete{ESC, '[', '3', '~'};
|
||||
Event Event::Escape{ESC};
|
||||
Event Event::Return{char(10)};
|
||||
|
||||
Event Event::F1{ESC, '[', 'O', 'P'};
|
||||
Event Event::F2{ESC, '[', 'O', 'Q'};
|
||||
Event Event::F3{ESC, '[', 'O', 'R'};
|
||||
Event Event::F4{ESC, '[', 'O', 'S'};
|
||||
Event Event::F5{ESC, '[', '1', '5', '~'};
|
||||
Event Event::F6{ESC, '[', '1', '7', '~'};
|
||||
Event Event::F7{ESC, '[', '1', '8', '~'};
|
||||
Event Event::F8{ESC, '[', '1', '9', '~'};
|
||||
Event Event::F9{ESC, '[', '2', '0', '~'};
|
||||
Event Event::F10{ESC, '[', '2', '1', '~'};
|
||||
Event Event::F11{ESC, '[', '2', '1', '~'}; // Same as F10 ?
|
||||
Event Event::F12{ESC, '[', '2', '4', '~'};
|
||||
|
||||
} // namespace ftxui
|
@@ -8,6 +8,20 @@
|
||||
|
||||
namespace ftxui {
|
||||
|
||||
namespace {
|
||||
constexpr char ESC = char(27);
|
||||
|
||||
Event GetEvent() {
|
||||
char v1 = char(getchar());
|
||||
if (v1 != ESC)
|
||||
return Event{v1};
|
||||
|
||||
char v2 = char(getchar());
|
||||
char v3 = char(getchar());
|
||||
return Event{v1,v2,v3};
|
||||
};
|
||||
};
|
||||
|
||||
class ScreenInteractive::Delegate : public component::Delegate {
|
||||
public:
|
||||
Delegate() : root_(this) {}
|
||||
@@ -29,7 +43,7 @@ class ScreenInteractive::Delegate : public component::Delegate {
|
||||
return child;
|
||||
}
|
||||
|
||||
void Event(int key) { component_->Event(key); }
|
||||
void OnEvent(Event event) { component_->OnEvent(event); }
|
||||
|
||||
|
||||
std::vector<component::Delegate*> children() override {
|
||||
@@ -77,8 +91,7 @@ void ScreenInteractive::Loop() {
|
||||
|
||||
Draw();
|
||||
while (!quit_) {
|
||||
int key = getchar();
|
||||
delegate_->Event(key);
|
||||
delegate_->OnEvent(GetEvent());
|
||||
|
||||
Clear();
|
||||
Draw();
|
||||
|
Reference in New Issue
Block a user