Stop using fixed row number

This commit is contained in:
mattplm 2021-07-06 17:57:23 +02:00
parent f473639c5d
commit 97726e8f38
2 changed files with 73 additions and 15 deletions

View File

@ -37,8 +37,9 @@ local beautiful = require("beautiful")
local calendar = { mt = {} } local calendar = { mt = {} }
local properties = { "date", "font", "spacing", "week_numbers", "start_sunday", "long_weekdays", "fn_embed" } local properties = { "date" , "font" , "spacing" , "week_numbers",
"start_sunday", "long_weekdays", "fn_embed", "flex_height",
}
--- The calendar font. --- The calendar font.
-- @beautiful beautiful.calendar_font -- @beautiful beautiful.calendar_font
@ -60,6 +61,11 @@ local properties = { "date", "font", "spacing", "week_numbers", "start_sunday",
-- @beautiful beautiful.calendar_long_weekdays -- @beautiful beautiful.calendar_long_weekdays
-- @param boolean Use three characters for the weekdays instead of two -- @param boolean Use three characters for the weekdays instead of two
--- Allow cells to have flexible height.
-- Flexible height allow cells to adapt their height to fill the empty space at the bottom of the widget.
-- @beautiful beautiful.flex_height
-- @param boolean Cells can skretch to fill the empty space.
--- The calendar date. --- The calendar date.
-- --
-- A table representing the date {day=[number|nil], month=[number|nil], year=[number]}. -- A table representing the date {day=[number|nil], month=[number|nil], year=[number]}.
@ -116,6 +122,12 @@ local properties = { "date", "font", "spacing", "week_numbers", "start_sunday",
-- @param function Function to embed the widget depending on its flag -- @param function Function to embed the widget depending on its flag
-- @property fn_embed -- @property fn_embed
--- Allow cells to have flexible height
--
--@DOC_wibox_widget_calendar_flex_height_EXAMPLE@
--
-- @param[opt=false] boolean Allow flex height.
-- @property flex_height
--- Make a textbox --- Make a textbox
-- @tparam string text Text of the textbox -- @tparam string text Text of the textbox
@ -139,25 +151,47 @@ end
-- @tparam number|nil date.day Date day -- @tparam number|nil date.day Date day
-- @treturn widget Grid layout -- @treturn widget Grid layout
local function create_month(props, date) local function create_month(props, date)
local num_rows = 8
local num_columns = props.week_numbers and 8 or 7
-- Create grid layout
local layout = grid()
layout:set_expand(true)
layout:set_expand(true)
layout:set_homogeneous(true)
layout:set_spacing(props.spacing)
layout:set_forced_num_rows(num_rows)
layout:set_forced_num_cols(num_columns)
local start_row = 3 local start_row = 3
local start_column = num_columns - 6
local week_start = props.start_sunday and 1 or 2 local week_start = props.start_sunday and 1 or 2
local last_day = os.date("*t", os.time{year=date.year, month=date.month+1, day=0}) local last_day = os.date("*t", os.time{year=date.year, month=date.month+1, day=0})
local month_days = last_day.day local month_days = last_day.day
local column_fday = (last_day.wday - month_days + 1 - week_start ) % 7 local column_fday = (last_day.wday - month_days + 1 - week_start ) % 7
local num_columns = props.week_numbers and 8 or 7
local start_column = num_columns - 6
-- Compute number of rows
-- There are at least 4 weeks in a month
local num_rows = 4
-- On every month but february on non bisextile years
if last_day.day > 28 then
-- The number of days span over at least 5 weeks
num_rows = num_rows + 1
-- On month with 30+ days add 1 week if:
-- - if 30 days and the first day is the last day of the week
-- - if 31 days and the first days is at least the second to last day
if column_fday >= 5 then
if last_day.day == 30 and column_fday == 6 or last_day.day == 31 then
num_rows = num_rows + 1
end
end
-- If the first day of february is anything but the first day of the week
elseif column_fday > 1 then
-- Span over 5 weeks
num_rows = num_rows + 1
end
-- Create grid layout
local layout = grid()
if props.flex_height then
layout:set_expand(true)
end
layout:set_homogeneous(true)
layout:set_spacing(props.spacing)
layout:set_forced_num_rows(num_rows)
layout:set_forced_num_cols(num_columns)
--local flags = {"header", "weekdays", "weeknumber", "normal", "focus"} --local flags = {"header", "weekdays", "weeknumber", "normal", "focus"}
local cell_date, t, i, j, w, flag, text local cell_date, t, i, j, w, flag, text
@ -331,6 +365,7 @@ local function get_calendar(type, date, font)
ret._private.week_numbers = beautiful.calendar_week_numbers or false ret._private.week_numbers = beautiful.calendar_week_numbers or false
ret._private.start_sunday = beautiful.calendar_start_sunday or false ret._private.start_sunday = beautiful.calendar_start_sunday or false
ret._private.long_weekdays = beautiful.calendar_long_weekdays or false ret._private.long_weekdays = beautiful.calendar_long_weekdays or false
ret._private.flex_height = beautiful.calendar_flex_height or false
ret._private.fn_embed = function (w, _) return w end ret._private.fn_embed = function (w, _) return w end
-- header specific -- header specific

View File

@ -0,0 +1,23 @@
--DOC_GEN_IMAGE --DOC_HIDE
local parent = ... --DOC_HIDE
local wibox = require("wibox") --DOC_HIDE
local beautiful = require( "beautiful" ) --DOC_HIDE
local Pango = require("lgi").Pango --DOC_HIDE
require("_date") --DOC_HIDE
-- Beautiful fake get_font --DOC_HIDE
local f = Pango.FontDescription.from_string("monospace 10") --DOC_HIDE
beautiful.get_font = function() return f end --DOC_HIDE
-- Fake beautiful theme --DOC_HIDE
beautiful.fg_focus = "#ff9800" --DOC_HIDE
beautiful.bg_focus = "#b9214f" --DOC_HIDE
local cal = wibox.widget {
date = os.date("*t"),
font = "Monospace 10",
flex_height = true,
widget = wibox.widget.calendar.month
}
parent:add(cal) --DOC_HIDE