Dk75 isobar3d.module (en)
From Conky PitStop
dk75_isobar3d.module
| Language | English Français |
Isometric bars for One4All project
dk75_isobar3d.module-1.0.tar.gz
--[[
isobar3d.module by dk75
concept - isobar3d by mpeachy
changelog:
v1.0 - initial release (19-10-2012)
--]]
local modname = ...
local M = {}
_G[modname] = M
package.loaded[modname] = M
--[[
###############################################################################
### SETTINGS ###
###############################################################################
--]]
local settings_table = {
{
object = {
name = '${cpu cpu0}',
conky = true,
value = {
warning = 10, -- value.warnig along with fill.colorW and fill.colorA decides if there will be pattern or not (when empty = no pattern)
max = 100, -- maximum value
scale = 'log', -- possible values: nil/'linear' (for linear scale), 'log' (for logaritmic scale) and 'exp' (for inverted logaritmic scale)
print = true, -- bolean: whatever to print value on bar or not (true/false)
},
},
pos = {
x = 240,
y = 440,
},
width = 40,
height = 200,
iso = {
x = 10, -- number of pixels in X axis that bar will be moved to (positive - to the right; negative - to the left)
y = 20, -- number of pixels in X axis that bar will be moved to (positive - to the down; negative - to the up)
},
frames = true, -- whatever frames will be drawn (true/false)
line = {
width = 0.2,
color = 0xffffff,
alpha = 1,
},
fill = {
color = 0x00ff00,
alpha = 0.5,
colorW = 0xffae00, -- color of warning part on pattern (no pattern when empty)
colorA = 0xff0000, -- color of alarm part on pattern (no pattern when empty)
},
text = {
string = "CPU", -- name displayed below the bar
font = "White Rabbit",
size = 14,
style = "normal", -- font style: 'normal', 'italic' and 'oblique'
weight = "normal", -- font weight: 'normal' or 'bold'
color = 0xffffff,
alpha = 1,
align = "center", -- align of text: 'center', 'left, or 'right'
},
},
{
object = {
name = "${hddtemp /dev/sda}",
conky = true,
value = {
warning = 50,
max = 100,
scale = 'linear',
print = true,
},
interval= 15,
},
pos = {
x = 320,
y = 440,
},
width = 40,
height = 200,
iso = {
x = -10,
y = -20,
},
frames = true,
line = {
width = 0.2,
color = 0xffffff,
alpha = 1,
},
fill = {
color = 0x00ff00,
alpha = 0.5,
colorW = 0xffae00,
colorA = 0xff0000,
},
text = {
string = "/dev/sda",
font = "White Rabbit",
size = 14,
style = "normal",
weight = "normal",
color = 0xffffff,
alpha = 1,
align = "center",
},
},
}
--[[
###############################################################################
### END OF SETTINGS ###
###############################################################################
--]]
--[[
###############################################################################
### INITIALIZE ###
###############################################################################
--]]
M.color = one4all_cairo.rgb2rgba
M.exec = one4all_main.os_capture
M.print_text = one4all_cairo.print_text
local _locale = os.setlocale(nil, 'ctype')
os.setlocale(_locale, 'all')
local matrix = cairo_matrix_t:create(); tolua.takeownership(matrix)
local i = nil
for i in pairs(settings_table) do
local t = settings_table[i]
t.fill.value = nil
t.pos.Xiso, t.pos.Yiso = t.pos.x+t.iso.x, t.pos.y+t.iso.y
if t.iso.y>0 then
t.text.x = t.pos.Xiso+t.width/2
t.text.y = t.pos.Yiso+t.text.size/4
t.text.xV = t.pos.x+t.width/2+t.iso.x/2
t.text.yV = t.pos.y+t.text.size/4
else
t.text.x = t.pos.x+t.width/2
t.text.y = t.pos.y+t.text.size/4
t.text.xV = t.pos.Xiso+t.width/2-t.iso.x/2
t.text.yV = t.pos.Yiso+t.text.size/4
end
if not t.line.width then t.line.width=0.5 end
if not t.object.value.scale then t.object.value.scale = nil end
if not tonumber(t.object.interval) then t.object.interval=1 end
if not t.object.value.current then t.object.value.current = 0 end
end
--[[
###############################################################################
--]]
function M.execi(object, interval)
if (tonumber(conky_parse('${updates}')) % interval) == 0 then return M.exec(object, raw)
else return nil end
end
function M.parser(t)
local object_value=nil
if t.object.conky then object_value = tonumber(conky_parse(t.object.name))
else object_value = tonumber(M.execi(t.object.name, t.object.interval)) end
if object_value then t.object.value.current=object_value end
end
function M.scale(value, max, height, scale)
if scale=="log" then value = (height/math.log(max))*math.log(value)
elseif scale=="exp" then value = (height/math.exp(max))*math.exp(value)
else value = (height/max)*value end
if not value or value<=0 or value ~= value then value=0 end
if value>height then value=height end
return value
end
function M.calc_color(t)
local _rS, _gS, _bS, _a, _rE, _gE, _bE = nil
local _percent=M.scale(t.object.value.current, t.object.value.warning, 1, t.object.value.scale)
if _percent<=1 then
_rS, _gS, _bS, _a = M.color(t.fill.color, 1)
_rE, _gE, _bE, _a = M.color(t.fill.colorW, 1)
else
_percent=M.scale(t.object.value.current-t.object.value.warning, t.object.value.max-t.object.value.warning, 1, t.object.value.scale)
_rS, _gS, _bS, _a = M.color(t.fill.colorW, 1)
_rE, _gE, _bE, _a = M.color(t.fill.colorA, 1)
end
local _red = tonumber(_rS+(_rE-_rS)*_percent); if _red>1 then _red=1 elseif _red<0 then _red=0 end
local _green = tonumber(_gS+(_gE-_gS)*_percent); if _green>1 then _green=1 elseif _green<0 then _green=0 end
local _blue = tonumber(_bS+(_bE-_bS)*_percent); if _blue>1 then _blue=1 elseif _blue<0 then _blue=0 end
return _red, _green, _blue, t.fill.alpha
end
function M.draw_box(t, x, y, width, height, trans, frames)
cairo_set_line_width(cr, t.line.width)
cairo_set_source_rgba(cr, M.color(t.line.color, t.line.alpha))
cairo_save(cr)
cairo_translate(cr, x, y)
if trans=="y" then
cairo_matrix_init(matrix,
1, t.iso.y/width,
0, 1,
0, 0)
cairo_transform(cr, matrix)
elseif trans=="x" then
cairo_matrix_init(matrix,
1, 0,
t.iso.x/height, 1,
0, 0)
cairo_transform(cr, matrix)
end
cairo_rectangle(cr, 0, 0, width, -height)
if not frames then
if t.fill.pat then
if y==t.pos.Yiso-t.fill.value then cairo_set_source_rgba(cr, M.calc_color(t))
else cairo_set_source(cr, t.fill.pat) end
else cairo_set_source_rgba(cr, M.color(t.fill.color, t.fill.alpha)) end
cairo_fill_preserve(cr)
cairo_set_source_rgba(cr, M.color(t.line.color, t.line.alpha))
end
cairo_stroke(cr)
cairo_restore(cr)
end
function M.isobar3d(t)
t.fill.value=M.scale(t.object.value.current, t.object.value.max, t.height, t.object.value.scale)
if t.frames then M.draw_box(t, t.pos.x, t.pos.y, t.width, t.height, nil, true) end -- back frame
--M.draw_box(t, t.pos.x, t.pos.y, t.width, t.fill.value, false, false) -- back fill
if t.iso.x>0 and t.iso.y>0 then -- right/down
if t.frames then M.draw_box(t, t.pos.Xiso, t.pos.Yiso, t.width, t.iso.y, "x", true) end -- bottom frame
M.draw_box(t, t.pos.Xiso, t.pos.Yiso, t.width, t.iso.y, "x") -- bottom fill
M.draw_box(t, t.pos.x, t.pos.y, t.iso.x, t.fill.value, "y") -- left side fill
M.draw_box(t, t.pos.Xiso, t.pos.Yiso-t.fill.value, t.width, t.iso.y, "x") -- top fill
if t.frames then M.draw_box(t, t.pos.Xiso, t.pos.Yiso-t.height, t.width, t.iso.y, "x", true) end -- top frame
end
if t.iso.x<0 and t.iso.y>0 then --left/down
if t.frames then M.draw_box(t, t.pos.Xiso, t.pos.Yiso, t.width, t.iso.y, "x", true) end -- bottom frame
M.draw_box(t, t.pos.Xiso, t.pos.Yiso, t.width, t.iso.y, "x") -- bottom fill
M.draw_box(t, t.pos.x+t.width, t.pos.y, t.iso.x, t.fill.value, "y") -- right side fill
M.draw_box(t, t.pos.Xiso, t.pos.Yiso-t.fill.value, t.width, t.iso.y, "x") -- top fill
if t.frames then M.draw_box(t, t.pos.Xiso, t.pos.Yiso-t.height, t.width, t.iso.y, "x", true) end -- top frame
end
if t.iso.x>0 and t.iso.y<0 then -- right/up
if t.frames then M.draw_box(t, t.pos.Xiso, t.pos.Yiso-t.height, t.width, t.iso.y, "x", true) end -- top frame
M.draw_box(t, t.pos.Xiso, t.pos.Yiso-t.fill.value, t.width, t.iso.y, "x") -- top fill
M.draw_box(t, t.pos.x, t.pos.y, t.iso.x, t.fill.value, "y") -- left side fill
M.draw_box(t, t.pos.Xiso, t.pos.Yiso, t.width, t.iso.y, "x") -- bottom fill
if t.frames then M.draw_box(t, t.pos.Xiso, t.pos.Yiso, t.width, t.iso.y, "x", true) end -- bottom frame
end
if t.iso.x<0 and t.iso.y<0 then --left/up
if t.frames then M.draw_box(t, t.pos.Xiso, t.pos.Yiso-t.height, t.width, t.iso.y, "x", true) end -- top frame
M.draw_box(t, t.pos.Xiso, t.pos.Yiso-t.fill.value, t.width, t.iso.y, "x") -- top fill
M.draw_box(t, t.pos.x+t.width, t.pos.y, t.iso.x, t.fill.value, "y") -- right side fill
M.draw_box(t, t.pos.Xiso, t.pos.Yiso, t.width, t.iso.y, "x") -- bottom fill
if t.frames then M.draw_box(t, t.pos.Xiso, t.pos.Yiso, t.width, t.iso.y, "x", true) end -- bottom frame
end
M.draw_box(t, t.pos.Xiso, t.pos.Yiso, t.width, t.fill.value, nil) -- front fill
if t.frames then M.draw_box(t, t.pos.Xiso, t.pos.Yiso, t.width, t.height, nil, true) end -- front frame
M.print_text(cr, t.text.x, t.text.y, t.text.string, t.text.color, t.text.alpha, t.text.font, t.text.size, t.text.style, t.text.weight, t.text.align, "top")
if t.object.value.print then
M.print_text(cr, t.text.xV, t.text.yV-t.fill.value, tostring(t.object.value.current), t.text.color, t.text.alpha, t.text.font, t.text.size, t.text.style, t.text.weight, t.text.align, "top")
end
end
--[[
###############################################################################
### INITIALIZE ###
###############################################################################
--]]
local i = nil
for i in pairs(settings_table) do
local t = settings_table[i]
if t.object.value.warning and t.object.value.max and t.fill.colorW and t.fill.colorA then
local _offset = nil
t.fill.pat = cairo_pattern_create_linear(0, 0, 0, -t.height)
cairo_pattern_add_color_stop_rgba(t.fill.pat, 0, M.color(t.fill.color, t.fill.alpha))
cairo_pattern_add_color_stop_rgba(t.fill.pat, M.scale(t.object.value.warning, t.object.value.max, 1, t.object.value.scale), M.color(t.fill.colorW, t.fill.alpha))
cairo_pattern_add_color_stop_rgba(t.fill.pat, 1, M.color(t.fill.colorA, t.fill.alpha))
end
end
--[[
###############################################################################
### MODULE MAIN LOOP ###
###############################################################################
--]]
function M.main()
for i in pairs(settings_table) do
M.parser(settings_table[i])
M.isobar3d(settings_table[i])
end
end
