refactor: Port radical.layout.horizontal to the declarative syntax

These commits dont make the code any smaller or more readable by
themselves. However, they are one step along many to refactor the
code to become more readable and simpler.

Eventual addition will extend the declarative syntax and merge it
with Radical own syntax (this will break the API a little due to
naming conflitcs).

I will also split the theme details from the declarative syntax and
use a separate "chain of responsability" meta-object to handle it.
This commit is contained in:
Emmanuel Lepage Vallee 2016-02-12 00:02:31 -05:00
parent 82afdd4570
commit 55fb74c709
1 changed files with 44 additions and 37 deletions

View File

@ -143,15 +143,32 @@ local function new(data)
if not base then if not base then
base = require( "radical.base" ) base = require( "radical.base" )
end end
local l = wibox.layout.fixed.horizontal()
l._fit = l.fit -- Define the item layout
local real_l = wibox.widget.base.make_widget_declarative {
spacing = data.spacing ,
item_fit = item_fit ,
setup_key_hooks = module.setup_key_hooks ,
setup_item = module.setup_item ,
layout = wibox.layout.fixed.horizontal,
}
data:connect_signal("widget::added",function(_,item,widget)
wibox.layout.fixed.add(real_l, item.widget)
real_l:emit_signal("widget::updated")
end)
function real_l:add(item)
return wibox.layout.fixed.add(self, item.widget)
end
-- Hack fit
local new_fit local new_fit
new_fit = function(self,context,w,h,force_values) --TODO use the context instead of extra argument new_fit = function(self,context,w,h,force_values) --TODO use the context instead of extra argument
-- Get the original fit, the function need to be replaced to avoir a stack overflow -- Get the original fit, the function need to be replaced to avoir a stack overflow
l.fit = l._fit real_l.fit = real_l._fit
local result,r2 = self:get_preferred_size(context, force_values and w, force_values and h) local result,r2 = self:get_preferred_size(context, force_values and w, force_values and h)
l.fit = new_fit real_l.fit = new_fit
local w,h local w,h
if data.auto_resize and data._internal.largest_item_h then if data.auto_resize and data._internal.largest_item_h then
@ -159,27 +176,17 @@ local function new(data)
else else
w,h = data.rowcount*(data.item_width or data.default_width),data.item_height w,h = data.rowcount*(data.item_width or data.default_width),data.item_height
end end
data:emit_signal("layout_size",w,h) data:emit_signal("layout_size",w,h)
return w,h return w,h
end end
l.fit = new_fit
l.add = function(l,item)
return wibox.layout.fixed.add(l,item.widget)
end
l.item_fit = item_fit
l.setup_key_hooks = module.setup_key_hooks
l.setup_item = module.setup_item
if data.spacing and l.set_spacing then real_l._fit = real_l.fit
l:set_spacing(data.spacing) real_l.fit = new_fit
end
data:connect_signal("widget::added",function(_,item,widget) return real_l
wibox.layout.fixed.add(l,item.widget)
l:emit_signal("widget::updated")
end)
return l
end end
return setmetatable(module, { __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 4; replace-tabs on;