-- 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.030, 10, 16) local big_size = clamp(inner.w * 0.075, 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.2 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