Add ui::table base class
This commit is contained in:
parent
de352705f4
commit
4c726e2eef
4 changed files with 111 additions and 0 deletions
|
|
@ -24,6 +24,7 @@ namespace psemek::ui
|
||||||
struct scroller;
|
struct scroller;
|
||||||
struct progress_bar;
|
struct progress_bar;
|
||||||
struct selector;
|
struct selector;
|
||||||
|
struct table;
|
||||||
|
|
||||||
struct element_factory
|
struct element_factory
|
||||||
{
|
{
|
||||||
|
|
@ -52,6 +53,7 @@ namespace psemek::ui
|
||||||
virtual std::shared_ptr<scroller> make_scroller();
|
virtual std::shared_ptr<scroller> make_scroller();
|
||||||
virtual std::shared_ptr<progress_bar> make_progress_bar();
|
virtual std::shared_ptr<progress_bar> make_progress_bar();
|
||||||
virtual std::shared_ptr<selector> make_selector();
|
virtual std::shared_ptr<selector> make_selector();
|
||||||
|
virtual std::shared_ptr<table> make_table();
|
||||||
|
|
||||||
virtual ~element_factory() {}
|
virtual ~element_factory() {}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
30
libs/ui/include/psemek/ui/table.hpp
Normal file
30
libs/ui/include/psemek/ui/table.hpp
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <psemek/ui/grid_layout.hpp>
|
||||||
|
|
||||||
|
namespace psemek::ui
|
||||||
|
{
|
||||||
|
|
||||||
|
struct table
|
||||||
|
: grid_layout
|
||||||
|
{
|
||||||
|
void reshape(geom::box<float, 2> 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<float> line_x_;
|
||||||
|
std::vector<float> line_y_;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::vector<bool> horizontal_border_;
|
||||||
|
std::vector<bool> vertical_border_;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -131,4 +131,6 @@ namespace psemek::ui
|
||||||
|
|
||||||
std::shared_ptr<selector> element_factory::make_selector() { return nullptr; }
|
std::shared_ptr<selector> element_factory::make_selector() { return nullptr; }
|
||||||
|
|
||||||
|
std::shared_ptr<table> element_factory::make_table() { return nullptr; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
77
libs/ui/source/table.cpp
Normal file
77
libs/ui/source/table.cpp
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
#include <psemek/ui/table.hpp>
|
||||||
|
|
||||||
|
namespace psemek::ui
|
||||||
|
{
|
||||||
|
|
||||||
|
void table::reshape(geom::box<float, 2> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue