radical/layout/vertical.lua

126 lines
4.1 KiB
Lua
Raw Normal View History

local setmetatable = setmetatable
2016-03-05 09:23:59 +01:00
local scroll = require( "radical.widgets.scroll" )
local filter = require( "radical.widgets.filter" )
local wibox = require( "wibox" )
local common = require( "radical.common" )
local module = {}
--Get preferred item geometry
local function item_fit(data,item,self,context, width,height)
2016-03-05 09:23:59 +01:00
local w, h = item._private_data._fit(self,context,width,height)
return w, item.height or h --TODO use a constraint widget
end
function module:setup_item(data,item,args)
item._private_data._fit = wibox.widget.background.fit
if not item._internal.margin_w then return end
item._internal.margin_w.fit = function(...) return item_fit(data,item,...) end
2014-02-05 05:29:38 +01:00
-- Compute the minimum width
2016-03-05 09:23:59 +01:00
if data.auto_resize then --FIXME this wont work if thext change
local fit_w = item._internal.margin_w:get_preferred_size()
if fit_w < 1000 and (not data._internal.largest_item_w_v or data._internal.largest_item_w_v < fit_w) then
data._internal.largest_item_w = item
data._internal.largest_item_w_v = fit_w
end
2014-03-24 05:00:01 +01:00
end
end
local function compute_geo(data,width,height,force_values)
local w = data.default_width
if data.auto_resize and data._internal.largest_item_w then
w = data._internal.largest_item_w_v > data.default_width and data._internal.largest_item_w_v or data.default_width
end
local visblerow = data.visible_row_count
local sw,sh = data._internal.suf_l:get_preferred_size()
local pw,ph = data._internal.pref_l:get_preferred_size()
if not data._internal.has_widget then
return w,(total and total > 0 and total or visblerow*data.item_height) + ph + sh
else
local sumh = data.widget_fit_height_sum
local h = (visblerow-#data._internal.widgets)*data.item_height + sumh
return w,h
end
end
local function new(data)
local function real_fit(self,context,o_w,o_h,force_values)
if not data.visible then return 1,1 end
local w,h = compute_geo(data,o_w,o_h,force_values)
data:emit_signal("layout_size",w,h)
return w,h
end
-- Create the scroll widgets
if data.max_items then
data._internal.scroll_w = scroll(data)
end
-- Define the item layout
local real_l = wibox.widget.base.make_widget_declarative {
-- Widgets
{
-- The prefix section, used for the scroll widgets and custom prefixes
-- Widgets
data._internal.scroll_w and data._internal.scroll_w["up"] or nil,
-- Attributes
id = "prefix_layout",
layout = wibox.layout.fixed.vertical
},
{
-- The main layout (where items are added)
-- Attributes
id = "content_layout",
spacing = data.spacing and data.spacing or 0,
layout = wibox.layout.fixed.vertical ,
},
{
-- The suffix section, used for the scroll widgets and custom suffixes
-- Widgets
data._internal.scroll_w and data._internal.scroll_w["down"] or nil,
data.show_filter and {
id = "filter_widget",
2016-03-05 08:54:17 +01:00
data = data,
widget = filter
} or nil,
-- Attributes
id = "suffix_layout" ,
layout = wibox.layout.fixed.vertical,
},
-- Attributes
layout = wibox.layout.fixed.vertical,
-- Methods
item_fit = item_fit ,
setup_key_hooks = common.setup_key_hooks,
setup_item = module.setup_item ,
}
-- Set the important widgets
data._internal.content_layout = real_l:get_children_by_id( "content_layout" )[1]
data._internal.suf_l = real_l:get_children_by_id( "suffix_layout" )[1]
data._internal.pref_l = real_l:get_children_by_id( "prefix_layout" )[1]
-- Set the overloaded methods
real_l.fit = real_fit
return real_l
end
return setmetatable(module, { __call = function(_, ...) return new(...) end })
-- kate: space-indent on; indent-width 4; replace-tabs on;