mirror of https://github.com/einverne/dotfiles.git
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
154 lines
4.5 KiB
4 years ago
|
--- === 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
|