2013-07-21 10:15:56 +02:00
|
|
|
local base = require( "radical.base" )
|
|
|
|
local print = print
|
|
|
|
local unpack = unpack
|
|
|
|
local debug = debug
|
|
|
|
local type = type
|
|
|
|
local setmetatable = setmetatable
|
|
|
|
local color = require( "gears.color" )
|
|
|
|
local wibox = require( "wibox" )
|
|
|
|
local beautiful = require( "beautiful" )
|
|
|
|
local cairo = require( "lgi" ).cairo
|
|
|
|
local awful = require( "awful" )
|
|
|
|
local util = require( "awful.util" )
|
|
|
|
local button = require( "awful.button" )
|
|
|
|
local layout = require( "radical.layout" )
|
|
|
|
local checkbox = require( "radical.widgets.checkbox" )
|
|
|
|
local classic_style = require( "radical.style.classic" )
|
|
|
|
|
|
|
|
local capi,module = { mouse = mouse , screen = screen , keygrabber = keygrabber },{}
|
|
|
|
|
|
|
|
local function setup_drawable(data)
|
|
|
|
local internal = data._internal
|
|
|
|
local get_map,set_map,private_data = internal.get_map,internal.set_map,internal.private_data
|
2014-02-02 06:35:50 +01:00
|
|
|
|
|
|
|
-- An embeded menu can only be visible if the parent is
|
|
|
|
get_map.visible = function() return data._embeded_parent and data._embeded_parent.visible or false end --Let the parent handle that
|
2013-12-31 22:13:11 +01:00
|
|
|
set_map.visible = function(v) if data._embeded_parent then data._embeded_parent.visible = v end end
|
2014-02-02 06:35:50 +01:00
|
|
|
|
|
|
|
-- Enumate geometry --BUG this is fake, but better than nothing
|
|
|
|
get_map.width = function() return data._embeded_parent and data._embeded_parent.width end
|
|
|
|
get_map.y = function() return data._embeded_parent and data._embeded_parent.y end
|
|
|
|
get_map.x = function() return data._embeded_parent and data._embeded_parent.x end
|
2013-07-21 10:15:56 +02:00
|
|
|
if not data.layout then
|
|
|
|
data.layout = layout.vertical
|
|
|
|
end
|
|
|
|
internal.layout = data.layout(data)
|
|
|
|
data.width,data.height = data._internal.layout:fit()
|
2014-02-02 06:35:50 +01:00
|
|
|
data.margins={left=0,right=0,bottom=0,top=0}
|
2013-07-21 10:15:56 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
local function setup_item(data,item,args)
|
|
|
|
local f = (data._internal.layout.setup_item) or (layout.vertical.setup_item)
|
|
|
|
f(data._internal.layout,data,item,args)
|
|
|
|
local buttons = {}
|
|
|
|
for i=1,10 do
|
|
|
|
if args["button"..i] then
|
|
|
|
buttons[#buttons+1] = button({},i,args["button"..i])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if not buttons[3] then --Hide on right click
|
|
|
|
buttons[#buttons+1] = button({},3,function()
|
|
|
|
data.visible = false
|
|
|
|
if data.parent_geometry and data.parent_geometry.is_menu then
|
|
|
|
data.parent_geometry.visible = false
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
if not buttons[4] then
|
|
|
|
buttons[#buttons+1] = button({},4,function()
|
|
|
|
data:scroll_up()
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
if not buttons[5] then
|
|
|
|
buttons[#buttons+1] = button({},5,function()
|
|
|
|
data:scroll_down()
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
item.widget:buttons( util.table.join(unpack(buttons)))
|
|
|
|
end
|
|
|
|
|
|
|
|
local function new(args)
|
|
|
|
local args = args or {}
|
|
|
|
args.internal = args.internal or {}
|
|
|
|
args.internal.setup_drawable = args.internal.setup_drawable or setup_drawable
|
|
|
|
args.internal.setup_item = args.internal.setup_item or setup_item
|
|
|
|
args.style = args.style or classic_style
|
|
|
|
local ret = base(args)
|
|
|
|
ret:connect_signal("clear::menu",function(_,vis)
|
2013-07-23 08:12:19 +02:00
|
|
|
local l = ret._internal.content_layout or ret._internal.layout
|
|
|
|
l:reset()
|
2013-07-21 10:15:56 +02:00
|
|
|
end)
|
|
|
|
ret:connect_signal("_hidden::changed",function(_,item)
|
|
|
|
item.widget:emit_signal("widget::updated")
|
|
|
|
end)
|
|
|
|
return ret
|
|
|
|
end
|
|
|
|
|
|
|
|
return setmetatable(module, { __call = function(_, ...) return new(...) end })
|
|
|
|
-- kate: space-indent on; indent-width 2; replace-tabs on;
|