harmattan version.
[monky] / data / box.lua
diff --git a/data/box.lua b/data/box.lua
new file mode 100644 (file)
index 0000000..4eda773
--- /dev/null
@@ -0,0 +1,309 @@
+--[[BOX WIDGET v1.0 by Wlourf 19/12/2010
+This widget can drawn some boxes, even circles in your conky window
+http://u-scripts.blogspot.com/ (HowTo coming soon)
+
+Inspired by Background by londonali1010 (2009)
+
+The parameters (all optionals) are :
+x           - x coordinate of top-left corner of the box, default = 0 = (top-left corner of conky window)
+y           - y coordinate of top-left corner of the box, default = 0 = (top-left corner of conky window)
+w           - width of the box, default = width of the conky window
+h           - height of the box, default = width of the conky window
+radius      - radius of the corner, default = 0 = no radius
+mode        - mode for drawing the radius, possible values are "circle" or "curve", default ="curve"
+linear_gradient - table with the coordinates of two points to define a linear gradient,
+                  points are relative to top-left corner of the box, (not the conky window)
+                  {x1,y1,x2,y2}
+radial_gradient - table with the coordinates of two circle to define a radial gradient,
+             colour={{0,0xCCCCCC,1},{1,0xCCCCCC,0}}     points are relative to top-left corner of the box, (not the conky window)
+                  {x1,y1,r1,x2,y2,r2} (r=radius)
+colour      - table of colours, default = plain white {{1,0xFFFFFF,1}}
+              this table contains one or more tables with format {P,C,A}
+              P=position of gradient (0 = start of the gradient, 1= end of the gradient)
+              C=hexadecimal colour 
+              A=alpha (opacity) of color (0=invisible,1=opacity 100%)
+              Examples :
+              for a plain color {{1,0x00FF00,0.5}}
+              for a gradient with two colours {{0,0x00FF00,0.5},{1,0x000033,1}}
+              or {{0.5,0x00FF00,1},{1,0x000033,1}} -with this one, gradient will start in the middle
+              for a gradient with three colours {{0,0x00FF00,0.5},{0.5,0x000033,1},{1,0x440033,1}}
+              and so on ...
+
+
+
+To call this script in Conky, use (assuming you have saved this script to ~/scripts/):
+    lua_load ~/scripts/draw_bg.lua
+    lua_draw_hook_pre main_box
+    
+And leave one line blank or not after TEXT
+
+Changelog:
++ v1.0 -- Original release (19.12.2010)
+]]
+
+-- Change these settings to affect your background.
+
+table_settings={
+    {   
+        x=5,
+        y=57,
+        h=40,
+        w=650,
+        linear_gradient = {300,200,550,350},
+        colour = {{0,0x000000,0.5},{1,0x000000,0.5}},
+        radius=20,
+    },
+    {   
+        x=315,
+        y=100,
+        h=90,
+        w=485,
+        linear_gradient = {300,200,550,350},
+        colour = {{0,0x000000,0.2},{1,0x000000,0.1}},
+        radius=20,
+    },
+    {   
+        x=5,
+        y=192,
+        h=44,
+        w=795,
+        linear_gradient = {300,200,550,350},
+        colour = {{0,0x000000,0.4},{1,0x000000,0.1}},
+        radius=20,
+    },
+    {   
+        x=5,
+        y=355,
+        h=125,
+        w=795,
+        colour = {{0,0x000000,0.25}},
+        radius=20,
+     },
+    {   
+        x=5,
+        y=240,
+        h=110,
+        w=795,
+        colour = {{0,0x000000,0.4}},
+        radius=20,
+    },
+
+--[[
+    { --backgound with gradient
+        radius=25,
+        mode="circle",
+        linear_gradient = {300,200,550,350},
+        colour={{0,0xCCCCCC,1},{1,0xCCCCCC,0}}
+    },
+
+
+
+
+    { --pink rounded box
+        x=25,
+        y=150,
+        h=200,
+        w=100,
+        colour = {{O,0xff00ff,0.5}},
+        radius=30,
+        mode="circle"
+     }, 
+    { --border for pink rounded box
+        x=25,
+        y=150,
+        h=200,
+        w=100,
+        radius=30,
+        border=3,
+        mode="circle",
+        colour={
+                {0,0x0000CC,1},
+                },    
+         },
+     
+    {  --box with linear gradient
+        x=150,
+        y=150,
+        h=100,
+        w=100,
+        linear_gradient = {50,0,50,100 },
+        colour={
+                    {0,0xffff00,1},
+                    {0.5,0xff0000,1},                
+                    {1,0xff00ff,1},
+        },   
+     },
+     
+     { --box with radial gradient
+        x=150,
+        y=270,
+        h=100,
+        w=100,
+        radius=10,
+        radial_gradient = {20,20,0,20,20,100 },
+        colour={
+                    {0,0xff0000,1},
+                    {1,0xffff00,1},
+                    },   
+        mode="circle",
+        border=0
+     },
+    { --border for above box --gradient are inversed
+        x=150,
+        y=270,
+        h=100,
+        w=100,
+        radius=10,
+        radial_gradient = {20,20,0,20,20,100 },
+        colour={
+                    {1,0xff0000,1},
+                    {0,0xffff00,1},
+                    },   
+        mode="circle",
+        border=5
+     },
+
+
+    { --oh my god, a circle with radial gradient
+        x=300, y=30,
+        w=100,h=100,
+        mode="circle",
+        radius=50,
+        radial_gradient = {50,50,0,50,50,50 },        
+        colour={
+            {0,0xff0000,1},
+            {1,0xffff00,1},
+            },         
+    },
+
+    { --no name for this one ! radius > w or h !
+        x=300, y=250,
+        w=100,h=100,
+        mode="circle",
+        radius=100,
+        radial_gradient = {50,50,0,50,50,50 },        
+        colour={
+            {0,0xff0000,1},
+            {0.5,0x0000ff,1},            
+            {1,0xffff00,1},
+            }, 
+    },
+]]
+
+
+  }
+
+---------END OF PARAMETERS
+    
+require 'cairo'
+
+
+    
+function conky_main_box()
+    if conky_window==nil then return end
+    local cs=cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)
+    cr=cairo_create(cs)
+    
+    for i in pairs(table_settings) do
+        draw_bg (table_settings[i])
+    end
+    
+    cairo_destroy(cr)
+    cairo_surface_destroy(cs)    
+end
+    
+function draw_bg(t)
+    function rgba_to_r_g_b_a(tc)
+        --tc={position,colour,alpha}
+        local colour = tc[2]
+        local alpha = tc[3]
+        return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
+    end
+
+    local PI = math.pi
+
+    --check values and set default values
+    if t.x == nil then t.x = 0 end
+    if t.y == nil then t.y = 0 end
+    if t.w == nil then t.w = conky_window.width end
+    if t.h == nil then t.h = conky_window.height end
+    if t.radius == nil then t.radius = 0 end
+    if t.border == nil then t.border = 0 end
+    if t.colour==nil then t.colour={{1,0xFFFFFF,1}} end
+    if t.linear_gradient ~= nil then 
+        if #t.linear_gradient ~= 4 then
+            t.linear_gradient = {t.x,t.y,t.width,t.height}
+        end
+    end 
+    if t.radial_gradient ~= nil then 
+        if #t.radial_gradient ~= 6 then
+            t.radial_gradient = {t.x,t.y,0, t.x,t.y, t.width}
+        end
+    end 
+    
+    for i=1, #t.colour do    
+        if #t.colour[i]~=3 then 
+            print ("error in color table")
+            t.colour[i]={1,0xFFFFFF,1} 
+        end
+    end
+
+    --for better reading
+    t.linear = t.linear_gradient
+    t.radial = t.radial_gradient
+    t.no_gradient = (t.linear == nil ) and (t.radial == nil )
+
+    cairo_save(cr)
+    cairo_translate(cr, t.x, t.y)
+
+    if t.radius>0 then
+        if t.mode=="circle" then
+            cairo_arc(cr, t.radius, t.radius, t.radius, -PI, -PI/2)
+            cairo_line_to(cr,t.w-t.radius,0)
+            cairo_arc(cr, t.w-t.radius, t.radius, t.radius, -PI/2,0)
+            cairo_line_to(cr,t.w,t.h-t.radius)
+            cairo_arc(cr, t.w-t.radius, t.h-t.radius, t.radius, 0,PI/2)
+            cairo_line_to(cr,t.radius,t.h)
+            cairo_arc(cr, t.radius, t.h-t.radius, t.radius, PI/2,-PI)        
+            cairo_line_to(cr,0,t.radius) 
+        else
+            cairo_move_to(cr,   t.radius,     0)
+            cairo_line_to(cr,   t.w-t.radius, 0)
+            cairo_curve_to(cr,  t.w,    0,  t.w,    0,  t.w,    t.radius)
+            cairo_line_to(cr,   t.w,    t.h-t.radius)
+            cairo_curve_to(cr,  t.w,    t.h,    t.w,    t.h,    t.w -   t.radius, t.h)
+            cairo_line_to(cr,   t.radius, t.h)
+            cairo_curve_to(cr,  0,  t.h,    0,  t.h,    0,  t.h-t.radius)
+            cairo_line_to(cr,   0,  t.radius)
+            cairo_curve_to(cr,  0,  0,  0,  0,  t.radius,0)
+        end
+        cairo_close_path(cr)
+    else
+        cairo_rectangle(cr,0,0,t.w,t.h)
+    end
+    
+    if t.no_gradient then
+        cairo_set_source_rgba(cr,rgba_to_r_g_b_a(t.colour[1]))
+    else
+        if t.linear ~= nil then
+            pat = cairo_pattern_create_linear (t.linear[1],t.linear[2],t.linear[3],t.linear[4])
+        elseif t.radial ~= nil then
+            pat = cairo_pattern_create_radial (t.radial[1],t.radial[2],t.radial[3],t.radial[4],t.radial[5],t.radial[6])
+        end
+        for i=1, #t.colour do
+            cairo_pattern_add_color_stop_rgba (pat, t.colour[i][1], rgba_to_r_g_b_a(t.colour[i]))
+        end
+        cairo_set_source (cr, pat)
+        cairo_pattern_destroy(pat)
+    end
+    
+    if t.border>0 then
+        cairo_set_line_width(cr,t.border)
+        cairo_stroke(cr)
+    else
+        cairo_fill(cr)
+    end
+    
+    cairo_restore(cr)
+end
+