aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--widgets/clock.lua28
1 files changed, 23 insertions, 5 deletions
diff --git a/widgets/clock.lua b/widgets/clock.lua
index 01f6012..ba8f37a 100644
--- a/widgets/clock.lua
+++ b/widgets/clock.lua
@@ -27,11 +27,29 @@ function M.draw(cr, rect, colors)
local date_size = clamp(inner.w * 0.050, 11, 24)
local date_band = day_size * 1.6 + date_size * 1.8
- -- Two stacked numerals fill the space above the date band. Whichever of
- -- height and width binds first wins, so a wide short cell is limited by its
- -- height and a narrow tall one by its width, and neither overflows.
+ -- Two stacked numerals fill the space above the date band.
+ --
+ -- The divisor is derived, not tuned: the first baseline sits at 0.78 of the
+ -- size (cap height) and the second a further 0.92 below it, so the pair
+ -- occupies size * 1.70. Dividing the available height by that is what makes
+ -- the numerals actually reach the date band instead of leaving a gap; the
+ -- earlier flat 0.46 left a fifth of the band empty.
+ --
+ -- Whichever of height and width binds first wins, so a wide short cell is
+ -- limited by its height and a narrow tall one by its width, and neither
+ -- overflows.
+ -- The width cap is the font's, measured rather than guessed: two Oswald
+ -- digits are 1.00x the font size wide (measured at size 100: '00' is 100.0px,
+ -- the widest pair '88' is 98.0px), so the size a width w permits is w itself,
+ -- less a little breathing room at the card edges.
local avail = (bottom - date_band) - inner.y
- local size = math.min(avail * 0.46, inner.w * 0.95)
+ local size = math.min(avail / 1.70, inner.w * 0.92)
+
+ -- A narrow tall cell is width-bound, which leaves the numerals floating well
+ -- above the date. Centre the pair in the space they cannot fill instead of
+ -- hanging them from the top, so the slack sits above and below them equally.
+ local slack = avail - size * 1.70
+ if slack < 0 then slack = 0 end
card.font(cr, card.FONT_CLOCK, size, true)
card.rgba(cr, colors.body)
@@ -39,7 +57,7 @@ function M.draw(cr, rect, colors)
-- Baselines. Cairo's y is the baseline, so the first sits one cap-height
-- down; 0.78 of the font size approximates cap height for Noto Sans and
-- avoids measuring every frame.
- local y1 = inner.y + size * 0.78
+ local y1 = inner.y + slack / 2 + size * 0.78
-- Tight leading, as in the mockup: the numerals nearly touch.
local y2 = y1 + size * 0.92