radical/item_layout/icon.lua

117 lines
3.7 KiB
Lua

local setmetatable = setmetatable
local beautiful = require( "beautiful" )
local color = require( "gears.color" )
local cairo = require( "lgi" ).cairo
local wibox = require( "wibox" )
local checkbox = require( "radical.widgets.checkbox" )
local fkey = require( "radical.widgets.fkey" )
local module = {}
local function icon_fit(data,...)
local w,h = wibox.widget.imagebox.fit(...)
return w,data.icon_size or h
end
local function create_item(item,data,args)
--Create the background
local bg = wibox.widget.background()
bg:set_fg(item._private_data.fg)
--Create the main item layout
local l,la,lr = wibox.layout.fixed.vertical(),wibox.layout.align.vertical(),wibox.layout.fixed.horizontal()
local m = wibox.layout.margin(la)
m:set_margins (0)
m:set_left ( data.item_style.margins.LEFT )
m:set_right ( data.item_style.margins.RIGHT )
m:set_top ( data.item_style.margins.TOP )
m:set_bottom( data.item_style.margins.BOTTOM )
local text_w = wibox.widget.textbox()
text_w:set_align("center")
item._private_data._fit = wibox.widget.background.fit
m.fit = function(...)
if item.visible == false or item._filter_out == true then
return 0,0
end
return data._internal.layout.item_fit(data,item,...)
end
if data.fkeys_prefix == true then
local pref = wibox.widget.textbox()
pref.draw = function(self,w, cr, width, height)
cr:set_source(color(beautiful.fg_normal))
cr:paint()
wibox.widget.textbox.draw(self,w, cr, width, height)
end
l:add(pref)
m:set_left ( 0 )
end
if args.prefix_widget then
l:add(args.prefix_widget)
end
local icon_flex = wibox.layout.align.horizontal()
local icon = wibox.widget.imagebox()
icon.fit = function(...) return icon_fit(data,...) end
if args.icon then
icon:set_image(args.icon)
end
icon_flex:set_middle(icon)
l:add(icon_flex)
l:add(text_w)
if item._private_data.sub_menu_f or item._private_data.sub_menu_m then
local subArrow = wibox.widget.imagebox() --TODO, make global
subArrow.fit = function(box, w, h) return subArrow._image:get_width(),item.height end
subArrow:set_image( beautiful.menu_submenu_icon )
lr:add(subArrow)
bg.fit = function(box,w,h,...)
args.y = data.height-h-data.margins.top
return wibox.widget.background.fit(box,w,h,...)
end
end
if item.checkable then
item._internal.get_map.checked = function()
if type(item._private_data.checked) == "function" then
return item._private_data.checked()
else
return item._private_data.checked
end
end
local ck = wibox.widget.imagebox()
ck:set_image(item.checked and checkbox.checked() or checkbox.unchecked())
lr:add(ck)
item._internal.set_map.checked = function (value)
item._private_data.checked = value
ck:set_image(item.checked and checkbox.checked() or checkbox.unchecked())
end
end
if args.suffix_widget then
lr:add(args.suffix_widget)
end
la:set_top(l)
la:set_bottom(lr)
bg:set_widget(m)
item._internal.text_w = text_w
item._internal.icon_w = icon
bg:connect_signal("button::press",function(b,t,s,id,e)
data:emit_signal("button::press",data,item,id)
end)
bg:connect_signal("button::release",function(b,t)
data:emit_signal("button::release",data,item,id)
end)
bg:connect_signal("mouse::enter",function(b,t)
data:emit_signal("mouse::enter",data,item)
end)
bg:connect_signal("mouse::leave",function(b,t)
data:emit_signal("mouse::leave",data,item)
end)
return bg
end
return setmetatable(module, { __call = function(_, ...) return create_item(...) end })
-- kate: space-indent on; indent-width 2; replace-tabs on;