Change object syntax to user get_ and set_ prefix instead of get_map/set_map mappers (issue #15)
This commit is contained in:
parent
b8ba760a1f
commit
5255cca803
98
README.md
98
README.md
|
@ -308,3 +308,101 @@ allow masks such as desaturation, tinting, invert or some matrix to be applied
|
||||||
on the pixmap before it is being drawn. This function take the path/surface as
|
on the pixmap before it is being drawn. This function take the path/surface as
|
||||||
only parameter and return the transformed surface.
|
only parameter and return the transformed surface.
|
||||||
|
|
||||||
|
## Extending Radical
|
||||||
|
|
||||||
|
Radical is not designed to be used "as is". Every menus are different. While
|
||||||
|
common ones can be created without extending Radical capabilities, more advanced
|
||||||
|
one most likely will. Good news, this is what Radical have been designed for.
|
||||||
|
The previous generations proved to me that any lack or native extensibility
|
||||||
|
will cause the code to bloat when it come to adding a feature. Radical horizontal
|
||||||
|
design allow to add more modules and properties without having to touch the "core"
|
||||||
|
files.
|
||||||
|
|
||||||
|
### Object model
|
||||||
|
|
||||||
|
The Radical object model is similar to the Awesome one. Each objects have a set
|
||||||
|
of signals developers can listen to to have changes notification. The big
|
||||||
|
difference is that Radical object model automatically generate the properties
|
||||||
|
themselves. If one desire to add a new one, it is possible to listen to `item::added`
|
||||||
|
to apply it on the item or apply it directly on the menu itself depending if the
|
||||||
|
property is for the menu or for an item. Here is an example how it work:
|
||||||
|
|
||||||
|
```lua
|
||||||
|
local menu = radical.context{}
|
||||||
|
|
||||||
|
-- Create the setter
|
||||||
|
menu.set_foo = function(m,value)
|
||||||
|
print("Setting value to:",value)
|
||||||
|
m._foo_real = value
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Create the getter
|
||||||
|
menu.get_foo = function(m)
|
||||||
|
print("Getter called, returning",m._foo_real)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- The property is now created, this will call the setter:
|
||||||
|
menu.foo = "my foo value"
|
||||||
|
|
||||||
|
-- This will call the getter:
|
||||||
|
print(menu.foo)
|
||||||
|
|
||||||
|
-- The signals will be automatically generated
|
||||||
|
data:connect_signal("foo::changed",function(m,value)
|
||||||
|
print("foo changed:",value)
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- New signals don't need to be registered and can be called right away
|
||||||
|
data:connect_signal("my_new_signal::action_name",function(m,value1,value2,value3)
|
||||||
|
print("Callback",m,value1,value2,value3)
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- Manually emiting a signal
|
||||||
|
menu:emit_signal("my_new_signal::action_name",value1,value2,value3)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### State model
|
||||||
|
|
||||||
|
Radical support multiple states per item at once. The "current state" is the one
|
||||||
|
with the smallest ID. A state ID is an integer from -inf to inf. More important
|
||||||
|
states, like `urgent` versus `checked` can be implemented by using an
|
||||||
|
appropriate ordering. The default set of states is subject to changes, so it
|
||||||
|
is wiser to use a completely different range if someone want to replace the
|
||||||
|
currents one. Each states can be assigned a background and foreground color
|
||||||
|
using the `radical.theme.register_color(id, radical_name, beautiful_name, true )`
|
||||||
|
method. Toggling a state can be done using the `item.state[]` meta table:
|
||||||
|
|
||||||
|
```lua
|
||||||
|
local my_state_name = 9999 -- <== The ID
|
||||||
|
local menu = radical.context{}
|
||||||
|
local item = menu:add_item{text="text"}
|
||||||
|
|
||||||
|
-- Activate a state
|
||||||
|
item.state[my_state_name] = true
|
||||||
|
|
||||||
|
-- Desactivate a state
|
||||||
|
item.state[my_state_name] = nil
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Radical will take care of choosing the current state and redraw the item with
|
||||||
|
the right background and foreground colors.
|
||||||
|
|
||||||
|
### Layout
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
### Style
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
### Item layout
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
### Item style
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
|
||||||
|
|
16
bar.lua
16
bar.lua
|
@ -35,7 +35,7 @@ end
|
||||||
|
|
||||||
local function setup_drawable(data)
|
local function setup_drawable(data)
|
||||||
local internal = data._internal
|
local internal = data._internal
|
||||||
local get_map,set_map,private_data = internal.get_map,internal.set_map,internal.private_data
|
local private_data = internal.private_data
|
||||||
|
|
||||||
--Init
|
--Init
|
||||||
internal.margin = wibox.layout.margin()
|
internal.margin = wibox.layout.margin()
|
||||||
|
@ -46,13 +46,13 @@ local function setup_drawable(data)
|
||||||
internal.margin:set_widget(internal.layout)
|
internal.margin:set_widget(internal.layout)
|
||||||
|
|
||||||
--Getters
|
--Getters
|
||||||
get_map.x = function() return 0 end
|
data.get_x = function() return 0 end
|
||||||
get_map.y = function() return 0 end
|
data.get_y = function() return 0 end
|
||||||
get_map.width = function() return internal.margin.fix(internal.margin,9999,99) end
|
data.get_width = function() return internal.margin.fix(internal.margin,9999,99) end
|
||||||
get_map.height = function() return beautiful.default_height end
|
data.get_height = function() return beautiful.default_height end
|
||||||
get_map.visible = function() return true end
|
data.get_visible = function() return true end
|
||||||
get_map.direction = function() return "left" end
|
data.get_direction = function() return "left" end
|
||||||
get_map.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.margin.fit
|
||||||
|
|
45
base.lua
45
base.lua
|
@ -166,6 +166,7 @@ local function add_item(data,args)
|
||||||
item.selected = true
|
item.selected = true
|
||||||
end
|
end
|
||||||
item.index = data.rowcount
|
item.index = data.rowcount
|
||||||
|
data:emit_signal("item::added",item)
|
||||||
return item
|
return item
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -179,7 +180,7 @@ local function add_widget(data,widget,args)
|
||||||
return args.width or w,args.height or h
|
return args.width or w,args.height or h
|
||||||
end
|
end
|
||||||
|
|
||||||
local item,set_map,get_map,private_data = object({
|
local item,private_data = object({
|
||||||
private_data = {
|
private_data = {
|
||||||
widget = widget,
|
widget = widget,
|
||||||
selected = false,
|
selected = false,
|
||||||
|
@ -188,15 +189,13 @@ local function add_widget(data,widget,args)
|
||||||
visible = true,
|
visible = true,
|
||||||
selected = true,
|
selected = true,
|
||||||
},
|
},
|
||||||
get_map = {
|
|
||||||
y = function() return (args.y and args.y >= 0) and args.y or data.height - (data.margins.top or data.border_width) - data.item_height end, --Hack around missing :fit call for last item
|
|
||||||
},
|
|
||||||
autogen_getmap = true,
|
autogen_getmap = true,
|
||||||
autogen_setmap = true,
|
autogen_setmap = true,
|
||||||
autogen_signals = true,
|
autogen_signals = true,
|
||||||
})
|
})
|
||||||
item._private_data = private_data
|
item._private_data = private_data
|
||||||
item._internal = {get_map=get_map,set_map=set_map}
|
item._internal = {}
|
||||||
|
item.get_y = function() return (args.y and args.y >= 0) and args.y or data.height - (data.margins.top or data.border_width) - data.item_height end --Hack around missing :fit call for last item
|
||||||
|
|
||||||
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}
|
||||||
|
@ -228,7 +227,7 @@ local function new(args)
|
||||||
if not internal.widgets then internal.widgets = {} end
|
if not internal.widgets then internal.widgets = {} end
|
||||||
|
|
||||||
-- All the magic in the universe
|
-- All the magic in the universe
|
||||||
local data,set_map,get_map,private_data = object({
|
local data,private_data = object({
|
||||||
private_data = {
|
private_data = {
|
||||||
-- Default settings
|
-- Default settings
|
||||||
bg = args.bg or beautiful.menu_bg_normal or beautiful.bg_normal or "#000000",
|
bg = args.bg or beautiful.menu_bg_normal or beautiful.bg_normal or "#000000",
|
||||||
|
@ -280,16 +279,6 @@ local function new(args)
|
||||||
opacity = args.opacity or beautiful.menu_opacity or 1,
|
opacity = args.opacity or beautiful.menu_opacity or 1,
|
||||||
icon_transformation = args.icon_transformation or nil,
|
icon_transformation = args.icon_transformation or nil,
|
||||||
},
|
},
|
||||||
get_map = {
|
|
||||||
is_menu = function() return true end,
|
|
||||||
margin = function() return {left=0,bottom=0,right=0,left=0} end,
|
|
||||||
items = function() return internal.items end,
|
|
||||||
rowcount = function() return #internal.items end,
|
|
||||||
columncount = function() return (#internal.items > 0) and #(internal.items[1]) or 0 end,
|
|
||||||
},
|
|
||||||
set_map = {
|
|
||||||
auto_resize = function(val) private_data[""] = val end,
|
|
||||||
},
|
|
||||||
force_private = {
|
force_private = {
|
||||||
parent = true,
|
parent = true,
|
||||||
visible = true,
|
visible = true,
|
||||||
|
@ -302,10 +291,20 @@ local function new(args)
|
||||||
autogen_setmap = true,
|
autogen_setmap = true,
|
||||||
autogen_signals = true,
|
autogen_signals = true,
|
||||||
})
|
})
|
||||||
internal.get_map,internal.set_map,internal.private_data = get_map,set_map,private_data
|
internal.private_data = private_data
|
||||||
data.add_item,data.add_widget,data.add_embeded_menu,data._internal,data.add_key_binding = add_item,add_widget,add_embeded_menu,internal,add_key_binding
|
data.add_item,data.add_widget,data.add_embeded_menu,data._internal,data.add_key_binding = add_item,add_widget,add_embeded_menu,internal,add_key_binding
|
||||||
theme.setup_colors(data,args)
|
theme.setup_colors(data,args)
|
||||||
set_map.parent_geometry = function(value)
|
|
||||||
|
-- Getters
|
||||||
|
data.get_is_menu = function(_) return true end
|
||||||
|
data.get_margin = function(_) return {left=0,bottom=0,right=0,left=0} end
|
||||||
|
data.get_items = function(_) return internal.items end
|
||||||
|
data.get_rowcount = function(_) return #internal.items end
|
||||||
|
data.get_columncount = function(_) return (#internal.items > 0) and #(internal.items[1]) or 0 end
|
||||||
|
|
||||||
|
-- Setters
|
||||||
|
data.set_auto_resize = function(_,val) private_data[""] = val end
|
||||||
|
data.set_parent_geometry = function(_,value)
|
||||||
private_data.parent_geometry = value
|
private_data.parent_geometry = value
|
||||||
if data._internal.get_direction then
|
if data._internal.get_direction then
|
||||||
data.direction = data._internal.get_direction(data)
|
data.direction = data._internal.get_direction(data)
|
||||||
|
@ -315,7 +314,7 @@ local function new(args)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
set_map.visible = function(value)
|
data.set_visible = function(_,value)
|
||||||
private_data.visible = value
|
private_data.visible = value
|
||||||
if value then
|
if value then
|
||||||
local fit_w,fit_h = data._internal.layout:fit(9999,9999)
|
local fit_w,fit_h = data._internal.layout:fit(9999,9999)
|
||||||
|
@ -343,7 +342,7 @@ local function new(args)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
set_map.layout = function(value)
|
data.set_layout = function(_,value)
|
||||||
if value then
|
if value then
|
||||||
value:setup_key_hooks(data)
|
value:setup_key_hooks(data)
|
||||||
end
|
end
|
||||||
|
@ -356,7 +355,7 @@ local function new(args)
|
||||||
-- end
|
-- end
|
||||||
-- end
|
-- end
|
||||||
|
|
||||||
get_map.current_index = function()
|
data.get_current_index = function(_)
|
||||||
if data._current_item then
|
if data._current_item then
|
||||||
for k,v in ipairs(internal.items) do --rows
|
for k,v in ipairs(internal.items) do --rows
|
||||||
for k2,v2 in ipairs(v) do --columns
|
for k2,v2 in ipairs(v) do --columns
|
||||||
|
@ -368,14 +367,14 @@ local function new(args)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
get_map.previous_item = function()
|
data.get_previous_item = function(_)
|
||||||
local candidate,idx = internal.items[(data.current_index or 0)-1],(data.current_index or 0)-1
|
local candidate,idx = internal.items[(data.current_index or 0)-1],(data.current_index or 0)-1
|
||||||
while candidate and (candidate[1]._hidden or candidate[1]._filter_out) and idx > 0 do
|
while candidate and (candidate[1]._hidden or candidate[1]._filter_out) and idx > 0 do
|
||||||
candidate,idx = internal.items[idx - 1],idx-1
|
candidate,idx = internal.items[idx - 1],idx-1
|
||||||
end
|
end
|
||||||
return (candidate or internal.items[data.rowcount])[1]
|
return (candidate or internal.items[data.rowcount])[1]
|
||||||
end
|
end
|
||||||
get_map.next_item = function()
|
data.get_next_item = function(_)
|
||||||
local candidate,idx = internal.items[(data.current_index or 0)+1],(data.current_index or 0)+1
|
local candidate,idx = internal.items[(data.current_index or 0)+1],(data.current_index or 0)+1
|
||||||
while candidate and (candidate[1]._hidden or candidate[1]._filter_out) and idx <= data.rowcount do
|
while candidate and (candidate[1]._hidden or candidate[1]._filter_out) and idx <= data.rowcount do
|
||||||
candidate,idx = internal.items[idx + 1],idx+1
|
candidate,idx = internal.items[idx + 1],idx+1
|
||||||
|
|
28
context.lua
28
context.lua
|
@ -100,7 +100,7 @@ end
|
||||||
|
|
||||||
local function setup_drawable(data)
|
local function setup_drawable(data)
|
||||||
local internal = data._internal
|
local internal = data._internal
|
||||||
local get_map,set_map,private_data = internal.get_map,internal.set_map,internal.private_data
|
local private_data = internal.private_data
|
||||||
|
|
||||||
--Init
|
--Init
|
||||||
internal.w = wibox({})
|
internal.w = wibox({})
|
||||||
|
@ -117,14 +117,14 @@ local function setup_drawable(data)
|
||||||
internal.w.opacity = data.opacity
|
internal.w.opacity = data.opacity
|
||||||
|
|
||||||
--Getters
|
--Getters
|
||||||
get_map.wibox = function() return internal.w end
|
data.get_wibox = function() return internal.w end
|
||||||
get_map.x = function() return internal.w.x end
|
data.get_x = function() return internal.w.x end
|
||||||
get_map.y = function() return internal.w.y end
|
data.get_y = function() return internal.w.y end
|
||||||
get_map.width = function() return internal.w.width end
|
data.get_width = function() return internal.w.width end
|
||||||
get_map.height = function() return internal.w.height end
|
data.get_height = function() return internal.w.height end
|
||||||
get_map.visible = function() return private_data.visible end
|
data.get_visible = function() return private_data.visible end
|
||||||
get_map.direction = function() return private_data.direction end
|
data.get_direction = function() return private_data.direction end
|
||||||
get_map.margins = function()
|
data.get_margins = function()
|
||||||
local ret = {left=data.border_width,right=data.border_width,top=data.style.margins.TOP,bottom=data.style.margins.BOTTOM}
|
local ret = {left=data.border_width,right=data.border_width,top=data.style.margins.TOP,bottom=data.style.margins.BOTTOM}
|
||||||
if data.arrow_type ~= base.arrow_type.NONE then
|
if data.arrow_type ~= base.arrow_type.NONE then
|
||||||
ret[data.direction] = ret[data.direction]+13
|
ret[data.direction] = ret[data.direction]+13
|
||||||
|
@ -133,7 +133,7 @@ local function setup_drawable(data)
|
||||||
end
|
end
|
||||||
|
|
||||||
--Setters
|
--Setters
|
||||||
set_map.direction = function(value)
|
data.set_direction = function(_,value)
|
||||||
if private_data.direction ~= value and (value == "top" or value == "bottom" or value == "left" or value == "right") then
|
if private_data.direction ~= value and (value == "top" or value == "bottom" or value == "left" or value == "right") then
|
||||||
private_data.direction = value
|
private_data.direction = value
|
||||||
local fit_w,fit_h = internal.layout:fit()
|
local fit_w,fit_h = internal.layout:fit()
|
||||||
|
@ -141,9 +141,9 @@ local function setup_drawable(data)
|
||||||
data.width = fit_w
|
data.width = fit_w
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
set_map.x = function(value) internal.w.x = value end
|
data.set_x = function(_,value) internal.w.x = value end
|
||||||
set_map.y = function(value) internal.w.y = value end
|
data.set_y = function(_,value) internal.w.y = value end
|
||||||
set_map.width = function(value)
|
data.set_width = function(_,value)
|
||||||
local need_update = internal.w.width == (value + 2*data.border_width)
|
local need_update = internal.w.width == (value + 2*data.border_width)
|
||||||
local margins = data.margins
|
local margins = data.margins
|
||||||
internal.w.width = value + data.margins.left + data.margins.right
|
internal.w.width = value + data.margins.left + data.margins.right
|
||||||
|
@ -151,7 +151,7 @@ local function setup_drawable(data)
|
||||||
data.style(data)
|
data.style(data)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
set_map.height = function(value)
|
data.set_height = function(_,value)
|
||||||
local margins = data.margins
|
local margins = data.margins
|
||||||
local need_update = (internal.w.height ~= (value + margins.top + margins.bottom))
|
local need_update = (internal.w.height ~= (value + margins.top + margins.bottom))
|
||||||
local new_height = (value + margins.top + margins.bottom) or 1
|
local new_height = (value + margins.top + margins.bottom) or 1
|
||||||
|
|
12
embed.lua
12
embed.lua
|
@ -19,16 +19,16 @@ local capi,module = { mouse = mouse , screen = screen , keygrabber = keygrabber
|
||||||
|
|
||||||
local function setup_drawable(data)
|
local function setup_drawable(data)
|
||||||
local internal = data._internal
|
local internal = data._internal
|
||||||
local get_map,set_map,private_data = internal.get_map,internal.set_map,internal.private_data
|
local private_data = internal.private_data
|
||||||
|
|
||||||
-- An embeded menu can only be visible if the parent is
|
-- 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
|
data.get_visible = function() return data._embeded_parent and data._embeded_parent.visible or false end --Let the parent handle that
|
||||||
set_map.visible = function(v) if data._embeded_parent then data._embeded_parent.visible = v end end
|
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
|
-- Enumate geometry --BUG this is fake, but better than nothing
|
||||||
get_map.width = function() return data._embeded_parent and data._embeded_parent.width end
|
data.get_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
|
data.get_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
|
data.get_x = function() return data._embeded_parent and data._embeded_parent.x end
|
||||||
if not data.layout then
|
if not data.layout then
|
||||||
data.layout = layout.vertical
|
data.layout = layout.vertical
|
||||||
end
|
end
|
||||||
|
|
|
@ -75,7 +75,7 @@ end
|
||||||
|
|
||||||
local function new_item(data,args)
|
local function new_item(data,args)
|
||||||
local args = args or {}
|
local args = args or {}
|
||||||
local item,set_map,get_map,private_data = object({
|
local item,private_data = object({
|
||||||
private_data = {
|
private_data = {
|
||||||
text = args.text or "" ,
|
text = args.text or "" ,
|
||||||
height = args.height or data.item_height or beautiful.menu_height or 30 ,
|
height = args.height or data.item_height or beautiful.menu_height or 30 ,
|
||||||
|
@ -103,16 +103,14 @@ local function new_item(data,args)
|
||||||
selected = true,
|
selected = true,
|
||||||
index = true,
|
index = true,
|
||||||
},
|
},
|
||||||
get_map = {
|
|
||||||
y = function() return (args.y and args.y >= 0) and args.y or data.height - (data.margins.top or data.border_width) - data.item_height end, --Hack around missing :fit call for last item
|
|
||||||
},
|
|
||||||
autogen_getmap = true,
|
autogen_getmap = true,
|
||||||
autogen_setmap = true,
|
autogen_setmap = true,
|
||||||
autogen_signals = true,
|
autogen_signals = true,
|
||||||
})
|
})
|
||||||
item._private_data = private_data
|
item._private_data = private_data
|
||||||
item._internal = {get_map=get_map,set_map=set_map}
|
item._internal = {}
|
||||||
theme.setup_item_colors(data,item,args)
|
theme.setup_item_colors(data,item,args)
|
||||||
|
item.get_y = function() return (args.y and args.y >= 0) and args.y or data.height - (data.margins.top or data.border_width) - data.item_height end --Hack around missing :fit call for last item
|
||||||
item.get_bg = function()
|
item.get_bg = function()
|
||||||
return data.bg
|
return data.bg
|
||||||
end
|
end
|
||||||
|
@ -138,7 +136,7 @@ local function new_item(data,args)
|
||||||
data._internal.items[#data._internal.items][1] = item
|
data._internal.items[#data._internal.items][1] = item
|
||||||
|
|
||||||
-- Setters
|
-- Setters
|
||||||
set_map.selected = function(value)
|
item.set_selected = function(_,value)
|
||||||
private_data.selected = value
|
private_data.selected = value
|
||||||
if value == false then
|
if value == false then
|
||||||
data.item_style(item,{})
|
data.item_style(item,{})
|
||||||
|
|
|
@ -12,7 +12,7 @@ local module = {}
|
||||||
|
|
||||||
-- Add [F1], [F2] ... to items
|
-- Add [F1], [F2] ... to items
|
||||||
function module:setup_fkey(item,data)
|
function module:setup_fkey(item,data)
|
||||||
item._internal.set_map.f_key = function(value)
|
item.set_f_key = function(_,value)
|
||||||
item._internal.has_changed = true
|
item._internal.has_changed = true
|
||||||
item._internal.f_key = value
|
item._internal.f_key = value
|
||||||
data:remove_key_hook("F"..value)
|
data:remove_key_hook("F"..value)
|
||||||
|
@ -21,7 +21,7 @@ function module:setup_fkey(item,data)
|
||||||
data.visible = false
|
data.visible = false
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
item._internal.get_map.f_key = function() return item._internal.f_key end
|
item.get_f_key = function() return item._internal.f_key end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Like an overlay, but under
|
-- Like an overlay, but under
|
||||||
|
@ -55,7 +55,7 @@ function module:setup_icon(item,data)
|
||||||
icon:set_image(item.icon)
|
icon:set_image(item.icon)
|
||||||
end
|
end
|
||||||
|
|
||||||
item._internal.set_map.icon = function (value)
|
item.set_icon = function (_,value)
|
||||||
icon:set_image(value)
|
icon:set_image(value)
|
||||||
end
|
end
|
||||||
return icon
|
return icon
|
||||||
|
@ -64,7 +64,7 @@ end
|
||||||
-- Show the checkbox
|
-- Show the checkbox
|
||||||
function module:setup_checked(item,data)
|
function module:setup_checked(item,data)
|
||||||
if item.checkable then
|
if item.checkable then
|
||||||
item._internal.get_map.checked = function()
|
item.get_checked = function()
|
||||||
if type(item._private_data.checked) == "function" then
|
if type(item._private_data.checked) == "function" then
|
||||||
return item._private_data.checked()
|
return item._private_data.checked()
|
||||||
else
|
else
|
||||||
|
@ -73,7 +73,7 @@ function module:setup_checked(item,data)
|
||||||
end
|
end
|
||||||
local ck = wibox.widget.imagebox()
|
local ck = wibox.widget.imagebox()
|
||||||
ck:set_image(item.checked and checkbox.checked() or checkbox.unchecked())
|
ck:set_image(item.checked and checkbox.checked() or checkbox.unchecked())
|
||||||
item._internal.set_map.checked = function (value)
|
item.set_checked = function (_,value)
|
||||||
item._private_data.checked = value
|
item._private_data.checked = value
|
||||||
ck:set_image(item.checked and checkbox.checked() or checkbox.unchecked())
|
ck:set_image(item.checked and checkbox.checked() or checkbox.unchecked())
|
||||||
item._internal.has_changed = true
|
item._internal.has_changed = true
|
||||||
|
@ -84,7 +84,7 @@ end
|
||||||
|
|
||||||
-- Setup hover
|
-- Setup hover
|
||||||
function module:setup_hover(item,data)
|
function module:setup_hover(item,data)
|
||||||
item._internal.set_map.hover = function(value)
|
item.set_hover = function(_,value)
|
||||||
local item_style = item.item_style or data.item_style
|
local item_style = item.item_style or data.item_style
|
||||||
item.state[5] = value and true or nil
|
item.state[5] = value and true or nil
|
||||||
item_style(item,{})
|
item_style(item,{})
|
||||||
|
@ -197,7 +197,7 @@ local function create_item(item,data,args)
|
||||||
wibox.widget.textbox.draw(self,w, cr, width, height)
|
wibox.widget.textbox.draw(self,w, cr, width, height)
|
||||||
end
|
end
|
||||||
tb:set_text(item.text)
|
tb:set_text(item.text)
|
||||||
item._internal.set_map.text = function (value)
|
item.set_text = function (_,value)
|
||||||
if data.disable_markup then
|
if data.disable_markup then
|
||||||
tb:set_text(value)
|
tb:set_text(value)
|
||||||
else
|
else
|
||||||
|
@ -245,7 +245,7 @@ local function create_item(item,data,args)
|
||||||
item.widget:set_tooltip(item.tooltip)
|
item.widget:set_tooltip(item.tooltip)
|
||||||
|
|
||||||
-- Overlay
|
-- Overlay
|
||||||
item._internal.set_map.overlay = function(value)
|
item.set_overlay = function(_,value)
|
||||||
item._private_data.overlay = value
|
item._private_data.overlay = value
|
||||||
item.widget:emit_signal("widget::updated")
|
item.widget:emit_signal("widget::updated")
|
||||||
end
|
end
|
||||||
|
|
|
@ -74,7 +74,7 @@ local function create_item(item,data,args)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if item.checkable then
|
if item.checkable then
|
||||||
item._internal.get_map.checked = function()
|
item.get_checked = function()
|
||||||
if type(item._private_data.checked) == "function" then
|
if type(item._private_data.checked) == "function" then
|
||||||
return item._private_data.checked()
|
return item._private_data.checked()
|
||||||
else
|
else
|
||||||
|
@ -84,7 +84,7 @@ local function create_item(item,data,args)
|
||||||
local ck = wibox.widget.imagebox()
|
local ck = wibox.widget.imagebox()
|
||||||
ck:set_image(item.checked and checkbox.checked() or checkbox.unchecked())
|
ck:set_image(item.checked and checkbox.checked() or checkbox.unchecked())
|
||||||
lr:add(ck)
|
lr:add(ck)
|
||||||
item._internal.set_map.checked = function (value)
|
item.set_checked = function (_,value)
|
||||||
item._private_data.checked = value
|
item._private_data.checked = value
|
||||||
ck:set_image(item.checked and checkbox.checked() or checkbox.unchecked())
|
ck:set_image(item.checked and checkbox.checked() or checkbox.unchecked())
|
||||||
end
|
end
|
||||||
|
|
|
@ -98,7 +98,7 @@ function module:setup_item(data,item,args)
|
||||||
local icon_w = item._internal.icon_w
|
local icon_w = item._internal.icon_w
|
||||||
|
|
||||||
-- Setup text
|
-- Setup text
|
||||||
item._internal.set_map.text = function (value)
|
item.set_text = function (_,value)
|
||||||
if data.disable_markup then
|
if data.disable_markup then
|
||||||
text_w:set_text(value)
|
text_w:set_text(value)
|
||||||
else
|
else
|
||||||
|
@ -114,10 +114,10 @@ function module:setup_item(data,item,args)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
item._internal.set_map.icon = function (value)
|
item.set_icon = function (_,value)
|
||||||
icon_w:set_image(value)
|
icon_w:set_image(value)
|
||||||
end
|
end
|
||||||
item._internal.set_map.text(item._private_data.text)
|
item:set_text(item._private_data.text)
|
||||||
|
|
||||||
-- Setup tooltip
|
-- Setup tooltip
|
||||||
bg:set_tooltip(item.tooltip)
|
bg:set_tooltip(item.tooltip)
|
||||||
|
|
|
@ -92,7 +92,7 @@ function module:setup_text(item,data,text_w)
|
||||||
end
|
end
|
||||||
text_w.fit = function(self,width,height) return width,height end
|
text_w.fit = function(self,width,height) return width,height end
|
||||||
|
|
||||||
item._internal.set_map.text = function (value)
|
item.set_text = function (_,value)
|
||||||
if data.disable_markup then
|
if data.disable_markup then
|
||||||
text_w:set_text(value)
|
text_w:set_text(value)
|
||||||
else
|
else
|
||||||
|
@ -114,7 +114,7 @@ function module:setup_text(item,data,text_w)
|
||||||
-- end
|
-- end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
item._internal.set_map.text(item._private_data.text)
|
item:set_text(item._private_data.text)
|
||||||
return text_w
|
return text_w
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
19
object.lua
19
object.lua
|
@ -6,14 +6,14 @@ local pairs = pairs
|
||||||
|
|
||||||
local function setup_object(args)
|
local function setup_object(args)
|
||||||
local data,args,private_data,signals = {},args or {},private_data or {},{}
|
local data,args,private_data,signals = {},args or {},private_data or {},{}
|
||||||
local get_map,set_map,private_data = args.get_map or {},args.set_map or {},args.private_data or {}
|
local private_data = args.private_data or {}
|
||||||
|
|
||||||
function data:connect_signal(name,func)
|
function data:connect_signal(name,func)
|
||||||
signals[name] = signals[name] or {}
|
signals[name] = signals[name] or {}
|
||||||
table.insert(signals[name],func)
|
table.insert(signals[name],func)
|
||||||
end
|
end
|
||||||
|
|
||||||
function data:remove_signal(name,func)
|
function data:disconnect_signal(name,func)
|
||||||
for k,v in pairs(signals[name] or {}) do
|
for k,v in pairs(signals[name] or {}) do
|
||||||
if v == func then
|
if v == func then
|
||||||
signals[name][k] = nil
|
signals[name][k] = nil
|
||||||
|
@ -33,8 +33,8 @@ local function setup_object(args)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function return_data(tab, key)
|
local function return_data(tab, key)
|
||||||
if get_map[key] ~= nil then
|
if rawget(tab,"get_"..key) then
|
||||||
return get_map[key]()
|
return rawget(tab,"get_"..key)(tab)
|
||||||
elseif args.autogen_getmap == true and private_data[key] ~= nil then
|
elseif args.autogen_getmap == true and private_data[key] ~= nil then
|
||||||
return private_data[key]
|
return private_data[key]
|
||||||
elseif args.other_get_callback then
|
elseif args.other_get_callback then
|
||||||
|
@ -51,15 +51,16 @@ local function setup_object(args)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function catch_changes(tab, key,value)
|
local function catch_changes(tab, key,value)
|
||||||
if set_map[key] == false then
|
local setter = rawget(tab,"set_"..key)
|
||||||
|
if setter == false then
|
||||||
--print("This is not a setter",debug.traceback()) --In some case, it may be called "normally", having this print is only good for debug
|
--print("This is not a setter",debug.traceback()) --In some case, it may be called "normally", having this print is only good for debug
|
||||||
elseif (data[key] ~= value or (args.always_handle ~= nil and args.always_handle[key] == true)) and set_map[key] ~= nil then
|
elseif (data[key] ~= value or (args.always_handle ~= nil and args.always_handle[key] == true)) and setter then
|
||||||
set_map[key](value)
|
setter(tab,value)
|
||||||
auto_signal(key)
|
auto_signal(key)
|
||||||
elseif (args.force_private or {})[key] == true or (args.autogen_setmap and (private_data[key] ~= nil)) then
|
elseif (args.force_private or {})[key] == true or (args.autogen_setmap and (private_data[key] ~= nil)) then
|
||||||
private_data[key] = value
|
private_data[key] = value
|
||||||
auto_signal(key)
|
auto_signal(key)
|
||||||
elseif set_map[key] == nil then
|
elseif setter == nil then
|
||||||
rawset(data,key,value)
|
rawset(data,key,value)
|
||||||
end
|
end
|
||||||
if args.auto_signal_changed == true then
|
if args.auto_signal_changed == true then
|
||||||
|
@ -68,6 +69,6 @@ local function setup_object(args)
|
||||||
end
|
end
|
||||||
|
|
||||||
setmetatable(data, { __index = return_data, __newindex = catch_changes, __len = function() return #data + #private_data end, })
|
setmetatable(data, { __index = return_data, __newindex = catch_changes, __len = function() return #data + #private_data end, })
|
||||||
return data,set_map,get_map,private_data
|
return data,private_data
|
||||||
end
|
end
|
||||||
return setmetatable({}, { __call = function(_, ...) return setup_object(...) end })
|
return setmetatable({}, { __call = function(_, ...) return setup_object(...) end })
|
18
radial.lua
18
radial.lua
|
@ -276,7 +276,7 @@ end
|
||||||
|
|
||||||
local function setup_drawable(data)
|
local function setup_drawable(data)
|
||||||
local internal = data._internal
|
local internal = data._internal
|
||||||
local get_map,set_map,private_data = internal.get_map,internal.set_map,internal.private_data
|
local private_data = internal.private_data
|
||||||
|
|
||||||
--Init
|
--Init
|
||||||
-- internal.w = wibox({})
|
-- internal.w = wibox({})
|
||||||
|
@ -288,14 +288,14 @@ local function setup_drawable(data)
|
||||||
internal.margin:set_widget(internal.layout)
|
internal.margin:set_widget(internal.layout)
|
||||||
|
|
||||||
--Getters
|
--Getters
|
||||||
get_map.wibox = function() return nil end -- Will this break?
|
data.get_wibox = function() return nil end -- Will this break?
|
||||||
get_map.x = function() return 0 end
|
data.get_x = function() return 0 end
|
||||||
get_map.y = function() return 0 end
|
data.get_y = function() return 0 end
|
||||||
get_map.width = function() return 500 end
|
data.get_width = function() return 500 end
|
||||||
get_map.height = function() return 40 end
|
data.get_height = function() return 40 end
|
||||||
get_map.visible = function() return private_data.visible end
|
data.get_visible = function() return private_data.visible end
|
||||||
get_map.direction = function() return private_data.direction end
|
data.get_direction = function() return private_data.direction end
|
||||||
get_map.margins = function()
|
data.get_margins = function()
|
||||||
local ret = {left=data.border_width,right=data.border_width,top=data.style.margins.TOP,bottom=data.style.margins.BOTTOM}
|
local ret = {left=data.border_width,right=data.border_width,top=data.style.margins.TOP,bottom=data.style.margins.BOTTOM}
|
||||||
if data.arrow_type ~= base.arrow_type.NONE then
|
if data.arrow_type ~= base.arrow_type.NONE then
|
||||||
ret[data.direction] = ret[data.direction]+13
|
ret[data.direction] = ret[data.direction]+13
|
||||||
|
|
Loading…
Reference in New Issue