#pragma once #include "Layout.h" #include #include struct KeyboardMetrics { qreal padding = 6; // around the whole keyboard qreal gap = 8; // between keys, horizontally and vertically qreal blockGap = 24; // between side-by-side blocks (main, navigation, numpad) }; // The keys on screen: blocks of rows, side by side. struct Block { QList rows; bool fillHeight = false; // rows grow to span the full height instead of sharing the row height }; // Lays out blocks to fill `size`. Returns one rect per key, block by block in // row order (spacers included). One key unit has the same width everywhere; // rows share one height, set by the tallest block that doesn't fill, and // shorter blocks sit at the bottom. In each block, stretch keys grow to make // their row as wide as the widest one, and remaining shorter rows are centered. QList computeKeyRects(const QList &blocks, QSizeF size, KeyboardMetrics metrics = {}); inline QList computeKeyRects(const Layer &layer, QSizeF size, KeyboardMetrics metrics = {}) { return computeKeyRects({{layer.rows}}, size, metrics); } // Total width of a row in key units, before stretching. qreal rowUnits(const Row &row); // Width of all blocks in key units, ignoring gaps. qreal totalUnits(const QList &blocks); // Rows of the tallest block that sets the row height (see computeKeyRects). qsizetype totalRows(const QList &blocks);