mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2025-12-16 01:48:56 +08:00
Add Merge() specializations to support more Element containers (#1117)
`Merge()` was previously only supporting `Elements` as a `Element` container. This PR adds specialization for: - all the containers that matches the concept `std::ranges::range` - `std::queue` - `std::stack` Co-authored-by: ArthurSonzogni <sonzogniarthur@gmail.com> Bug:https://github.com/ArthurSonzogni/FTXUI/issues/1108 Fixed:https://github.com/ArthurSonzogni/FTXUI/issues/1108
This commit is contained in:
@@ -173,7 +173,7 @@ class InputBase : public ComponentBase, public InputOption {
|
||||
elements.push_back(element);
|
||||
}
|
||||
|
||||
auto element = vbox(std::move(elements), cursor_line) | frame;
|
||||
auto element = vbox(std::move(elements)) | frame;
|
||||
return transform_func({
|
||||
std::move(element), hovered_, is_focused,
|
||||
false // placeholder
|
||||
|
||||
@@ -145,8 +145,8 @@ class MenuBase : public ComponentBase, public MenuOption {
|
||||
}
|
||||
|
||||
const Element bar = IsHorizontal()
|
||||
? hbox(std::move(elements), selected_focus_)
|
||||
: vbox(std::move(elements), selected_focus_);
|
||||
? hbox(std::move(elements))
|
||||
: vbox(std::move(elements));
|
||||
|
||||
if (!underline.enabled) {
|
||||
return bar | reflect(box_);
|
||||
|
||||
@@ -46,7 +46,7 @@ class RadioboxBase : public ComponentBase, public RadioboxOption {
|
||||
}
|
||||
elements.push_back(element | reflect(boxes_[i]));
|
||||
}
|
||||
return vbox(std::move(elements), hovered_) | reflect(box_);
|
||||
return vbox(std::move(elements)) | reflect(box_);
|
||||
}
|
||||
|
||||
// NOLINTNEXTLINE(readability-function-cognitive-complexity)
|
||||
|
||||
@@ -2,9 +2,13 @@
|
||||
// Use of this source code is governed by the MIT license that can be found in
|
||||
// the LICENSE file.
|
||||
#include <gtest/gtest.h> // for Test, TestInfo (ptr only), EXPECT_EQ, Message, TEST, TestPartResult
|
||||
#include <cstddef> // for size_t
|
||||
#include <string> // for allocator, basic_string, string
|
||||
#include <vector> // for vector
|
||||
#include <array> // for array
|
||||
#include <cstddef> // for size_t
|
||||
#include <queue>
|
||||
#include <stack> // for stack
|
||||
#include <string> // for allocator, basic_string, string
|
||||
#include <unordered_set> // for unordered_set
|
||||
#include <vector> // for vector
|
||||
|
||||
#include "ftxui/dom/elements.hpp" // for text, operator|, Element, flex_grow, flex_shrink, hbox
|
||||
#include "ftxui/dom/node.hpp" // for Render
|
||||
@@ -358,5 +362,39 @@ TEST(HBoxTest, FlexGrow_NoFlex_FlewShrink) {
|
||||
}
|
||||
}
|
||||
|
||||
TEST(HBoxTest, FromElementsContainer) {
|
||||
Elements elements_vector{text("0"), text("1")};
|
||||
|
||||
std::array<Element, 2> elements_array{text("0"), text("1")};
|
||||
|
||||
std::deque<Element> elements_deque{text("0"), text("1")};
|
||||
|
||||
std::stack<Element> elements_stack;
|
||||
elements_stack.push(text("1"));
|
||||
elements_stack.push(text("0"));
|
||||
|
||||
std::queue<Element> elements_queue;
|
||||
elements_queue.emplace(text("0"));
|
||||
elements_queue.emplace(text("1"));
|
||||
|
||||
const std::vector<Element> collection_hboxes{
|
||||
hbox(std::move(elements_vector)), hbox(std::move(elements_array)),
|
||||
hbox(std::move(elements_stack)), hbox(std::move(elements_deque)),
|
||||
hbox(std::move(elements_queue)),
|
||||
};
|
||||
|
||||
for (const Element& collection_hbox : collection_hboxes) {
|
||||
Screen screen(2, 1);
|
||||
Render(screen, collection_hbox);
|
||||
EXPECT_EQ("01", screen.ToString());
|
||||
}
|
||||
|
||||
// Exception: unordered set, which has no guaranteed order.
|
||||
std::unordered_set<Element> elements_set{text("0"), text("0")};
|
||||
Screen screen(2, 1);
|
||||
Render(screen, hbox(elements_set));
|
||||
EXPECT_EQ("00", screen.ToString());
|
||||
};
|
||||
|
||||
} // namespace ftxui
|
||||
// NOLINTEND
|
||||
|
||||
Reference in New Issue
Block a user