diff --git a/calendar.lua b/calendar.lua
index e15092d..49e1fec 100644
--- a/calendar.lua
+++ b/calendar.lua
@@ -1,11 +1,27 @@
local beautiful = beautiful
local wibox = wibox
+local conf = conf
+local modkey = conf.modkey or "Mod4"
+local mb = require("modalbind")
+local log = log
local calendar = {}
-local weekday = {"su","mo","tu","we","th","fr","sa"}
+local weekdays = {"Su","Mo","Tu","We","Th","Fr","Sa"}
local monthdays = {31,28,31,30,31,30,31,31,30,31,30,31}
+local monthnames = {"January", "February", "March", "April", "May", "June",
+ "July", "August", "September", "October", "November", "December"}
+local num_rows = 6
+
+local function get_weekday(day)
+ index = day + conf.calendar.start_week
+ if index > 7 then
+ index = index - math.floor(index / 7) * 7
+ end
+ print(index)
+ return weekdays[index]
+end
function calendar.setup()
local cal = {}
@@ -18,44 +34,69 @@ function calendar.setup()
border_color = beautiful.bg_focus,
})
- cal.widget = wibox.widget.textbox()
+ cal.title = wibox.widget.textbox()
cal.layout = wibox.layout.fixed.vertical()
- cal.layout:add(cal.widget)
+ cal.layout:add(cal.title)
cal.wibox:set_widget(cal.layout)
cal.wibox.screen = 1
- cal.wibox.visible = true
- cal.widget:set_markup("Calendar")
- cal.widget:set_align("center")
+ cal.wibox.visible = false
+ cal.wibox.ontop = true
+ cal.title:set_align("center")
+ cal:set_title("Calendar loading")
+ local wdays = wibox.layout.flex.horizontal()
+ local fieldwidth = 0
+ for day = 1,7,1 do
+ local label = wibox.widget.textbox()
+ wdays:add(label)
+ label:set_align("center")
+ label:set_markup(""..get_weekday(day).."")
+ local w,_ = label:fit(screen[1].geometry.width, screen[1].geometry.height)
+ fieldwidth = math.max(w, fieldwidth)
+ if beautiful.fontface then
+ label:set_font(beautiful.fontface .. " " .. (beautiful.fontsize + 4))
+ end
+ end
+ cal.layout:add(wdays)
+ local _, title_h = cal.title:fit(0, 0)
+ local _, wdays_h = wdays:fit(0, 0)
+ cal.header_height = title_h + wdays_h
+ cal.header_width = (fieldwidth + 10) * 7
- local rows = wibox.layout.fixed.vertical()
local cols = {}
local days = {}
- for row = 1, 5, 1 do
+ for row = 1, num_rows, 1 do
days[row] = {}
cols[row] = wibox.layout.flex.horizontal()
for day = 1,7,1 do
days[row][day] = wibox.widget.textbox()
local d = days[row][day]
cols[row]:add(d)
+ d:set_text("[99]")
d:set_align("center")
if beautiful.fontface then
d:set_font(beautiful.fontface .. " " .. (beautiful.fontsize + 4))
end
end
- rows:add(cols[row])
+ cal.layout:add(cols[row])
end
- cal.rows = rows
cal.cols = cols
cal.days = days
- cal.layout:add(rows)
+ cal.offset = 0
-
- cal:fill_days()
cal:calculate_size()
+ cal:fill_days()
+
+ cal.layout:buttons(awful.util.table.join(
+ awful.button({ }, 1, function () cal:next() end),
+ awful.button({ }, 2, function () cal:now() end),
+ awful.button({ }, 3, function () cal:prev() end)
+ ));
+
+ return cal
end
function calendar:calculate_size()
@@ -63,63 +104,132 @@ function calendar:calculate_size()
local fieldwidth = 0
local inner_minheight = 0
- for row = 1, 5, 1 do
+ for row = 1, num_rows, 1 do
for day = 1,7,1 do
local w,_ = self.days[row][day]:fit(screen[1].geometry.width, screen[1].geometry.height)
fieldwidth = math.max(w, fieldwidth)
end
- _, inner_minheight = self.cols[row]:fit(
- 0, 0
- )
+ _, inner_minheight = self.cols[row]:fit(0, 0)
minheight = minheight + inner_minheight
end
- _, inner_minheight = self.widget:fit(screen[1].geometry.width, screen[1].geometry.height)
- minheight = minheight + inner_minheight
+-- _, inner_minheight = self.title:fit(screen[1].geometry.width, screen[1].geometry.height)
+-- minheight = minheight + inner_minheight
- self.wibox.width = fieldwidth * 9;
- self.wibox.height = math.max(50, minheight)
- self.wibox.x = 30
- self.wibox.y = screen[1].geometry.height - self.wibox.height - 50
+ self.wibox.width = math.max(fieldwidth * 9, self.header_width);
+ self.wibox.height = math.max(50, minheight) + self.header_height
+ self.wibox.x = 18
+ self.wibox.y = 0 -- screen[1].geometry.height - self.wibox.height - 50
end
-function calendar:set_day(row, col, date, current)
+function calendar:set_day_by_date(row, col, date, current)
if(current == date.day) then
self.days[row][col]:set_markup(
""..current.."")
+ .. "\" weight=\"ultrabold\">["..current.."]")
else
self.days[row][col]:set_text(current)
end
end
+function calendar:set_day_label(row, col, label)
+ self.days[row][col]:set_markup(label)
+end
+
+function calendar:next()
+ self.offset = self.offset + 1
+ self:fill_days()
+end
+
+function calendar:prev()
+ self.offset = self.offset - 1
+ self:fill_days()
+end
+
+function calendar:now()
+ self.offset = 0
+ self:fill_days()
+end
function calendar:fill_days()
local date = os.date("*t")
+ if self.offset ~= 0 then
+ local newdate = {}
+ newdate.year = date.year
+ newdate.day = 1
+ newdate.month = date.month + self.offset
- local startday = date.wday - date.day % 7+ 1
+ while newdate.month < 1 do
+ newdate.year = newdate.year - 1
+ newdate.month = newdate.month + 12
+ end
+
+ while newdate.month > 12 do
+ newdate.year = newdate.year + 1
+ newdate.month = newdate.month - 12
+ end
+
+ date = os.date("*t", os.time(newdate))
+ end
+
+ self:set_title(monthnames[date.month] .. " " .. date.year)
+
+ local startday = (date.wday - date.day - conf.calendar.start_week) % 7 + 1
local cur_day = 1
+
+ for d = 1, startday - 1, 1 do
+ self.days[1][d]:set_text("")
+ end
+
for d = startday, 7, 1 do
- self:set_day(1, d, date, cur_day)
+ if self.offset == 0 then
+ self:set_day_by_date(1, d, date, cur_day)
+ else
+ self.days[1][d]:set_text(cur_day)
+ end
+
cur_day = cur_day + 1
end
- for r = 2,5,1 do
+ for r = 2,num_rows,1 do
for d = 1, 7, 1 do
- self:set_day(r, d, date, cur_day)
- cur_day = cur_day + 1
if(cur_day > monthdays[date.month]) then
- return
+ self.days[r][d]:set_text("")
+ else
+ if self.offset == 0 then
+ self:set_day_by_date(r, d, date, cur_day)
+ else
+ self.days[r][d]:set_text(cur_day)
+ end
end
+ cur_day = cur_day + 1
end
end
end
+function calendar:toggle()
+ self:update_before_showing()
+ self.wibox.visible = not self.wibox.visible
+end
+
+function calendar:show()
+ self:update_before_showing()
+ self.wibox.visible = true
+end
+
+function calendar:update_before_showing()
+ if not self.wibox.visible then
+ self:fill_days()
+ end
+end
+
+function calendar:set_title(text)
+ self.title:set_markup(""..text.."")
+end
+
-- settings.x_offset < 0 and
-- screen[s].geometry.x - width + settings.x_offset or
-- settings.x_offset
-local mt = { __call = calendar.setup }
-
-return setmetatable(calendar, mt)
+return calendar.setup()