Add global underlay support

This commit is contained in:
Emmanuel Lepage Vallee 2014-03-12 00:31:50 -04:00
parent ad20d9e2be
commit 231eef25bc
11 changed files with 120 additions and 28 deletions

View File

@ -132,6 +132,13 @@ mytextbox:set_tooltip("foo bar")
``` ```
### "Underlay"
The "underlay" is the opposite of an overlay. Think of it as a background label.
Radical add this option to all Awesome widget by calling the `set_underlay`
method. The first argument is the text (or table of string) and the second is
an array with the `style` and `alpha` keys.
## Options ## Options
Radical offer a (very, very) wide range of options to allow the creation of rich Radical offer a (very, very) wide range of options to allow the creation of rich
@ -304,6 +311,8 @@ Radical also use the some of the same theme options as awful.menu, plus some:
| menu_opacity | Use your favorite compositor | Number (0=0%, 1=100%) | | menu_opacity | Use your favorite compositor | Number (0=0%, 1=100%) |
| menu_draw_underlay | Function returning the underlay pixmap | function(array,width) | | menu_draw_underlay | Function returning the underlay pixmap | function(array,width) |
| menu_icon_transformation | The function used to draw the icon | function(image,data,item) | | menu_icon_transformation | The function used to draw the icon | function(image,data,item) |
| underlay_alpha | Alpha for underlays | Number (0 to 1) |
Styling can also be done using the icon_transformation option. This feature Styling can also be done using the icon_transformation option. This feature
allow masks such as desaturation, tinting, invert or some matrix to be applied allow masks such as desaturation, tinting, invert or some matrix to be applied

48
bar.lua
View File

@ -24,39 +24,43 @@ local function set_position(self)
end end
-- Draw the menu background -- Draw the menu background
local function bg_draw(self, w, cr, width, height) -- local function bg_draw(self, w, cr, width, height)
cr:save() -- cr:save()
cr:set_source(color(self._data.bg)) -- cr:set_source(color(self._data.bg))
cr:rectangle(0,0,width,height) -- cr:rectangle(0,0,width,height)
cr:fill() -- cr:fill()
cr:restore() -- cr:restore()
wibox.layout.margin.draw(self, w, cr, width, height) -- wibox.layout.margin.draw(self, w, cr, width, height)
-- end
local function proxy_draw(_,...)
local l = _._internal and _._internal.layout or _
return wibox.layout.fixed.draw(l,...)
end
local function proxy_fit(_,...)
local l = _._internal and _._internal.layout or _
return wibox.layout.fixed.fit(l,...)
end end
local function setup_drawable(data) local function setup_drawable(data)
local internal = data._internal local internal = data._internal
local private_data = internal.private_data local private_data = internal.private_data
--Init
internal.margin = wibox.layout.margin()
internal.margin._data = data
internal.margin.draw = bg_draw
internal.layout = internal.layout_func or wibox.layout.fixed.horizontal() internal.layout = internal.layout_func or wibox.layout.fixed.horizontal()
internal.margin:set_widget(internal.layout)
--Getters --Getters
data.get_x = function() return 0 end data.get_x = function() return 0 end
data.get_y = function() return 0 end data.get_y = function() return 0 end
data.get_width = function() return internal.margin.fix(internal.margin,9999,99) end data.get_width = function() return internal.layout.fit(internal.layout,9999,99) end
data.get_height = function() return beautiful.default_height end data.get_height = function() return beautiful.default_height end
data.get_visible = function() return true end data.get_visible = function() return true end
data.get_direction = function() return "left" end data.get_direction = function() return "left" end
data.get_margins = function() return {left=0,right=0,top=0,bottom=0} end data.get_margins = function() return {left=0,right=0,top=0,bottom=0} end
-- This widget do not use wibox, so setup correct widget interface -- This widget do not use wibox, so setup correct widget interface
data.fit = internal.margin.fit data.fit = internal.layout
data.draw = internal.margin.draw data.draw = internal.layout
-- Swap / Move / Remove -- Swap / Move / Remove
data:connect_signal("item::swapped",function(_,item1,item2,index1,index2) data:connect_signal("item::swapped",function(_,item1,item2,index1,index2)
@ -76,6 +80,10 @@ local function setup_drawable(data)
internal.layout:add(item.widget) internal.layout:add(item.widget)
internal.layout:emit_signal("widget::updated") internal.layout:emit_signal("widget::updated")
end) end)
data:connect_signal("widget::added",function(_,item,widget)
internal.layout:add(widget)
internal.layout:emit_signal("widget::updated")
end)
end end
local function setup_buttons(data,item,args) local function setup_buttons(data,item,args)
@ -143,6 +151,14 @@ local function new(args)
ret:connect_signal("_hidden::changed",function(_,item) ret:connect_signal("_hidden::changed",function(_,item)
item.widget:emit_signal("widget::updated") item.widget:emit_signal("widget::updated")
end) end)
-- rawset(ret,"fit", proxy_fit)
-- rawset(ret,"draw", proxy_draw)
-- rawset(ret,"_fit_geometry_cache", ret._internal.layout._fit_geometry_cache)
-- rawset(ret,"add_signal", function()end)
-- ret._internal.layout:connect_signal("widget::updated",function()
-- ret:emit_signal("widget::updated")
-- end)
return ret,ret._internal.layout return ret,ret._internal.layout
end end

View File

@ -199,9 +199,9 @@ local function add_widget(data,widget,args)
data._internal.widgets[#data._internal.widgets+1] = item data._internal.widgets[#data._internal.widgets+1] = item
data._internal.items[#data._internal.items+1] = {item} data._internal.items[#data._internal.items+1] = {item}
data._internal.layout:add(item) data:emit_signal("widget::added",item,widget)
if data.visible then if data.visible then
local fit_w,fit_h = data._internal.layout:fit() local fit_w,fit_h = data._internal.layout:fit(9999,9999)
data.width = data._internal.width or fit_w data.width = data._internal.width or fit_w
data.height = fit_h data.height = fit_h
end end
@ -274,7 +274,8 @@ local function new(args)
suffix_widget = args.suffix_widget or nil, suffix_widget = args.suffix_widget or nil,
prefix_widget = args.prefix_widget or nil, prefix_widget = args.prefix_widget or nil,
fkeys_prefix = args.fkeys_prefix or false, fkeys_prefix = args.fkeys_prefix or false,
underlay_alpha = args.underlay_alpha or 0.7, underlay_alpha = args.underlay_alpha or beautiful.underlay_alpha or 0.7,
underlay_style = args.underlay_style or nil,
filter_prefix = args.filter_prefix or "Filter:", filter_prefix = args.filter_prefix or "Filter:",
enable_keyboard = (args.enable_keyboard ~= false), enable_keyboard = (args.enable_keyboard ~= false),
max_items = args.max_items or nil, max_items = args.max_items or nil,

View File

@ -160,6 +160,7 @@ local function new(screen)
bg_urgent = beautiful.taglist_bg_image_urgent2, bg_urgent = beautiful.taglist_bg_image_urgent2,
bg_hover = beautiful.menu_bg_focus, bg_hover = beautiful.menu_bg_focus,
disable_markup = true, disable_markup = true,
underlay_style = radical.widgets.underlay.draw_arrow,
overlay = function(data,item,cd,w,h) overlay = function(data,item,cd,w,h)
-- print("foo!") -- print("foo!")
end, end,

View File

@ -1,7 +1,9 @@
local type = type local type = type
local base = require( "wibox.widget.base" ) local base = require( "wibox.widget.base" )
local tooltip = require( "radical.tooltip" ) local tooltip = require( "radical.tooltip" )
local underlay = require( "radical.widgets.underlay")
local aw_button = require( "awful.button" ) local aw_button = require( "awful.button" )
local beautiful = require( "beautiful" )
-- Define some wibox.widget extensions -- Define some wibox.widget extensions
local function set_tooltip(self, text) local function set_tooltip(self, text)
@ -33,12 +35,34 @@ local function set_menu(self,menu,button)
return bt return bt
end end
local function _underlay_draw(self,w, cr, width, height)
cr:save()
local udl = underlay.draw(self._underlay,{height=height,style = self._underlay_style})
cr:set_source_surface(udl,width-udl:get_width()-3)
cr:paint_with_alpha(self._underlay_alpha or beautiful.underlay_alpha or 0.7)
cr:restore()
self._draw_underlay(self,w, cr, width, height)
end
local function set_underlay(self,udl,args)
local args = args or {}
if not self._draw_underlay then
self._draw_underlay = self.draw
self.draw = _underlay_draw
end
self._underlay = udl
self._underlay_style = args.style
self._underlay_alpha = args.alpha
self:emit_signal("widget::updated")
end
-- Do some monkey patching to extend all wibox.widget -- Do some monkey patching to extend all wibox.widget
base._make_widget =base.make_widget base._make_widget =base.make_widget
base.make_widget = function(...) base.make_widget = function(...)
local ret = base._make_widget(...) local ret = base._make_widget(...)
ret.set_tooltip = set_tooltip ret.set_tooltip = set_tooltip
ret.set_menu = set_menu ret.set_menu = set_menu
ret.set_underlay = set_underlay
return ret return ret
end end

View File

@ -27,7 +27,7 @@ end
-- Like an overlay, but under -- Like an overlay, but under
function module.paint_underlay(data,item,cr,width,height) function module.paint_underlay(data,item,cr,width,height)
cr:save() cr:save()
local udl = underlay.draw(item.underlay) local udl = underlay.draw(item.underlay,{style=data.underlay_style,height=height})
cr:set_source_surface(udl,width-udl:get_width()-3) cr:set_source_surface(udl,width-udl:get_width()-3)
cr:paint_with_alpha(data.underlay_alpha) cr:paint_with_alpha(data.underlay_alpha)
cr:restore() cr:restore()

View File

@ -155,6 +155,11 @@ local function new(data)
l.item_fit = item_fit l.item_fit = item_fit
l.setup_key_hooks = module.setup_key_hooks l.setup_key_hooks = module.setup_key_hooks
l.setup_item = module.setup_item l.setup_item = module.setup_item
data:connect_signal("widget::added",function(_,item,widget)
wibox.layout.fixed.add(l,item.widget)
l:emit_signal("widget::updated")
end)
return l return l
end end

View File

@ -271,6 +271,10 @@ local function new(data)
l.widgets[#l.widgets+1] = item.widget l.widgets[#l.widgets+1] = item.widget
l:emit_signal("widget::updated") l:emit_signal("widget::updated")
end) end)
data:connect_signal("widget::added",function(_,item,widget)
wibox.layout.fixed.add(l,item.widget)
l:emit_signal("widget::updated")
end)
data:connect_signal("prefix_widget::added",function(_,widget,args) data:connect_signal("prefix_widget::added",function(_,widget,args)
table.insert(pref_l.widgets,1,widget) table.insert(pref_l.widgets,1,widget)
pref_l:emit_signal("widget::updated") pref_l:emit_signal("widget::updated")

View File

@ -7,4 +7,5 @@ return {
header = require( "radical.widgets.header" ), header = require( "radical.widgets.header" ),
piechart = require( "radical.widgets.piechart" ), piechart = require( "radical.widgets.piechart" ),
separator= require( "radical.widgets.separator"), separator= require( "radical.widgets.separator"),
underlay = require( "radical.widgets.underlay" )
} }

View File

@ -5,20 +5,27 @@ local cairo = require( "lgi" ).cairo
local wibox = require( "wibox" ) local wibox = require( "wibox" )
local beautiful = require( "beautiful" ) local beautiful = require( "beautiful" )
local module = {HORIZONTAL=1,VERTICAL=2}
local function draw(self, w, cr, width, height) local function draw(self, w, cr, width, height)
cr:save() cr:save()
cr:set_source(self._color) cr:set_source(self._color)
cr:rectangle(5,2,width-10,1) if self.direction == module.VERTICAL then
cr:rectangle(2,2,1,height-4)
else
cr:rectangle(5,2,width-10,1)
end
cr:fill() cr:fill()
cr:restore() cr:restore()
end end
local function fit(box, w, h) local function fit(box, w, h)
return w,5 return box.direction == module.VERTICAL and 5 or w,box.direction == module.VERTICAL and h or 5
end end
local function new(menu) local function new(menu,direction)
local bg = wibox.widget.base.make_widget() local bg = wibox.widget.base.make_widget()
bg.direction = direction or module.HORIZONTAL
bg.fit = fit bg.fit = fit
bg._color = color( menu and menu.separator_color or beautiful.border_color or beautiful.fg_normal) bg._color = color( menu and menu.separator_color or beautiful.border_color or beautiful.fg_normal)
bg.draw = draw bg.draw = draw
@ -26,5 +33,5 @@ local function new(menu)
return bg return bg
end end
return setmetatable({}, { __call = function(_, ...) return new(...) end }) return setmetatable(module, { __call = function(_, ...) return new(...) end })
-- kate: space-indent on; indent-width 2; replace-tabs on; -- kate: space-indent on; indent-width 2; replace-tabs on;

View File

@ -28,10 +28,33 @@ local function draw_item(cr,x,y,width,height,padding,args)
cr:restore() cr:restore()
end end
function module.draw_arrow(cr,x,y,width,height,padding,args)
cr:save()
cr:rectangle(x,y,width+padding,height+padding)
cr:clip()
padding=padding/2
local mid = (height-2*padding)/2
cr:move_to(x+mid ,padding)
cr:line_to(x+width-mid,padding)
cr:line_to(x+width ,mid+padding)
cr:line_to(x+width-mid,height-padding)
cr:line_to(x+mid ,height-padding)
cr:line_to(x+0 ,mid+padding)
cr:line_to(x+mid ,padding)
cr:close_path()
cr:set_source(color(args.bg or beautiful.bg_alternate))
cr:fill()
cr:set_source(color(args.fg or beautiful.bg_normal))
cr:set_operator(cairo.Operator.CLEAR)
cr:move_to(x+height/2+2,y+padding/2)
cr:show_layout(pango_l[height])
cr:restore()
end
function module.draw(text,args) function module.draw(text,args)
local args = args or {} local args = args or {}
local padding = beautiful.default_height/3
local height = args.height or (beautiful.menu_height) local height = args.height or (beautiful.menu_height)
local padding = height/4--beautiful.default_height/3
-- Get text height -- Get text height
if not pango_l[height] then if not pango_l[height] then
@ -59,7 +82,8 @@ function module.draw(text,args)
local x = 0 local x = 0
for k,v in ipairs(type(text) == "table" and text or {text}) do for k,v in ipairs(type(text) == "table" and text or {text}) do
pango_l[height].text = v pango_l[height].text = v
draw_item(cr,x,0,ret[k],height,padding,args) local draw_f = args.style or draw_item
draw_f(cr,x,0,ret[k],height,padding,args)
x = x + ret[k] x = x + ret[k]
end end
return img return img