Прокручиваемая таблица с FTXUIC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Прокручиваемая таблица с FTXUI

Сообщение Anonymous »

Мне нужно использовать FTXUI для отображения табличных данных, где ячейки могут содержать кнопки для запуска некоторых действий.
На данный момент я добился отображения данных с фиксированной строкой заголовка и таблицей с горизонтальной и вертикальной прокруткой.

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 

#include "ftxui/component/captured_mouse.hpp"
#include "ftxui/component/component.hpp"
#include "ftxui/component/component_base.hpp"
#include "ftxui/component/screen_interactive.hpp"
#include "ftxui/dom/elements.hpp"
#include "ftxui/screen/color.hpp"

using namespace ftxui;

int count = 0;

Element make_box(const std::string &tag, int x, int y) {
std::string title = tag + "(" + std::to_string(x) + ", " + std::to_string(y) + ")";
return text(title) | center | size(WIDTH, EQUAL, 15) |
size(HEIGHT, EQUAL, 1);
};

std::vector make_buttons(int num_rows) {
std::vector buttons;
for (int i = 0; i < num_rows; i++) {
auto label = fmt::format("B({},{})", 1, i);
buttons.push_back(Button(label, [&] { count++; }, ButtonOption::Animated()));
}
return buttons;
}

Element make_header(int num_rows, int num_cols) {
std::vector rows;
for (int i = 0; i < num_rows; i++) {
std::vector row;
for (int j = 0; j < num_cols; j++) {
row.push_back(make_box("H", i, j));
}
rows.push_back(row);
}

return gridbox(rows);
}

Element make_grid(int num_rows, int num_cols, const std::vector &buttons) {
std::vector rows;
for (int i = 0; i < num_rows; i++) {
std::vector row;
for (int j = 0; j < num_cols; j++) {
if (j == 0) {
row.push_back(
buttons[i]->Render() | size(WIDTH, EQUAL, 15) |
size(HEIGHT, EQUAL, 1));
} else {
row.push_back(make_box("C", i, j));
}
}
rows.push_back(row);
}
return gridbox(rows);
}

int main() {
float focus_x = 0.1f;
float focus_y = 0.1f;

SliderOption option_x;
option_x.value = &focus_x;
option_x.min = 0.f;
option_x.max = 1.f;
option_x.increment = 0.1f;
option_x.direction = Direction::Right;
option_x.color_active = Color::Blue;
option_x.color_inactive = Color::BlueLight;
auto slider_x = Slider(option_x);

SliderOption  option_y;
option_y.value = &focus_y;
option_y.min = 0.f;
option_y.max = 1.f;
option_y.increment = 0.1f;
option_y.direction = Direction::Down;
option_y.color_active = Color::Yellow;
option_y.color_inactive = Color::YellowLight;
auto slider_y = Slider(option_y);

auto buttons = make_buttons(15);

// sliders not visible - why?
auto scrollable_sliders_not_visible = Renderer(
Container::Vertical({slider_x, slider_y}),
[&] {
auto table = vbox(
{make_header(1, 15) | focusPositionRelative(focus_x, 0)
| frame | xflex,
separator(),
make_grid(15, 15, buttons) | focusPositionRelative(focus_x, focus_y)
| frame | flex}) | border;
auto x_scrollable = vbox({table, slider_x->Render()}) | frame;
return hbox({x_scrollable, slider_y->Render()}) | frame | border;
});

auto scrollable = Renderer(
Container::Vertical({slider_x, slider_y}),
[&] {
auto table = vbox(
{make_header(1, 15) | focusPositionRelative(focus_x, 0)
| frame | xflex,
separator(),
make_grid(15, 15, buttons) | focusPositionRelative(focus_x, focus_y)
| frame | flex,
slider_x->Render()
});
return hbox({slider_y->Render(), table}) | border;
});

auto renderer = Renderer(
scrollable, [&] {
std::string msg = fmt::format("Clicks = {}", count);
return vbox({text(msg), separator(), scrollable->Render()});
}
);

auto screen = ScreenInteractive::Fullscreen();
screen.Loop(renderer);

return 0;
}
Есть несколько моментов, которые мне непонятны, как их исправить, и я был бы признателен за советы.
  • Как мне снова сделать кнопки отзывчивыми. Они также отображаются черным цветом, что в любом случае указывает на некоторые проблемы.
  • Как можно использовать мышь для прокрутки? Я пробовал использовать vscroll_indicator и hscroll_indicator. Полосы прокрутки отображаются, но прокрутка не работает.
  • Когда я перемещаю вертикальную полосу прокрутки вправо, она исчезает. Тоже непонятно.
Возможно, я выбрал неправильный подход, и могут быть более простые готовые решения.
Вот как это выглядит:
Изображение


Подробнее здесь: https://stackoverflow.com/questions/798 ... with-ftxui
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»