#pragma once #include "Utils/Vector.hpp" #include "Utils/VectorHash.hpp" #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; }; class TableArrayParameterGroup { public: enum ExpansionDirection { ExpandUp, ExpandDown, ExpandLeft, ExpandRight, }; public: ExpansionDirection ExpandDirection; }; 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); };