diff --git a/libs/ui/include/psemek/ui/element_factory.hpp b/libs/ui/include/psemek/ui/element_factory.hpp index d1cffa87..1382c659 100644 --- a/libs/ui/include/psemek/ui/element_factory.hpp +++ b/libs/ui/include/psemek/ui/element_factory.hpp @@ -24,6 +24,7 @@ namespace psemek::ui struct scroller; struct progress_bar; struct selector; + struct table; struct element_factory { @@ -52,6 +53,7 @@ namespace psemek::ui virtual std::shared_ptr make_scroller(); virtual std::shared_ptr make_progress_bar(); virtual std::shared_ptr make_selector(); + virtual std::shared_ptr make_table(); virtual ~element_factory() {} }; diff --git a/libs/ui/include/psemek/ui/table.hpp b/libs/ui/include/psemek/ui/table.hpp new file mode 100644 index 00000000..42150947 --- /dev/null +++ b/libs/ui/include/psemek/ui/table.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include + +namespace psemek::ui +{ + + struct table + : grid_layout + { + void reshape(geom::box const & box) override; + + void set_size(std::size_t rows, std::size_t columns) override; + + virtual bool horizontal_border(std::size_t i) const; + virtual void set_horizontal_border(std::size_t i, bool visible); + + virtual bool vertical_border(std::size_t i) const; + virtual void set_vertical_border(std::size_t i, bool visible); + + protected: + std::vector line_x_; + std::vector line_y_; + + private: + std::vector horizontal_border_; + std::vector vertical_border_; + }; + +} diff --git a/libs/ui/source/element_factory.cpp b/libs/ui/source/element_factory.cpp index 7dab502a..2ec00198 100644 --- a/libs/ui/source/element_factory.cpp +++ b/libs/ui/source/element_factory.cpp @@ -131,4 +131,6 @@ namespace psemek::ui std::shared_ptr element_factory::make_selector() { return nullptr; } + std::shared_ptr
element_factory::make_table() { return nullptr; } + } diff --git a/libs/ui/source/table.cpp b/libs/ui/source/table.cpp new file mode 100644 index 00000000..fe975f98 --- /dev/null +++ b/libs/ui/source/table.cpp @@ -0,0 +1,77 @@ +#include + +namespace psemek::ui +{ + + void table::reshape(geom::box const & box) + { + grid_layout::reshape(box); + + auto st = merged_own_style(); + + auto offset = *(st->outer_margin) / 2.f; + + line_y_.resize(row_count() + 1); + line_x_.resize(column_count() + 1); + + for (std::size_t r = 0; r <= row_count(); ++r) + { + if (r == 0) + line_y_[r] = row_shape_[0].min - offset; + else if (r == row_count()) + line_y_[r] = row_shape_[r - 1].max + offset; + else + line_y_[r] = (row_shape_[r - 1].max + row_shape_[r].min) / 2.f; + line_y_[r] = std::round(line_y_[r]); + } + + for (std::size_t c = 0; c <= column_count(); ++c) + { + if (c == 0) + line_x_[c] = column_shape_[0].min - offset; + else if (c == column_count()) + line_x_[c] = column_shape_[c - 1].max + offset; + else + line_x_[c] = (column_shape_[c - 1].max + column_shape_[c].min) / 2.f; + line_x_[c] = std::round(line_x_[c]); + } + } + + void table::set_size(std::size_t rows, std::size_t columns) + { + std::size_t old_rows = row_count(); + std::size_t old_columns = column_count(); + + grid_layout::set_size(rows, columns); + + horizontal_border_.resize(rows + 1); + vertical_border_.resize(columns + 1); + + for (std::size_t i = old_rows + 1; i <= rows; ++i) + horizontal_border_[i] = true; + + for (std::size_t i = old_columns + 1; i <= columns; ++i) + vertical_border_[i] = true; + } + + bool table::horizontal_border(std::size_t i) const + { + return horizontal_border_[i]; + } + + void table::set_horizontal_border(std::size_t i, bool visible) + { + horizontal_border_[i] = visible; + } + + bool table::vertical_border(std::size_t i) const + { + return vertical_border_[i]; + } + + void table::set_vertical_border(std::size_t i, bool visible) + { + vertical_border_[i] = visible; + } + +}