2016-03-07 06:41:47 +00:00
|
|
|
--[[--
|
|
|
|
Widget for displaying progress bar.
|
|
|
|
|
|
|
|
Configurable attributes:
|
|
|
|
|
|
|
|
* width
|
|
|
|
* height
|
|
|
|
* margin_v -- vertical margin for solid infill
|
|
|
|
* margin_h -- horizontal margin for solid infill
|
|
|
|
* radius
|
|
|
|
* bordersize
|
|
|
|
* bordercolor
|
|
|
|
* bgcolor
|
|
|
|
* rectcolor -- infill color
|
|
|
|
* ticks (list) -- default to nil, use this if you want to insert markers
|
|
|
|
* tick_width
|
2016-04-21 06:16:40 +00:00
|
|
|
* last -- maximum tick, used with ticks
|
2016-03-07 06:41:47 +00:00
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
local foo_bar = ProgressWidget:new{
|
2017-09-11 08:32:39 +00:00
|
|
|
width = Screen:scaleBySize(400),
|
|
|
|
height = Screen:scaleBySize(10),
|
2016-03-07 06:41:47 +00:00
|
|
|
percentage = 50/100,
|
|
|
|
}
|
|
|
|
UIManager:show(foo_bar)
|
|
|
|
|
|
|
|
]]
|
|
|
|
|
2014-10-22 13:34:11 +00:00
|
|
|
local Blitbuffer = require("ffi/blitbuffer")
|
2017-09-11 08:32:39 +00:00
|
|
|
local Geom = require("ui/geometry")
|
|
|
|
local Widget = require("ui/widget/widget")
|
|
|
|
local Screen = require("device").screen
|
2013-03-12 17:18:53 +00:00
|
|
|
|
2013-10-18 20:38:07 +00:00
|
|
|
local ProgressWidget = Widget:new{
|
2014-03-13 13:52:43 +00:00
|
|
|
width = nil,
|
|
|
|
height = nil,
|
2017-09-11 08:32:39 +00:00
|
|
|
margin_h = Screen:scaleBySize(3),
|
|
|
|
margin_v = Screen:scaleBySize(1),
|
|
|
|
radius = Screen:scaleBySize(2),
|
|
|
|
bordersize = Screen:scaleBySize(1),
|
2014-10-22 13:34:11 +00:00
|
|
|
bordercolor = Blitbuffer.COLOR_BLACK,
|
|
|
|
bgcolor = Blitbuffer.COLOR_WHITE,
|
2019-03-14 19:58:45 +00:00
|
|
|
rectcolor = Blitbuffer.COLOR_DIM_GRAY,
|
2014-03-13 13:52:43 +00:00
|
|
|
percentage = nil,
|
2016-03-07 06:41:47 +00:00
|
|
|
ticks = nil,
|
2017-09-11 08:32:39 +00:00
|
|
|
tick_width = Screen:scaleBySize(3),
|
2014-08-09 06:58:44 +00:00
|
|
|
last = nil,
|
2013-03-12 17:18:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function ProgressWidget:getSize()
|
2014-03-13 13:52:43 +00:00
|
|
|
return { w = self.width, h = self.height }
|
2013-03-12 17:18:53 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
function ProgressWidget:paintTo(bb, x, y)
|
2014-03-13 13:52:43 +00:00
|
|
|
local my_size = self:getSize()
|
|
|
|
self.dimen = Geom:new{
|
|
|
|
x = x, y = y,
|
|
|
|
w = my_size.w,
|
2014-08-11 03:09:45 +00:00
|
|
|
h = my_size.h
|
2014-03-13 13:52:43 +00:00
|
|
|
}
|
2017-04-11 09:44:58 +00:00
|
|
|
if self.dimen.w == 0 or self.dimen.h == 0 then return end
|
|
|
|
|
2016-03-07 06:41:47 +00:00
|
|
|
-- fill background
|
2014-03-13 13:52:43 +00:00
|
|
|
bb:paintRoundedRect(x, y, my_size.w, my_size.h, self.bgcolor, self.radius)
|
2016-03-07 06:41:47 +00:00
|
|
|
-- paint border
|
|
|
|
bb:paintBorder(x, y,
|
|
|
|
my_size.w, my_size.h,
|
|
|
|
self.bordersize, self.bordercolor, self.radius)
|
|
|
|
-- paint percentage infill
|
2018-04-27 20:22:33 +00:00
|
|
|
if self.percentage >= 0 and self.percentage <= 1 then
|
|
|
|
bb:paintRect(x+self.margin_h, math.ceil(y+self.margin_v+self.bordersize),
|
2016-03-07 06:41:47 +00:00
|
|
|
math.ceil((my_size.w-2*self.margin_h)*self.percentage),
|
|
|
|
my_size.h-2*(self.margin_v+self.bordersize), self.rectcolor)
|
2018-04-27 20:22:33 +00:00
|
|
|
end
|
|
|
|
if self.ticks and self.last and self.last > 0 then
|
2016-10-04 17:37:41 +00:00
|
|
|
local bar_width = (my_size.w-2*self.margin_h)
|
|
|
|
local y_pos = y + self.margin_v + self.bordersize
|
|
|
|
local bar_height = my_size.h-2*(self.margin_v+self.bordersize)
|
2016-03-07 06:41:47 +00:00
|
|
|
for i=1, #self.ticks do
|
|
|
|
bb:paintRect(
|
2017-10-20 15:49:13 +00:00
|
|
|
x + bar_width*(self.ticks[i]/self.last) + self.margin_h,
|
2016-10-04 17:37:41 +00:00
|
|
|
y_pos,
|
2016-03-07 06:41:47 +00:00
|
|
|
self.tick_width,
|
2016-10-04 17:37:41 +00:00
|
|
|
bar_height,
|
2016-03-07 06:41:47 +00:00
|
|
|
self.bordercolor)
|
|
|
|
end
|
2014-08-09 06:58:44 +00:00
|
|
|
end
|
2013-03-12 17:18:53 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
function ProgressWidget:setPercentage(percentage)
|
2014-03-13 13:52:43 +00:00
|
|
|
self.percentage = percentage
|
2013-03-12 17:18:53 +00:00
|
|
|
end
|
|
|
|
|
2019-10-10 15:02:28 +00:00
|
|
|
function ProgressWidget:updateStyle(thick, height)
|
|
|
|
if thick then
|
|
|
|
if height then
|
|
|
|
self.height = Screen:scaleBySize(height)
|
|
|
|
end
|
|
|
|
self.margin_h = Screen:scaleBySize(3)
|
|
|
|
self.margin_v = Screen:scaleBySize(1)
|
|
|
|
self.bordersize = Screen:scaleBySize(1)
|
|
|
|
self.radius = Screen:scaleBySize(2)
|
|
|
|
self.bgcolor = Blitbuffer.COLOR_WHITE
|
|
|
|
else
|
|
|
|
if height then
|
|
|
|
self.height = Screen:scaleBySize(height)
|
|
|
|
end
|
|
|
|
self.margin_h = 0
|
|
|
|
self.margin_v = 0
|
|
|
|
self.bordersize = 0
|
|
|
|
self.radius = 0
|
|
|
|
self.bgcolor = Blitbuffer.COLOR_GRAY
|
|
|
|
self.ticks = nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-10-18 20:38:07 +00:00
|
|
|
return ProgressWidget
|