radical/embed.lua

112 lines
4.0 KiB
Lua

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 private_data = internal.private_data
-- An embeded menu can only be visible if the parent is
data.get_visible = function() return data._embeded_parent and data._embeded_parent.visible or false end --Let the parent handle that
data.set_visible = function(_,v) if data._embeded_parent then data._embeded_parent.visible = v end end
-- Enumate geometry --BUG this is fake, but better than nothing
data.get_width = function() return data._embeded_parent and (data._embeded_parent.width --[[+ (internal.current_width or 0)]])end
data.get_y = function() return data._embeded_parent and (data._embeded_parent.y--[[ + (internal.current_y or 0)]]) end
data.get_x = function() return data._embeded_parent and (data._embeded_parent.x--[[ + (internal.current_x or 0)]]) end
if not data.layout then
data.layout = layout.vertical
end
internal.layout = data.layout(data)
data.width,data.height = data._internal.layout:fit()
data.margins={left=0,right=0,bottom=0,top=0}
internal.layout:connect_signal("mouse::enter",function(_,geo)
-- internal.current_x = geo.x
-- internal.current_y = geo.y
-- internal.current_width = geo.width
if data._embeded_parent._current_item then
data._embeded_parent._current_item.state[base.item_flags.SELECTED] = nil
data._embeded_parent._current_item.selected = false
end
end)
internal.layout:connect_signal("mouse::leave",function(_,geo)
if data._current_item then
data._current_item.selected = false
data._current_item.state[base.item_flags.SELECTED] = nil
end
end)
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[i] = args["button"..i]
end
end
if not buttons[3] then --Hide on right click
buttons[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[4] = function()
data:scroll_up()
end
end
if not buttons[5] then
buttons[5] = function()
data:scroll_down()
end
end
item:connect_signal("button::release",function(_m,_i,button_id,mods)
if #mods == 0 and buttons[button_id] then
buttons[button_id](_m,_i,mods)
end
end)
item.widget:connect_signal("mouse::enter",function(_,geo)
item.y = geo.y
end)
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)
local l = ret._internal.content_layout or ret._internal.layout
l:reset()
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;