mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2024-11-22 18:59:59 +08:00
Feature: input can now use overwrite mode when toggled with insert key (#735)
Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com>
This commit is contained in:
parent
cdf28903a7
commit
05c7bee6dd
@ -4,6 +4,10 @@ Changelog
|
|||||||
current (development)
|
current (development)
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
### Component
|
||||||
|
- Feature: Add support for `Input`'s insert mode. Add `InputOption::insert`
|
||||||
|
option. Added by @mingsheng13.
|
||||||
|
|
||||||
5.0.0
|
5.0.0
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
@ -177,6 +177,7 @@ struct InputOption {
|
|||||||
std::function<Element(InputState)> transform;
|
std::function<Element(InputState)> transform;
|
||||||
Ref<bool> password = false; /// < Obscure the input content using '*'.
|
Ref<bool> password = false; /// < Obscure the input content using '*'.
|
||||||
Ref<bool> multiline = true; /// < Whether the input can be multiline.
|
Ref<bool> multiline = true; /// < Whether the input can be multiline.
|
||||||
|
Ref<bool> insert = true; /// < Insert or overtype character mode.
|
||||||
|
|
||||||
/// Called when the content changes.
|
/// Called when the content changes.
|
||||||
std::function<void()> on_change = [] {};
|
std::function<void()> on_change = [] {};
|
||||||
|
@ -55,6 +55,7 @@ struct Event {
|
|||||||
static const Event TabReverse;
|
static const Event TabReverse;
|
||||||
static const Event F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12;
|
static const Event F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12;
|
||||||
|
|
||||||
|
static const Event Insert;
|
||||||
static const Event Home;
|
static const Event Home;
|
||||||
static const Event End;
|
static const Event End;
|
||||||
|
|
||||||
|
@ -100,6 +100,7 @@ const Event Event::F10 = Event::Special("\x1B[21~"); // NOLINT
|
|||||||
const Event Event::F11 = Event::Special("\x1B[23~"); // NOLINT
|
const Event Event::F11 = Event::Special("\x1B[23~"); // NOLINT
|
||||||
const Event Event::F12 = Event::Special("\x1B[24~"); // NOLINT
|
const Event Event::F12 = Event::Special("\x1B[24~"); // NOLINT
|
||||||
|
|
||||||
|
const Event Event::Insert = Event::Special("\x1B[2~"); // NOLINT
|
||||||
const Event Event::Home = Event::Special({27, 91, 72}); // NOLINT
|
const Event Event::Home = Event::Special({27, 91, 72}); // NOLINT
|
||||||
const Event Event::End = Event::Special({27, 91, 70}); // NOLINT
|
const Event Event::End = Event::Special({27, 91, 70}); // NOLINT
|
||||||
const Event Event::PageUp = Event::Special({27, 91, 53, 126}); // NOLINT
|
const Event Event::PageUp = Event::Special({27, 91, 53, 126}); // NOLINT
|
||||||
|
@ -100,8 +100,9 @@ class InputBase : public ComponentBase, public InputOption {
|
|||||||
// Component implementation:
|
// Component implementation:
|
||||||
Element Render() override {
|
Element Render() override {
|
||||||
const bool is_focused = Focused();
|
const bool is_focused = Focused();
|
||||||
const auto focused =
|
const auto focused = (!is_focused && !hovered_) ? select
|
||||||
(is_focused || hovered_) ? focusCursorBarBlinking : select;
|
: insert() ? focusCursorBarBlinking
|
||||||
|
: focusCursorBlockBlinking;
|
||||||
|
|
||||||
auto transform_func =
|
auto transform_func =
|
||||||
transform ? transform : InputOption::Default().transform;
|
transform ? transform : InputOption::Default().transform;
|
||||||
@ -342,10 +343,13 @@ class InputBase : public ComponentBase, public InputOption {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool HandleCharacter(const std::string& character) {
|
bool HandleCharacter(const std::string& character) {
|
||||||
|
if (!insert() && cursor_position() < (int)content->size() &&
|
||||||
|
content()[cursor_position()] != '\n') {
|
||||||
|
HandleDelete();
|
||||||
|
}
|
||||||
content->insert(cursor_position(), character);
|
content->insert(cursor_position(), character);
|
||||||
cursor_position() += character.size();
|
cursor_position() += character.size();
|
||||||
on_change();
|
on_change();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,7 +395,9 @@ class InputBase : public ComponentBase, public InputOption {
|
|||||||
if (event == Event::ArrowRightCtrl) {
|
if (event == Event::ArrowRightCtrl) {
|
||||||
return HandleRightCtrl();
|
return HandleRightCtrl();
|
||||||
}
|
}
|
||||||
|
if (event == Event::Insert) {
|
||||||
|
return HandleInsert();
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -509,6 +515,11 @@ class InputBase : public ComponentBase, public InputOption {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HandleInsert() {
|
||||||
|
insert() = !insert();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool Focusable() const final { return true; }
|
bool Focusable() const final { return true; }
|
||||||
|
|
||||||
bool hovered_ = false;
|
bool hovered_ = false;
|
||||||
|
@ -754,4 +754,32 @@ TEST(InputTest, OnEnter) {
|
|||||||
EXPECT_TRUE(on_enter_called);
|
EXPECT_TRUE(on_enter_called);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(InputTest, InsertMode) {
|
||||||
|
std::string content = "abc\nefg";
|
||||||
|
bool insert = true;
|
||||||
|
int cursor_position = 1;
|
||||||
|
Component input = Input({
|
||||||
|
.content = &content,
|
||||||
|
.insert = &insert,
|
||||||
|
.cursor_position = &cursor_position,
|
||||||
|
});
|
||||||
|
|
||||||
|
EXPECT_TRUE(insert);
|
||||||
|
EXPECT_TRUE(input->OnEvent(Event::Insert));
|
||||||
|
EXPECT_FALSE(insert);
|
||||||
|
|
||||||
|
EXPECT_EQ(content, "abc\nefg");
|
||||||
|
EXPECT_TRUE(input->OnEvent(Event::Character('x')));
|
||||||
|
EXPECT_EQ(content, "axc\nefg");
|
||||||
|
EXPECT_TRUE(input->OnEvent(Event::Character('y')));
|
||||||
|
EXPECT_EQ(content, "axy\nefg");
|
||||||
|
EXPECT_TRUE(input->OnEvent(Event::Character('z')));
|
||||||
|
EXPECT_EQ(content, "axyz\nefg");
|
||||||
|
|
||||||
|
EXPECT_TRUE(input->OnEvent(Event::ArrowDown));
|
||||||
|
EXPECT_EQ(content, "axyz\nefg");
|
||||||
|
EXPECT_TRUE(input->OnEvent(Event::Character('X')));
|
||||||
|
EXPECT_EQ(content, "axyz\nefgX");
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ftxui
|
} // namespace ftxui
|
||||||
|
Loading…
Reference in New Issue
Block a user