local diaphragm = require("diaphragm") -- TODO: anyone can use metatable? local Blocks = diaphragm.Drawable:new() Blocks.elements = {} Blocks.unit_width = diaphragm.float() function Blocks:draw() local len = #self.elements assert(len >= 1, "Blocks must have at least 1 element") local total_grow = 0 for el in self.elements do total_grow = el.grow or 1 end diaphragm.constrain(self.width == self.unit_width * total_grow) local param = self.elements[0] -- TODO: this would be written with layout.hstack local block = diaphragm.shape.Rectangle:new() block.fill(param.color) diaphragm.constrain(block.left() == self.left()) diaphragm.constrain(block.top() == self.top()) diaphragm.constrain(block.bottom() == self.bottom()) diaphragm.constrain(block.width() == (param.grow or 1) * self.unit_width) block.draw() local previous_right = block.right() for i = 2, len do param = self.elements[i] block = diaphragm.shape.Rectangle:new() block.fill(param.color) diaphragm.constrain(block.left() == previous_right) diaphragm.constrain(block.top() == self.top()) diaphragm.constrain(block.bottom() == self.bottom()) diaphragm.constrain(block.width() == (param.grow or 1) * self.unit_width) block.draw() previous_right = block.right() end end -- Library ---------- local function block(color) local res = diaphragm.shape.Rectangle:new() res.fill(color) return res end local function blocks_by_len(count, color) local res = {} for i = 1, count do res[i] = block(color) end -- TODO: rename cons? Misleading diaphragm.cons.same_size(res) return diaphragm.layout.hstack(res) end local function layer(config) local name = config.name or "" local entries = config.entries or {} -- TODO: how to do it without box? -- TODO: implement union or combine -- probably combine because -- union could remove some -- strokes return diaphragm.layout.box({}) end -- Parameters ------------- local blue = diaphragm.color.from_rgb(0.35, 0.35, 1.) local active_txn_count = 5 -- Log API ---------- local log_api = layer({ name = "LogAPI", entries = { { name = "activeTxn", content = blocks_by_len(active_txn_count, blue), }, }, }) -- Group Commit --------------- -- local group_commit = nil -- Disk Log ----------- -- local disk_log = nil -- Applier ---------- -- local applier = nil diaphragm.draw(diaphragm.layout.vstack({ log_api, -- group_commit, -- disk_log, -- applier, }))