my personal dotfiles managed by dotbot, zinit
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
4.5 KiB

--- === TimeFlow ===
---
--- A widget showing time flown in one year.
---
--- Download: [https://github.com/Hammerspoon/Spoons/raw/master/Spoons/TimeFlow.spoon.zip](https://github.com/Hammerspoon/Spoons/raw/master/Spoons/TimeFlow.spoon.zip)
local obj={}
obj.__index = obj
-- Metadata
obj.name = "TimeFlow"
obj.version = "1.0"
obj.author = "ashfinal <[email protected]>"
obj.homepage = "https://github.com/Hammerspoon/Spoons"
obj.license = "MIT - https://opensource.org/licenses/MIT"
-- Internal function used to find our location, so we know where to load files from
local function script_path()
local str = debug.getinfo(2, "S").source:sub(2)
return str:match("(.*/)")
end
obj.spoonPath = script_path()
local function updateElapsedCanvas()
local nowtable = os.date("*t")
local nowyday = nowtable.yday
local nowhour = string.format("%2s", nowtable.hour)
local nowmin = string.format("%2s", nowtable.min)
local nowsec = string.format("%2s", nowtable.sec)
local timestr = nowyday.." days "..nowhour.." hours "..nowmin.." min "..nowsec.." sec"
local secs_since_epoch = os.time()
local nowyear = nowtable.year
local yearstartsecs_since_epoch = os.time({year=nowyear, month=1, day=1, hour=0})
local nowyear_elapsed_secs = secs_since_epoch - yearstartsecs_since_epoch
local yearendsecs_since_epoch = os.time({year=nowyear+1, month=1, day=1, hour=0})
local nowyear_total_secs = yearendsecs_since_epoch - yearstartsecs_since_epoch
local elapsed_percent = nowyear_elapsed_secs/nowyear_total_secs
if obj.canvas:isShowing() then
obj.canvas[3].text = timestr
obj.canvas[6].frame.w = tostring(240/280*elapsed_percent)
end
end
function obj:init()
local cscreen = hs.screen.mainScreen()
local cres = cscreen:fullFrame()
obj.canvas = hs.canvas.new({
x = cres.w-280-20,
y = 400,
w = 280,
h = 125
}):show()
obj.canvas:behavior(hs.canvas.windowBehaviors.canJoinAllSpaces)
obj.canvas:level(hs.canvas.windowLevels.desktopIcon)
-- canvas background
obj.canvas[1] = {
action = "fill",
type = "rectangle",
fillColor = {hex="#000000", alpha=0.2},
roundedRectRadii = {xRadius=5, yRadius=5},
}
-- title
obj.canvas[2] = {
type = "text",
text = "Time Elapsed",
textSize = 14,
textColor = {hex="#FFFFFF", alpha=0.3},
frame = {
x = tostring(10/280),
y = tostring(10/125),
w = tostring(260/280),
h = tostring(25/125),
}
}
-- time
obj.canvas[3] = {
type = "text",
text = "",
textColor = {hex="#A6AAC3"},
textSize = 17,
textAlignment = "center",
frame = {
x = tostring(0/280),
y = tostring(35/125),
w = tostring(280/280),
h = tostring(25/125),
}
}
-- indicator background
obj.canvas[4] = {
type = "image",
image = hs.image.imageFromPath(self.spoonPath .. "/timebg.png"),
frame = {
x = tostring(10/280),
y = tostring(65/125),
w = tostring(260/280),
h = tostring(50/125),
}
}
-- light indicator
obj.canvas[5] = {
action = "fill",
type = "rectangle",
fillColor = {hex="#FFFFFF", alpha=0.2},
frame = {
x = tostring(20/280),
y = tostring(75/125),
w = tostring(240/280),
h = tostring(20/125),
}
}
-- indicator mask
obj.canvas[6] = {
action = "fill",
type = "rectangle",
frame = {
x = tostring(20/280),
y = tostring(75/125),
w = tostring(240/280),
h = tostring(20/125),
}
}
-- color indicator
obj.canvas[7] = {
action = "fill",
type = "rectangle",
frame = {
x = tostring(20/280),
y = tostring(75/125),
w = tostring(240/280),
h = tostring(20/125),
},
fillGradient="linear",
fillGradientColors = {
{hex = "#00A0F7"},
{hex = "#92D2E5"},
{hex = "#4BE581"},
{hex = "#EAF25E"},
{hex = "#F4CA55"},
{hex = "#E04E4E"},
},
}
obj.canvas[7].compositeRule = "sourceAtop"
if obj.timer == nil then
obj.timer = hs.timer.doEvery(1, function() updateElapsedCanvas() end)
else
obj.timer:start()
end
end
return obj