1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
-- Cache: ~/.cache total and its four largest subdirectories.
--
-- Reads a cache file written by bin/cache-sample.sh. du walks the tree and
-- costs about 100ms, which cannot happen on a 2-second draw.
local card = require 'lib.card'
local data = require 'lib.data'
local CACHE = (os.getenv('XDG_CACHE_HOME') or (os.getenv('HOME') .. '/.cache'))
.. '/udt/cachesize.txt'
local M = {}
function M.draw(cr, rect, colors)
local inner = card.card(cr, rect, colors)
local function clamp(v, lo, hi) return math.max(lo, math.min(hi, v)) end
local label_size = clamp(inner.w * 0.036, 10, 16)
local big_size = clamp(inner.w * 0.095, 22, 46)
card.font(cr, card.FONT_MONO, label_size, false)
card.rgba(cr, colors.label)
card.text(cr, inner.x, inner.y + label_size, 'CACHE')
local c = data.du_parse(data.slurp(CACHE) or '')
if not c then
card.rgba(cr, colors.label)
card.font(cr, card.FONT_UI, label_size * 1.2, true)
card.text(cr, inner.x, inner.y + label_size * 3.4, 'no cache data')
card.font(cr, card.FONT_MONO, label_size, false)
card.text(cr, inner.x, inner.y + label_size * 5, 'bin/cache-sample.sh')
return
end
card.font(cr, card.FONT_HEAVY, big_size, false)
card.rgba(cr, colors.body)
card.text(cr, inner.x, inner.y + label_size + big_size, c.total.label)
local ey = inner.y + label_size + big_size + label_size * 2
local step = label_size * 2.6
card.font(cr, card.FONT_MONO, label_size, false)
for i, e in ipairs(c.items) do
if ey + step > inner.y + inner.h then break end
-- The biggest offender is the point of the card, so it carries colour:
-- critical when it is over half the total, warning otherwise. The rest
-- stay in the ordinary value colour so the eye lands on the one to delete.
local colour = colors.value
if i == 1 then
local share = c.total.bytes > 0 and (e.bytes / c.total.bytes) or 0
colour = share > 0.5 and colors.critical or colors.warning
end
card.rgba(cr, colors.label)
-- Long names are truncated rather than allowed to collide with the size.
local name = e.name
if #name > 18 then name = name:sub(1, 17) .. '\u{2026}' end
card.text(cr, inner.x, ey, name)
card.rgba(cr, colour)
card.text_right(cr, inner.x + inner.w, ey, e.label)
ey = ey + step
end
end
return M
|