FB-09: size default HUD widgets by title, not a fixed uniform cell
Adds minColSpanForLabel as a character-count proxy for how many grid columns a metric's title needs, reworks HudWidgetLayout.defaultFor into a left-to-right row-packing layout using it, enforces the same minimum as a floor on manual resize, and splits _HudMetricValue's FittedBox so the title renders at a fixed reference size while only the value shrinks/grows to fill the remaining space. Confirms a real, documented interaction with FB-08's _reflowRow: its even column split has no awareness of a member's title-driven minimum and can push one below it. Left unfixed per this ticket's own Out-of-scope section -- _reflowRow's algorithm is FB-08's, not this ticket's, to change. Test count 426 -> 434, all green. flutter analyze unchanged (same 4 pre-existing, unrelated info-level issues).
This commit is contained in:
@@ -146,9 +146,18 @@ class _DraggableResizableHudWidgetState extends State<DraggableResizableHudWidge
|
||||
});
|
||||
},
|
||||
onPanEnd: (_) {
|
||||
// FB-09: a rider can still make a widget larger than its title
|
||||
// needs (for a bigger value reading), but never smaller than the
|
||||
// title's own minimum -- clamped here rather than left to the
|
||||
// generic hudMinSpan floor in HudLayoutController.
|
||||
final snappedColSpan =
|
||||
((layout.colSpan * _cellWidth + _resizeDelta.width) / _cellWidth)
|
||||
.round();
|
||||
(((layout.colSpan * _cellWidth + _resizeDelta.width) /
|
||||
_cellWidth)
|
||||
.round())
|
||||
.clamp(
|
||||
minColSpanForLabel(layout.metric.label),
|
||||
hudMaxColSpan,
|
||||
);
|
||||
final snappedRowSpan =
|
||||
((layout.rowSpan * _cellHeight + _resizeDelta.height) /
|
||||
_cellHeight)
|
||||
|
||||
@@ -328,38 +328,41 @@ class _HudMetricValue extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colors = Theme.of(context).colorScheme;
|
||||
// FB-03: FittedBox owns sizing here -- structurally impossible to overflow, so
|
||||
// maxLines/overflow are dropped from both Texts. fontSize: 10/18 below (still
|
||||
// scaled by V3-05/FB-02's mounted-mode [scale]) are now just the "reference" size
|
||||
// FittedBox scales down from at small widget sizes; the ratio between label and
|
||||
// value size is preserved automatically as it scales. Note: BoxFit.scaleDown never
|
||||
// enlarges past that reference size, so a widget resized to the grid's maximum
|
||||
// span still shows the same reference text, just with more empty space around it
|
||||
// -- not larger text filling the space.
|
||||
return FittedBox(
|
||||
fit: BoxFit.scaleDown,
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(
|
||||
metric.label.toUpperCase(),
|
||||
style: TextStyle(
|
||||
fontSize: 10 * scale,
|
||||
letterSpacing: 1,
|
||||
color: colors.onSurfaceVariant,
|
||||
// FB-09: the title is a plain, unwrapped Text at its fixed reference size -- it
|
||||
// must always fit at a readable size, never shrinking along with the value. Only
|
||||
// the value is wrapped in its own FittedBox, inside a Flexible so it claims
|
||||
// whatever vertical space is left after the fixed-size title rather than both
|
||||
// competing for space inside one shared FittedBox as before. maxLines/overflow are
|
||||
// restored on the title as a safety net in case a future label is ever added that
|
||||
// minColSpanForLabel's thresholds under-estimate.
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Text(
|
||||
metric.label.toUpperCase(),
|
||||
style: TextStyle(
|
||||
fontSize: 10 * scale,
|
||||
letterSpacing: 1,
|
||||
color: colors.onSurfaceVariant,
|
||||
),
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Flexible(
|
||||
child: FittedBox(
|
||||
fit: BoxFit.scaleDown,
|
||||
child: Text(
|
||||
_value,
|
||||
style: monoDigits.copyWith(
|
||||
fontSize: 18 * scale,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: _valueColor(colors),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 4),
|
||||
Text(
|
||||
_value,
|
||||
style: monoDigits.copyWith(
|
||||
fontSize: 18 * scale,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: _valueColor(colors),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user