Grid layout
Status: Implemented | 2022
The GridLayout
system is used to encapsulate the appearance of a
crossword into a relatively light-weight structure.
It is calculated from a XwordState
, and contains roughly the
following information within it:
The shape and layout of the board
The current string to display in each cell
The current cell state, for setting CSS values
Any decorations to include in the overlay (see overlay.md)
The current sizing and zoom level to render
It can be used by PlayGrid
and PlayCell
to render themselves
appropriately. It can also be used to generate a pdf for printing
support.
Types
Grid layout for crosswords.
Consider a 3x3 board:
+-+-+-+
|C|C|C|
+-+-+-+
|C|C|C|
+-+-+-+
|C|C|C|
+-+-+-+
Each character there is a layout item: + are intersections, | are vertical vborders, - are horizontal borders, and C are cells.
We have (2 * board_rows + 1) * (2 * board_columns + 1)
items here.
For consistency, we distinguish between board_rows
(rows of cells in
the crossword), and grid_rows
(rows of layout items in the
GridLayout) — and similarly for board_columns
vs. grid_columns
.
So:
grid_rows = 2 * board_rows + 1
grid_columns = 2 * board_columns + 1
The drawing code can iterate linearly through the grid, and get a
LayoutItemKind
for each position. That way it knows whether it must
draw an intersection, a border, or a cell. Then it can ask for each
particular item kind and get its details.
Note: For crossword-style puzzles, the type of each layout item is
completely predictable regardless of the puzzle. That is why
grid_layout_get_kind
doesn’t take a layout as an argument.