From 0dfd59bd09190c8cecfac215fe8dce4d7dc2b5df Mon Sep 17 00:00:00 2001 From: na-trium-144 <100704180+na-trium-144@users.noreply.github.com> Date: Fri, 19 Apr 2024 00:28:28 +0900 Subject: [PATCH] Fix ResizableSplit handling keyboard navigation incorrectly (#842) Co-authored-by: ArthurSonzogni --- CHANGELOG.md | 1 + src/ftxui/component/resizable_split.cpp | 30 +++++++++++++++++--- src/ftxui/component/resizable_split_test.cpp | 29 ++++++++++++++++++- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17dff7c..1246145 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ current (development) Fixed by @chrysante in chrysante in PR #776. - Bugfix: Propertly restore cursor shape on exit. See #792. - Bugfix: Fix cursor position in when in the last column. See #831. +- Bugfix: Fix `ResizeableSplit` keyboard navigation. Fixed by #842. ### Dom - Feature: Add `hscroll_indicator`. It display an horizontal indicator diff --git a/src/ftxui/component/resizable_split.cpp b/src/ftxui/component/resizable_split.cpp index 9e0d62e..86a2820 100644 --- a/src/ftxui/component/resizable_split.cpp +++ b/src/ftxui/component/resizable_split.cpp @@ -23,10 +23,32 @@ class ResizableSplitBase : public ComponentBase { public: explicit ResizableSplitBase(ResizableSplitOption options) : options_(std::move(options)) { - Add(Container::Horizontal({ - options_->main, - options_->back, - })); + switch (options_->direction()) { + case Direction::Left: + Add(Container::Horizontal({ + options_->main, + options_->back, + })); + break; + case Direction::Right: + Add(Container::Horizontal({ + options_->back, + options_->main, + })); + break; + case Direction::Up: + Add(Container::Vertical({ + options_->main, + options_->back, + })); + break; + case Direction::Down: + Add(Container::Vertical({ + options_->back, + options_->main, + })); + break; + } } bool OnEvent(Event event) final { diff --git a/src/ftxui/component/resizable_split_test.cpp b/src/ftxui/component/resizable_split_test.cpp index 352b33e..6963631 100644 --- a/src/ftxui/component/resizable_split_test.cpp +++ b/src/ftxui/component/resizable_split_test.cpp @@ -19,7 +19,7 @@ namespace ftxui { namespace { Component BasicComponent() { - return Renderer([] { return text(""); }); + return Renderer([](bool focused) { return text(""); }); } Event MousePressed(int x, int y) { @@ -207,5 +207,32 @@ TEST(ResizableSplit, BasicBottomWithCustomSeparator) { EXPECT_EQ(position, 2); } +TEST(ResizableSplit, NavigationVertical) { + int position = 0; + auto component_top = BasicComponent(); + auto component_bottom = BasicComponent(); + auto component = + ResizableSplitTop(component_top, component_bottom, &position); + + EXPECT_TRUE(component_top->Active()); + EXPECT_FALSE(component_bottom->Active()); + + EXPECT_FALSE(component->OnEvent(Event::ArrowRight)); + EXPECT_TRUE(component_top->Active()); + EXPECT_FALSE(component_bottom->Active()); + + EXPECT_TRUE(component->OnEvent(Event::ArrowDown)); + EXPECT_FALSE(component_top->Active()); + EXPECT_TRUE(component_bottom->Active()); + + EXPECT_FALSE(component->OnEvent(Event::ArrowDown)); + EXPECT_FALSE(component_top->Active()); + EXPECT_TRUE(component_bottom->Active()); + + EXPECT_TRUE(component->OnEvent(Event::ArrowUp)); + EXPECT_TRUE(component_top->Active()); + EXPECT_FALSE(component_bottom->Active()); +} + } // namespace ftxui // NOLINTEND