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.
153 lines
4.5 KiB
153 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
|
|
|