#pragma once #include "Utils/Vector.hpp" #include "Utils/VectorHash.hpp" #include "cplt_fwd.hpp" #include #include #include class TableCell { public: enum TextAlignment { /// For horizontal alignment, this means align left. For vertical alignment, this means align top. AlignAxisMin, /// Align middle of the text to the middle of the axis. AlignCenter, /// For horizontal alignment, this means align right. For vertical alignment, this means align bottom. AlignAxisMax, }; enum CellType { ConstantCell, ParametricCell, }; public: std::string Content; Vec2i Location; /// Location of the primary (top left) cell, if this cell is a part of a merged group. /// Otherwise, either component of this field shall be -1. Vec2i PrimaryCellLocation; int SpanX; int SpanY; TextAlignment HorizontalAlignment = AlignAxisMin; TextAlignment VerticalAlignment = AlignAxisMin; CellType Type; public: bool IsPrimaryCell() const; bool IsMergedCell() const; }; /// Parameter group information for a grouped array of cells, either horizontal or vertical. /// These cells can have "expansion behavior", i.e. when instanciating, a list of cell values would be provided by /// the caller: /// \code /// [["foo", "bar", "foobar"], /// ["a", "b", c"], /// ["1", "2", "3"], /// ["x", "y", "z"]] /// // ... may be more /// \endcode /// /// For a array parameter group that vertically expands, this would create 4 rows of data in the place of the /// original parameter group. If more than one array parameter groups are on the same row, they would share space /// between each other : /// /// \code /// | 2 elements was fed to it /// | | 1 element was fed to it /// V V /// {~~~~~~~~~~~~~~~~}{~~~~~~~~~~~~~~} /// +------+---------+---------------+ /// | Foo | Example | Another group | /// +------+---------+---------------+ /// | Cool | Example | | /// +------+---------+---------------+ /// \endcode class TableArrayParameterGroup { public: enum ExpansionDirection { ExpandUp, ExpandDown, ExpandLeft, ExpandRight, }; public: ExpansionDirection ExpandDirection; }; // Forward declaration of libxlsxwriter structs struct lxw_workbook; struct lxw_worksheet; /// An object containing the necessary information to instanciate a table template. /// \see TableTemplate class TableInstanciationParameters { private: TableTemplate* mTemplate; tsl::robin_map ParametricCells; public: // TODO }; /// A table template, where individual cells can be filled by workflows instanciating this template. Merged cells, /// parametric rows/columns, and grids are also supported. /// /// This current supports exporting to xlsx files. class TableTemplate { private: std::vector mCells; std::vector mArrayGroups; int mTableWidth; int mTableHeight; public: int GetTableWidth() const; int GetTableHeight() const; void Resize(int newWidth, int newHeight); const TableCell& GetCell(Vec2i pos) const; TableCell& GetCell(Vec2i pos); enum MergeCellsResult { MCR_CellAlreadyMerged, MCR_Success, }; MergeCellsResult MergeCells(Vec2i topLeft, Vec2i bottomRight); enum BreakCellsResult { BCR_CellNotMerged, BCR_Success, }; BreakCellsResult BreakCells(Vec2i topLeft); lxw_workbook* InstanciateToExcelWorkbook(const TableInstanciationParameters& params) const; lxw_worksheet* InstanciateToExcelWorksheet(lxw_workbook* workbook, const TableInstanciationParameters& params) const; };