136 lines
4.5 KiB
Lua
136 lines
4.5 KiB
Lua
|
-------------------------------------------------
|
||
|
-- Pomodoro Arc Widget for Awesome Window Manager
|
||
|
-- Modelled after Pavel Makhov's work
|
||
|
|
||
|
-- @author Raphaël Fournier-S'niehotta
|
||
|
-- @copyright 2018 Raphaël Fournier-S'niehotta
|
||
|
-------------------------------------------------
|
||
|
|
||
|
local awful = require("awful")
|
||
|
local beautiful = require("beautiful")
|
||
|
local spawn = require("awful.spawn")
|
||
|
local watch = require("awful.widget.watch")
|
||
|
local wibox = require("wibox")
|
||
|
local naughty = require("naughty")
|
||
|
|
||
|
local GET_pomodoro_CMD = "pomo clock"
|
||
|
local PAUSE_pomodoro_CMD = "pomo pause"
|
||
|
local START_pomodoro_CMD = "pomo start"
|
||
|
local STOP_pomodoro_CMD = "pomo stop"
|
||
|
|
||
|
local text = wibox.widget {
|
||
|
id = "txt",
|
||
|
--font = "Play 12",
|
||
|
font = "Inconsolata Medium 13",
|
||
|
widget = wibox.widget.textbox
|
||
|
}
|
||
|
-- mirror the text, because the whole widget will be mirrored after
|
||
|
local mirrored_text = wibox.container.margin(wibox.container.mirror(text, { horizontal = true }))
|
||
|
mirrored_text.right = 5 -- pour centrer le texte dans le rond
|
||
|
--
|
||
|
--local mirrored_text = wibox.container.mirror(text, { horizontal = true })
|
||
|
|
||
|
-- mirrored text with background
|
||
|
local mirrored_text_with_background = wibox.container.background(mirrored_text)
|
||
|
|
||
|
local pomodoroarc = wibox.widget {
|
||
|
mirrored_text_with_background,
|
||
|
max_value = 1,
|
||
|
thickness = 2,
|
||
|
start_angle = 4.71238898, -- 2pi*3/4
|
||
|
forced_height = 32,
|
||
|
forced_width = 32,
|
||
|
rounded_edge = true,
|
||
|
bg = "#ffffff11",
|
||
|
paddings = 0,
|
||
|
widget = wibox.container.arcchart
|
||
|
}
|
||
|
|
||
|
local pomodoroarc_widget = wibox.container.mirror(pomodoroarc, { horizontal = true })
|
||
|
|
||
|
local update_graphic = function(widget, stdout, _, _, _)
|
||
|
local pomostatus = string.match(stdout, " (%D?%D?):%D?%D?")
|
||
|
if pomostatus == "--" then
|
||
|
text.font = "Inconsolata Medium 13"
|
||
|
widget.colors = { beautiful.widget_main_color }
|
||
|
text.text = "25"
|
||
|
widget.value = 1
|
||
|
else
|
||
|
text.font = "Inconsolata Medium 13"
|
||
|
local pomomin = string.match(stdout, "[ P]?[BW](%d?%d?):%d?%d?")
|
||
|
local pomosec = string.match(stdout, "[ P]?[BW]%d?%d?:(%d?%d?)")
|
||
|
local pomodoro = pomomin * 60 + pomosec
|
||
|
|
||
|
local status = string.match(stdout, "([ P]?)[BW]%d?%d?:%d?%d?")
|
||
|
local workbreak = string.match(stdout, "[ P]?([BW])%d?%d?:%d?%d?")
|
||
|
text.text = pomomin
|
||
|
|
||
|
-- Helps debugging
|
||
|
--naughty.notify {
|
||
|
--text = pomomin,
|
||
|
--title = "pomodoro debug",
|
||
|
--timeout = 5,
|
||
|
--hover_timeout = 0.5,
|
||
|
--width = 200,
|
||
|
--}
|
||
|
|
||
|
if status == " " then -- clock ticking
|
||
|
if workbreak == "W" then
|
||
|
widget.value = tonumber(pomodoro/(25*60))
|
||
|
if tonumber(pomomin) < 5 then -- last 5 min of pomo
|
||
|
widget.colors = { beautiful.widget_red }
|
||
|
else
|
||
|
widget.colors = { beautiful.widget_blue }
|
||
|
end
|
||
|
elseif workbreak == "B" then -- color during pause
|
||
|
widget.colors = { beautiful.widget_green }
|
||
|
widget.value = tonumber(pomodoro/(5*60))
|
||
|
end
|
||
|
elseif status == "P" then -- paused
|
||
|
if workbreak == "W" then
|
||
|
widget.colors = { beautiful.widget_yellow }
|
||
|
widget.value = tonumber(pomodoro/(25*60))
|
||
|
text.font = "Inconsolata Medium 13"
|
||
|
text.text = "PW"
|
||
|
elseif workbreak == "B" then
|
||
|
widget.colors = { beautiful.widget_yellow }
|
||
|
widget.value = tonumber(pomodoro/(5*60))
|
||
|
text.font = "Inconsolata Medium 13"
|
||
|
text.text = "PB"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
pomodoroarc:connect_signal("button::press", function(_, _, _, button)
|
||
|
if (button == 2) then awful.spawn(PAUSE_pomodoro_CMD, false)
|
||
|
elseif (button == 1) then awful.spawn(START_pomodoro_CMD, false)
|
||
|
elseif (button == 3) then awful.spawn(STOP_pomodoro_CMD, false)
|
||
|
end
|
||
|
|
||
|
spawn.easy_async(GET_pomodoro_CMD, function(stdout, stderr, exitreason, exitcode)
|
||
|
update_graphic(pomodoroarc, stdout, stderr, exitreason, exitcode)
|
||
|
end)
|
||
|
end)
|
||
|
|
||
|
local notification
|
||
|
function show_pomodoro_status()
|
||
|
spawn.easy_async(GET_pomodoro_CMD,
|
||
|
function(stdout, _, _, _)
|
||
|
notification = naughty.notify {
|
||
|
text = stdout,
|
||
|
title = "pomodoro status",
|
||
|
timeout = 5,
|
||
|
hover_timeout = 0.5,
|
||
|
width = 200,
|
||
|
}
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
pomodoroarc:connect_signal("mouse::enter", function() show_pomodoro_status() end)
|
||
|
pomodoroarc:connect_signal("mouse::leave", function() naughty.destroy(notification) end)
|
||
|
|
||
|
watch(GET_pomodoro_CMD, 1, update_graphic, pomodoroarc)
|
||
|
|
||
|
return pomodoroarc_widget
|