From 0e5ae300fb29b2e4161f51b85778dccfe57307e0 Mon Sep 17 00:00:00 2001 From: streetturtle Date: Sun, 15 Dec 2019 22:10:22 -0500 Subject: themes for calendar widget --- calendar-widget/calendar.lua | 293 ++++++++++++++++++++++++------------------- 1 file changed, 164 insertions(+), 129 deletions(-) (limited to 'calendar-widget/calendar.lua') diff --git a/calendar-widget/calendar.lua b/calendar-widget/calendar.lua index f612e09..b98b3a4 100644 --- a/calendar-widget/calendar.lua +++ b/calendar-widget/calendar.lua @@ -15,148 +15,183 @@ local gears = require("gears") local calendar_widget = {} -local styles = {} -local function rounded_shape(size) - return function(cr, width, height) - gears.shape.rounded_rect(cr, width, height, size) - end -end +local function worker(args) + + local calendar_themes = { + nord = { + bg = '#2E3440', + fg = '#D8DEE9', + focus_date_bg = '#88C0D0', + focus_date_fg = '#000000', + weekend_day_bg = '#3B4252', + weekday_fg = '#88C0D0', + header_fg = '#E5E9F0', + border = '#4C566A' + }, + outrun = { + bg = '#0d0221', + fg = '#D8DEE9', + focus_date_bg = '#650d89', + focus_date_fg = '#2de6e2', + weekend_day_bg = '#261447', + weekday_fg = '#2de6e2', + header_fg = '#f6019d', + border = '#261447' + } + } + -styles.month = { - padding = 4, - bg_color = '#2E3440', - border_width = 0, -} - -styles.normal = { - markup = function(t) return t end, - shape = rounded_shape(4) -} - -styles.focus = { - fg_color = '#000000', - bg_color = '#88C0D0', - markup = function(t) return '' .. t .. '' end, - shape = rounded_shape(4) -} - -styles.header = { - fg_color = '#E5E9F0', - markup = function(t) return '' .. t .. '' end, - bg_color = '#2E3440' -} - -styles.weekday = { - fg_color = '#88C0D0', - markup = function(t) return '' .. t .. '' end, - bg_color = '#2E3440', -} - -local function decorate_cell(widget, flag, date) - if flag == 'monthheader' and not styles.monthheader then - flag = 'header' - end + local args = args or {} + + local theme = args.theme or 'nord' + local placement = args.placement or 'top' - -- highlight only today's day - if flag == 'focus' then - local today = os.date('*t') - if today.month ~= date.month then - flag = 'normal' + local styles = {} + local function rounded_shape(size) + return function(cr, width, height) + gears.shape.rounded_rect(cr, width, height, size) end end - local props = styles[flag] or {} - if props.markup and widget.get_text and widget.set_markup then - widget:set_markup(props.markup(widget:get_text())) - end - -- Change bg color for weekends - local d = { year = date.year, month = (date.month or 1), day = (date.day or 1) } - local weekday = tonumber(os.date('%w', os.time(d))) - local default_bg = (weekday == 0 or weekday == 6) and '#3B4252' or '#2E3440' - local ret = wibox.widget { - { + styles.month = { + padding = 4, + bg_color = calendar_themes[theme].bg, + border_width = 0, + } + + styles.normal = { + markup = function(t) return t end, + shape = rounded_shape(4) + } + + styles.focus = { + fg_color = calendar_themes[theme].focus_date_fg, + bg_color = calendar_themes[theme].focus_date_bg, + markup = function(t) return '' .. t .. '' end, + shape = rounded_shape(4) + } + + styles.header = { + fg_color = calendar_themes[theme].header_fg, + bg_color = calendar_themes[theme].bg, + markup = function(t) return '' .. t .. '' end + } + + styles.weekday = { + fg_color = calendar_themes[theme].weekday_fg, + bg_color = calendar_themes[theme].bg, + markup = function(t) return '' .. t .. '' end, + } + + local function decorate_cell(widget, flag, date) + if flag == 'monthheader' and not styles.monthheader then + flag = 'header' + end + + -- highlight only today's day + if flag == 'focus' then + local today = os.date('*t') + if today.month ~= date.month then + flag = 'normal' + end + end + + local props = styles[flag] or {} + if props.markup and widget.get_text and widget.set_markup then + widget:set_markup(props.markup(widget:get_text())) + end + -- Change bg color for weekends + local d = { year = date.year, month = (date.month or 1), day = (date.day or 1) } + local weekday = tonumber(os.date('%w', os.time(d))) + local default_bg = (weekday == 0 or weekday == 6) and calendar_themes[theme].weekend_day_bg or calendar_themes[theme].bg + local ret = wibox.widget { { - widget, - halign = 'center', - widget = wibox.container.place + { + widget, + halign = 'center', + widget = wibox.container.place + }, + margins = (props.padding or 2) + (props.border_width or 0), + widget = wibox.container.margin }, - margins = (props.padding or 2) + (props.border_width or 0), - widget = wibox.container.margin - }, - shape = props.shape, - shape_border_color = props.border_color or '#b9214f', - shape_border_width = props.border_width or 0, - fg = props.fg_color or '#D8DEE9', - bg = props.bg_color or default_bg, - widget = wibox.container.background + shape = props.shape, + shape_border_color = props.border_color or '#000000', + shape_border_width = props.border_width or 0, + fg = props.fg_color or calendar_themes[theme].fg, + bg = props.bg_color or default_bg, + widget = wibox.container.background + } + + return ret + end + + local cal = wibox.widget { + date = os.date('*t'), + font = beautiful.get_font(), + fn_embed = decorate_cell, + long_weekdays = true, + widget = wibox.widget.calendar.month } - return ret -end + local popup = awful.popup { + ontop = true, + visible = false, + shape = gears.shape.rounded_rect, + preferred_positions = top, + offset = { y = 5 }, + border_width = 1, + border_color = calendar_themes[theme].border, + widget = cal + } -local cal = wibox.widget { - date = os.date('*t'), - font = beautiful.get_font(), - fn_embed = decorate_cell, - long_weekdays = true, - widget = wibox.widget.calendar.month -} - -local popup = awful.popup { - ontop = true, - visible = false, - shape = gears.shape.rounded_rect, - preferred_positions = top, - offset = { y = 5 }, - border_width = 1, - border_color = '#4C566A', - widget = cal -} - -popup:buttons( - awful.util.table.join( - awful.button({}, 4, function() - local a = cal:get_date() - a.month = a.month + 1 - cal:set_date(nil) - cal:set_date(a) - popup:set_widget(cal) - end), - awful.button({}, 5, function() - local a = cal:get_date() - a.month = a.month - 1 - cal:set_date(nil) - cal:set_date(a) - popup:set_widget(cal) - end) - ) -) - -function calendar_widget.toggle() - - if popup.visible then - -- to faster render the calendar refresh it and just hide - cal:set_date(nil) -- the new date is not set without removing the old one - cal:set_date(os.date('*t')) - popup:set_widget(nil) -- just in case - popup:set_widget(cal) - popup.visible = not popup.visible - else - if not beautiful.calendar_placement then - awful.placement.top(popup, { margins = { top = 30 }, parent = awful.screen.focused() }) - elseif beautiful.calendar_placement == 'top' then - awful.placement.top(popup, { margins = { top = 30 }, parent = awful.screen.focused() }) - elseif beautiful.calendar_placement == 'top_right' then - awful.placement.top_right(popup, { margins = { top = 30, right = 10}, parent = awful.screen.focused() }) - elseif beautiful.calendar_placement == 'bottom_right' then - awful.placement.bottom_right(popup, { margins = { bottom = 20, right = 10}, parent = awful.screen.focused() }) + popup:buttons( + awful.util.table.join( + awful.button({}, 4, function() + local a = cal:get_date() + a.month = a.month + 1 + cal:set_date(nil) + cal:set_date(a) + popup:set_widget(cal) + end), + awful.button({}, 5, function() + local a = cal:get_date() + a.month = a.month - 1 + cal:set_date(nil) + cal:set_date(a) + popup:set_widget(cal) + end) + ) + ) + + function calendar_widget.toggle() + + if popup.visible then + -- to faster render the calendar refresh it and just hide + cal:set_date(nil) -- the new date is not set without removing the old one + cal:set_date(os.date('*t')) + popup:set_widget(nil) -- just in case + popup:set_widget(cal) + popup.visible = not popup.visible else - awful.placement.top(popup, { margins = { top = 30 }, parent = awful.screen.focused() }) + if placement == 'top' then + awful.placement.top(popup, { margins = { top = 30 }, parent = awful.screen.focused() }) + elseif placement == 'top_right' then + awful.placement.top_right(popup, { margins = { top = 30, right = 10}, parent = awful.screen.focused() }) + elseif placement == 'bottom_right' then + awful.placement.bottom_right(popup, { margins = { bottom = 30, right = 10}, parent = awful.screen.focused() }) + else + awful.placement.top(popup, { margins = { top = 30 }, parent = awful.screen.focused() }) + end + + popup.visible = true + end + end - popup.visible = true + return calendar_widget - end end -return calendar_widget +return setmetatable(calendar_widget, { __call = function(_, ...) + return worker(...) +end }) -- cgit v1.2.3