Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 39 additions & 1 deletion py3status/modules/pomodoro.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
Button 3 resets timer.

Configuration parameters:
cycles: number of full pomodoro cycles before stopping (default None)
display_bar: display time in bars when True, otherwise in seconds
(default False)
format: define custom time format. See placeholders below (default '{ss}')
Expand All @@ -30,6 +31,7 @@
Format placeholders:
{bar} display time in bars
{breakno} current break number
{cycleno} = current cycle in progress (1-based)
{ss} display time in total seconds (1500)
{mm} display time in total minutes (25)
{mmss} display time in (hh-)mm-ss (25:00)
Expand Down Expand Up @@ -66,6 +68,7 @@ class Py3status:
""" """

# available configuration parameters
cycles = None
display_bar = False
format = "{ss}"
format_active = "Pomodoro [{format}]"
Expand Down Expand Up @@ -105,6 +108,10 @@ def _init(self):
self._timer = None
self._end_time = None
self._alert = False
# NEW: cycle tracking (additive, does not affect defaults)
self._cycle_count = 0
self._long_break_active = False
self._cycle_message = None
if self.display_bar is True:
self.format = "{bar}"
self._initialized = True
Expand All @@ -126,14 +133,40 @@ def _advance(self, user_action=False):
self._time_left = self.timer_break
self._section_time = self.timer_break
self._break_number += 1
self._long_break_active = False
if self._break_number >= self.pomodoros:
self._time_left = self.timer_long_break
self._section_time = self.timer_long_break
self._break_number = 0
self._long_break_active = True
self._active = False
else:
if not user_action:
self.py3.play_sound(self.sound_break_end)
# NEW: increment cycle only after long break completion

if self._long_break_active:
self._cycle_count += 1
self._alert = True

if self.cycles is not None and self._cycle_count == self.cycles:
final_cycle = self._cycle_count # capture before reset
# FINAL cycle message ONLY
self._cycle_message = f"All {final_cycle} cycles completed — reset"
self.py3.notify_user("Pomodoro cycles completed")
# reset for next batch
self._cycle_count = 0
self._break_number = 0
self._long_break_active = False
self._time_left = self.timer_pomodoro
self._section_time = self.timer_pomodoro
self._active = True
self._running = False
return

# NORMAL per-cycle message
self._cycle_message = f"Cycle {self._cycle_count} completed"

self._time_left = self.timer_pomodoro
self._section_time = self.timer_pomodoro
self._active = True
Expand Down Expand Up @@ -210,7 +243,7 @@ def pomodoro(self):
else:
time_left = ceil(self._time_left)

vals = {"ss": int(time_left), "mm": ceil(time_left / 60)}
vals = {"ss": int(time_left), "mm": ceil(time_left / 60), "cycleno": self._cycle_count + 1}

if self.py3.format_contains(self.format, "mmss"):
hours, rest = divmod(time_left, 3600)
Expand All @@ -229,6 +262,11 @@ def pomodoro(self):

formatted = self.format.format(**vals)

# show cycle message once if present
if self._cycle_message:
formatted = f"{formatted} | {self._cycle_message}"
self._cycle_message = None

if self._running:
if self._active:
format = self.format_active
Expand Down