parent
cebf61a794
commit
1620a5420f
@ -1,92 +1,96 @@ |
|||||||
#include "lel.hpp" |
#include "lel.hpp" |
||||||
#include <fmt/core.h> |
#include <fmt/core.h> |
||||||
#include "dbc.hpp" |
#include "dbc.hpp" |
||||||
|
|
||||||
#include "lel_parser.cpp" |
#include "lel_parser.cpp" |
||||||
|
|
||||||
LELParser::LELParser(int x, int y, int width, int height) : |
namespace lel { |
||||||
grid_x(x), |
|
||||||
grid_y(y), |
|
||||||
grid_w(width), |
|
||||||
grid_h(height), |
|
||||||
cur(0, 0) |
|
||||||
{ |
|
||||||
} |
|
||||||
|
|
||||||
void LELParser::ltab() { |
Parser::Parser(int x, int y, int width, int height) : |
||||||
cur.row = rows; |
grid_x(x), |
||||||
} |
grid_y(y), |
||||||
|
grid_w(width), |
||||||
|
grid_h(height), |
||||||
|
cur(0, 0) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
void LELParser::col() { |
void Parser::ltab() { |
||||||
} |
cur.row = rows; |
||||||
|
} |
||||||
|
|
||||||
void LELParser::valign(char dir) { |
void Parser::col() { |
||||||
cur.bottom = dir == '.'; |
} |
||||||
} |
|
||||||
|
|
||||||
void LELParser::align(char dir) { |
void Parser::valign(char dir) { |
||||||
cur.right = dir == '>'; |
cur.bottom = dir == '.'; |
||||||
} |
} |
||||||
|
|
||||||
void LELParser::id(std::string name) { |
void Parser::align(char dir) { |
||||||
if(name != "_") { |
cur.right = dir == '>'; |
||||||
dbc::check(!cells.contains(name), |
|
||||||
fmt::format("duplicate cell name {}", name)); |
|
||||||
cells.insert_or_assign(name, cur); |
|
||||||
} |
} |
||||||
|
|
||||||
cur = {cur.col + 1, cur.row}; |
void Parser::id(std::string name) { |
||||||
} |
if(name != "_") { |
||||||
|
dbc::check(!cells.contains(name), |
||||||
|
fmt::format("duplicate cell name {}", name)); |
||||||
|
cells.insert_or_assign(name, cur); |
||||||
|
} |
||||||
|
|
||||||
void LELParser::row() { |
cur = {cur.col + 1, cur.row}; |
||||||
rows++; |
} |
||||||
columns = std::max(columns, cur.col); |
|
||||||
cur.col = 0; |
|
||||||
} |
|
||||||
|
|
||||||
void LELParser::setwidth(int width) { |
void Parser::row() { |
||||||
cur.max_w = width; |
rows++; |
||||||
} |
columns = std::max(columns, cur.col); |
||||||
|
cur.col = 0; |
||||||
|
} |
||||||
|
|
||||||
void LELParser::setheight(int height) { |
void Parser::setwidth(int width) { |
||||||
cur.max_h = height; |
cur.max_w = width; |
||||||
} |
} |
||||||
|
|
||||||
void LELParser::expand() { |
void Parser::setheight(int height) { |
||||||
cur.expand = true; |
cur.max_h = height; |
||||||
} |
} |
||||||
|
|
||||||
void LELParser::finalize() { |
void Parser::expand() { |
||||||
dbc::check(columns > 0, "columns are 0"); |
cur.expand = true; |
||||||
dbc::check(rows > 0, "rows are 0"); |
} |
||||||
int cell_width = grid_w / columns; |
|
||||||
int cell_height = grid_h / rows; |
|
||||||
dbc::check(cell_width > 0, "invalid cell width calc"); |
|
||||||
dbc::check(cell_height > 0, "invalid cell height calc"); |
|
||||||
|
|
||||||
for(auto& [name, cell] : cells) { |
|
||||||
cell.x = grid_x + (cell.col * cell_width); |
|
||||||
cell.y = grid_y + (cell.row * cell_height); |
|
||||||
cell.max_w = cell.max_w == 0 ? cell_width : cell.max_w; |
|
||||||
cell.max_h = cell.max_h == 0 ? cell_height : cell.max_h; |
|
||||||
|
|
||||||
cell.w = cell.expand ? std::min(cell.max_w, grid_w) : std::min(cell_width, cell.max_w); |
|
||||||
cell.h = cell.expand ? std::min(cell.max_h, grid_h) : std::min(cell_height, cell.max_h); |
|
||||||
|
|
||||||
if(cell.right) { |
|
||||||
cell.x += cell_width - cell.w; |
|
||||||
} |
|
||||||
|
|
||||||
if(cell.bottom) { |
void Parser::finalize() { |
||||||
cell.y += cell_height - cell.h; |
dbc::check(columns > 0, "columns are 0"); |
||||||
|
dbc::check(rows > 0, "rows are 0"); |
||||||
|
int cell_width = grid_w / columns; |
||||||
|
int cell_height = grid_h / rows; |
||||||
|
dbc::check(cell_width > 0, "invalid cell width calc"); |
||||||
|
dbc::check(cell_height > 0, "invalid cell height calc"); |
||||||
|
|
||||||
|
for(auto& [name, cell] : cells) { |
||||||
|
cell.x = grid_x + (cell.col * cell_width); |
||||||
|
cell.y = grid_y + (cell.row * cell_height); |
||||||
|
cell.max_w = cell.max_w == 0 ? cell_width : cell.max_w; |
||||||
|
cell.max_h = cell.max_h == 0 ? cell_height : cell.max_h; |
||||||
|
|
||||||
|
cell.w = cell.expand ? std::min(cell.max_w, grid_w) : std::min(cell_width, cell.max_w); |
||||||
|
cell.h = cell.expand ? std::min(cell.max_h, grid_h) : std::min(cell_height, cell.max_h); |
||||||
|
|
||||||
|
if(cell.right) { |
||||||
|
cell.x += cell_width - cell.w; |
||||||
|
} |
||||||
|
|
||||||
|
if(cell.bottom) { |
||||||
|
cell.y += cell_height - cell.h; |
||||||
|
} |
||||||
|
|
||||||
|
dbc::check(cell.h > 0, fmt::format("invalid height cell {}", name)); |
||||||
|
dbc::check(cell.w > 0, fmt::format("invalid width cell {}", name)); |
||||||
} |
} |
||||||
|
|
||||||
dbc::check(cell.h > 0, fmt::format("invalid height cell {}", name)); |
|
||||||
dbc::check(cell.w > 0, fmt::format("invalid width cell {}", name)); |
|
||||||
} |
} |
||||||
} |
|
||||||
|
|
||||||
void LELParser::reset() { |
void Parser::reset() { |
||||||
rows = 0; |
rows = 0; |
||||||
columns = 0; |
columns = 0; |
||||||
cur = {0, 0}; |
cur = {0, 0}; |
||||||
|
} |
||||||
} |
} |
||||||
|
Loading…
Reference in new issue