+++ /dev/null
-#include <stdexcept>
-#include <msp/gl/matrix.h>
-#include <msp/gl/meshbuilder.h>
-#include "part.h"
-#include "style.h"
-#include "table.h"
-
-using namespace std;
-
-namespace Msp {
-namespace GLtk {
-
-Table::Table():
- rows(1),
- columns(1),
- data(1),
- col_w(1)
-{
- focusable = false;
-}
-
-void Table::set_rows(unsigned r)
-{
- rows = r;
- data.resize(rows*columns);
-}
-
-void Table::set_columns(unsigned c)
-{
- vector<string> new_data(rows*c);
- for(unsigned i=0; i<rows; ++i)
- for(unsigned j=0; j<min(c, columns); ++j)
- new_data[i*c+j].swap(data[i*columns+j]);
- data.swap(new_data);
- columns = c;
-
- col_w.resize(columns);
-}
-
-void Table::set_column_width(unsigned c, unsigned w)
-{
- if(c>=columns)
- throw invalid_argument("Table::set_column_width");
- col_w[c] = w;
-}
-
-void Table::set_cell_text(unsigned r, unsigned c, const string &t)
-{
- if(r>=rows || c>=columns)
- throw out_of_range("Table::set_cell_text");
-
- data[r*columns+c] = t;
-}
-
-void Table::rebuild_special(const Part &part, CachedPart &cache)
-{
- if(part.get_name()=="cells")
- {
- const GL::Font &font = style->get_font();
- float font_size = style->get_font_size();
-
- unsigned free_width = geom.w;
- for(unsigned i=0; i<columns; ++i)
- free_width -= col_w[i];
-
- Geometry cgeom;
- cgeom.h = geom.h/rows;
- cgeom.y = geom.h-cgeom.h;
-
- cache.texture = &font.get_texture();
- cache.clear_mesh();
-
- GL::MeshBuilder bld(*cache.mesh);
- for(unsigned i=0; i<rows; ++i)
- {
- cgeom.x = 0;
- for(unsigned j=0; j<columns; ++j)
- {
- if(col_w[j])
- cgeom.w = col_w[j];
- else
- cgeom.w = free_width/columns;
-
- const string &text = data[i*columns+j];
- Geometry rgeom;
- rgeom.x = cgeom.x;
- rgeom.y = cgeom.y;
- rgeom.w = static_cast<unsigned>(font.get_string_width(text)*font_size);
- rgeom.h = static_cast<unsigned>((font.get_ascent()-font.get_descent())*font_size);
-
- part.get_alignment().apply(rgeom, cgeom, part.get_margin());
-
- GL::MatrixStack::Push _push(bld.matrix());
- bld.matrix() *= GL::Matrix::translation(rgeom.x, rgeom.y, 0);
- bld.matrix() *= GL::Matrix::scaling(font_size);
- font.draw_string(text);
-
- cgeom.x += cgeom.w;
- }
-
- cgeom.y -= cgeom.h;
- }
- }
-}
-
-void Table::on_style_change()
-{
-}
-
-
-Table::Loader::Loader(Table &t):
- Widget::Loader(t)
-{
- add("cell_text", &Loader::cell_text);
- add("column_width", &Loader::column_width);
- add("columns", &Loader::columns);
- add("rows", &Loader::rows);
-}
-
-void Table::Loader::cell_text(unsigned r, unsigned c, const string &t)
-{
- static_cast<Table &>(obj).set_cell_text(r, c, t);
-}
-
-void Table::Loader::column_width(unsigned c, unsigned w)
-{
- static_cast<Table &>(obj).set_column_width(c, w);
-}
-
-void Table::Loader::columns(unsigned c)
-{
- static_cast<Table &>(obj).set_columns(c);
-}
-
-void Table::Loader::rows(unsigned r)
-{
- static_cast<Table &>(obj).set_rows(r);
-}
-
-} // namespace GLtk
-} // namespace Msp
+++ /dev/null
-#ifndef MSP_GLTK_TABLE_H_
-#define MSP_GLTK_TABLE_H_
-
-#include <string>
-#include <vector>
-#include "widget.h"
-
-namespace Msp {
-namespace GLtk {
-
-class Table: public Widget
-{
-public:
- class Loader: public Widget::Loader
- {
- public:
- Loader(Table &);
- private:
- void cell_text(unsigned, unsigned, const std::string &);
- void column_width(unsigned, unsigned);
- void columns(unsigned);
- void rows(unsigned);
- };
-
-private:
- unsigned rows;
- unsigned columns;
- std::vector<std::string> data;
- std::vector<unsigned> col_w;
-
-public:
- Table();
-
- void set_rows(unsigned);
- void set_columns(unsigned);
- unsigned get_rows() const { return rows; }
- unsigned get_columns() const { return columns; }
-
- void set_column_width(unsigned, unsigned);
- void set_cell_text(unsigned, unsigned, const std::string &);
-private:
- virtual const char *get_class() const { return "table"; }
-
- virtual void rebuild_special(const Part &, CachedPart &);
- virtual void on_style_change();
-};
-
-} // namespace GLtk
-} // namespace Msp
-
-#endif