|
|
|
@ -17,64 +17,69 @@ namespace lel { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
} |
|
|
|
|
dbc::check(!cells.contains(name), |
|
|
|
|
fmt::format("duplicate cell name {}", name)); |
|
|
|
|
cells.insert_or_assign(name, cur); |
|
|
|
|
|
|
|
|
|
cur = {cur.col + 1, cur.row}; |
|
|
|
|
|
|
|
|
|
auto& row = grid.back(); |
|
|
|
|
row.push_back(name); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Parser::finalize() { |
|
|
|
|
dbc::check(columns > 0, "columns are 0"); |
|
|
|
|
dbc::check(rows > 0, "rows are 0"); |
|
|
|
|
int cell_width = grid_w / columns; |
|
|
|
|
size_t rows = grid.size(); |
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
// ZED: getting a bit hairy but this should work
|
|
|
|
|
if(cell.percent) { |
|
|
|
|
// when percent mode we have to take unset to 100%
|
|
|
|
|
if(cell.max_w == 0) cell.max_w = 100; |
|
|
|
|
if(cell.max_h == 0) cell.max_h = 100; |
|
|
|
|
cell.max_w *= cell_width * 0.01; |
|
|
|
|
cell.max_h *= cell_height * 0.01; |
|
|
|
|
} else { |
|
|
|
|
if(cell.max_w == 0) cell.max_w = cell_width; |
|
|
|
|
if(cell.max_h == 0) cell.max_h = cell_height; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
dbc::check(cell.h > 0, fmt::format("invalid height cell {}", name)); |
|
|
|
|
dbc::check(cell.w > 0, fmt::format("invalid width cell {}", name)); |
|
|
|
|
|
|
|
|
|
// keep the midpoint since it is used a lot
|
|
|
|
|
cell.mid_x = std::midpoint(cell.x, cell.x + cell.w); |
|
|
|
|
cell.mid_y = std::midpoint(cell.y, cell.y + cell.h); |
|
|
|
|
|
|
|
|
|
// perform alignments
|
|
|
|
|
if(cell.right) cell.x += cell_width - cell.w; |
|
|
|
|
if(cell.bottom) cell.y += cell_height - cell.h; |
|
|
|
|
if(cell.center) { |
|
|
|
|
cell.x = cell.mid_x - cell.w / 2; |
|
|
|
|
cell.y = cell.mid_y - cell.h / 2; |
|
|
|
|
for(auto& row : grid) { |
|
|
|
|
for(auto& name : row) { |
|
|
|
|
size_t columns = row.size(); |
|
|
|
|
auto& cell = cells.at(name); |
|
|
|
|
|
|
|
|
|
int cell_width = grid_w / columns; |
|
|
|
|
dbc::check(cell_width > 0, "invalid cell width calc"); |
|
|
|
|
dbc::check(cell_height > 0, "invalid cell height calc"); |
|
|
|
|
|
|
|
|
|
cell.x = grid_x + (cell.col * cell_width); |
|
|
|
|
cell.y = grid_y + (cell.row * cell_height); |
|
|
|
|
|
|
|
|
|
// ZED: getting a bit hairy but this should work
|
|
|
|
|
if(cell.percent) { |
|
|
|
|
// when percent mode we have to take unset to 100%
|
|
|
|
|
if(cell.max_w == 0) cell.max_w = 100; |
|
|
|
|
if(cell.max_h == 0) cell.max_h = 100; |
|
|
|
|
cell.max_w *= cell_width * 0.01; |
|
|
|
|
cell.max_h *= cell_height * 0.01; |
|
|
|
|
} else { |
|
|
|
|
if(cell.max_w == 0) cell.max_w = cell_width; |
|
|
|
|
if(cell.max_h == 0) cell.max_h = cell_height; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
dbc::check(cell.h > 0, fmt::format("invalid height cell {}", name)); |
|
|
|
|
dbc::check(cell.w > 0, fmt::format("invalid width cell {}", name)); |
|
|
|
|
|
|
|
|
|
// keep the midpoint since it is used a lot
|
|
|
|
|
cell.mid_x = std::midpoint(cell.x, cell.x + cell.w); |
|
|
|
|
cell.mid_y = std::midpoint(cell.y, cell.y + cell.h); |
|
|
|
|
|
|
|
|
|
// perform alignments
|
|
|
|
|
if(cell.right) cell.x += cell_width - cell.w; |
|
|
|
|
if(cell.bottom) cell.y += cell_height - cell.h; |
|
|
|
|
if(cell.center) { |
|
|
|
|
cell.x = cell.mid_x - cell.w / 2; |
|
|
|
|
cell.y = cell.mid_y - cell.h / 2; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Parser::reset() { |
|
|
|
|
rows = 0; |
|
|
|
|
columns = 0; |
|
|
|
|
cur = {0, 0}; |
|
|
|
|
grid.clear(); |
|
|
|
|
cells.clear(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::optional<std::string> Parser::hit(int x, int y) { |
|
|
|
|