rev |
line source |
bsw/jbe@0
|
1 function ui.bargraph(args)
|
bsw/jbe@19
|
2 local text = ""
|
bsw/jbe@19
|
3 for i, bar in ipairs(args.bars) do
|
bsw/jbe@19
|
4 if #text > 0 then
|
bsw/jbe@19
|
5 text = text .. " / "
|
bsw/jbe@19
|
6 end
|
bsw/jbe@19
|
7 text = text .. tostring(bar.value)
|
bsw/jbe@19
|
8 end
|
bsw/jbe@0
|
9 ui.container{
|
bsw/jbe@0
|
10 attr = {
|
bsw/jbe@19
|
11 class = args.class or "bargraph",
|
bsw/jbe@19
|
12 title = tostring(text)
|
bsw/jbe@0
|
13 },
|
bsw/jbe@0
|
14 content = function()
|
bsw/jbe@19
|
15 local at_least_one_bar = false
|
poelzi@159
|
16 local quorum = args.quorum and args.quorum * args.width / args.max_value or nil
|
poelzi@159
|
17 local length = 0
|
bsw@504
|
18 local rest = 0
|
bsw@504
|
19 local last_visiable_bar = 0
|
bsw@504
|
20 for i, bar in ipairs(args.bars) do
|
bsw@504
|
21 if bar.value > 0 then
|
bsw@504
|
22 last_visiable_bar = i
|
bsw@504
|
23 end
|
bsw@504
|
24 end
|
bsw/jbe@0
|
25 for i, bar in ipairs(args.bars) do
|
bsw@2
|
26 if bar.value > 0 then
|
bsw/jbe@19
|
27 at_least_one_bar = true
|
bsw/jbe@4
|
28 local value = bar.value * args.width / args.max_value
|
poelzi@159
|
29 if quorum and quorum < length + value then
|
poelzi@159
|
30 local dlength = math.max(quorum - length - 1, 0)
|
bsw@504
|
31 local dlength_abs = math.floor(dlength)
|
bsw@504
|
32 local rest = rest + dlength - dlength_abs
|
poelzi@159
|
33 if dlength > 0 then
|
poelzi@159
|
34 ui.container{
|
poelzi@159
|
35 attr = {
|
bsw@504
|
36 style = "width: " .. tostring(dlength_abs) .. "px; background-color: " .. bar.color .. ";",
|
poelzi@159
|
37 },
|
poelzi@159
|
38 content = function() slot.put(" ") end
|
poelzi@159
|
39 }
|
poelzi@159
|
40 end
|
poelzi@159
|
41 ui.container{
|
poelzi@159
|
42 attr = {
|
bsw@500
|
43 class = "quorum",
|
poelzi@159
|
44 style = "width: 1px; background-color: " .. (args.quorum_color or "blue") ..";",
|
poelzi@159
|
45 },
|
bsw@500
|
46 content = function() slot.put("") end
|
poelzi@159
|
47 }
|
poelzi@159
|
48 length = dlength + 1
|
poelzi@159
|
49 value = value - dlength
|
poelzi@159
|
50 quorum = nil
|
poelzi@159
|
51 end
|
bsw@504
|
52 local value_abs = math.floor(value)
|
bsw@504
|
53 rest = rest + value - value_abs
|
bsw@504
|
54 if i == last_visiable_bar then
|
bsw@504
|
55 value_abs = value_abs + rest
|
bsw@504
|
56 end
|
bsw@504
|
57 length = length + value_abs
|
bsw@2
|
58 ui.container{
|
bsw@2
|
59 attr = {
|
bsw@504
|
60 style = "width: " .. tostring(value_abs) .. "px; background-color: " .. bar.color .. ";",
|
bsw@2
|
61 },
|
bsw@2
|
62 content = function() slot.put(" ") end
|
bsw@2
|
63 }
|
bsw@2
|
64 end
|
bsw/jbe@0
|
65 end
|
bsw/jbe@19
|
66 if not at_least_one_bar then
|
bsw/jbe@19
|
67 slot.put(" ")
|
bsw/jbe@19
|
68 end
|
bsw/jbe@0
|
69 end
|
bsw/jbe@0
|
70 }
|
bsw/jbe@0
|
71 end
|