diff options
| author | rixx <rixx-git@cutebit.de> | 2015-03-19 15:40:36 +0100 |
|---|---|---|
| committer | rixx <rixx-git@cutebit.de> | 2015-03-19 15:43:53 +0100 |
| commit | 102313553232fae442a17d2c6193ee43b5852d22 (patch) | |
| tree | 9992c9e424d8105c378be4e4452aba8f4fd295a7 /py3status/modules/pomodoro.py | |
| parent | 74c855d59f8aacc0b67261d2e5b7ac7402877360 (diff) | |
| parent | dbbe4cdc6bf9d428f6fa5e2fb3c7a8dd6198abcd (diff) | |
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'py3status/modules/pomodoro.py')
| -rw-r--r-- | py3status/modules/pomodoro.py | 88 |
1 files changed, 81 insertions, 7 deletions
diff --git a/py3status/modules/pomodoro.py b/py3status/modules/pomodoro.py index 7fcecba..ecb3f57 100644 --- a/py3status/modules/pomodoro.py +++ b/py3status/modules/pomodoro.py @@ -4,13 +4,40 @@ Pomodoro countdown on i3bar originally written by @Fandekasp (Adrien Lemaire) """ from subprocess import call +from syslog import syslog, LOG_INFO from time import time +try: + from pygame import mixer + mixer.init() +except ImportError: + mixer = None + +# PROGRESS_BAR_ITEMS = u"▁▃▄▅▆▇█" +PROGRESS_BAR_ITEMS = u"▏▎▍▌▋▊▉" + class Py3status: + """ + Configuration parameters: + - display_bar: display time in bars when True, otherwise in seconds + - max_breaks: maximum number of breaks + - num_progress_bars: number of progress bars + - sound_break_end: break end sound (file path) + - sound_pomodoro_end: pomodoro end sound (file path) + - sound_pomodoro_start: pomodoro start sound (file path) + - timer_break: normal break time (seconds) (requires pygame) + - timer_long_break: long break time (seconds) (requires pygame) + - timer_pomodoro: pomodoro time (seconds) (requires pygame) + """ # available configuration parameters + display_bar = False max_breaks = 4 + num_progress_bars = 5 + sound_break_end = None + sound_pomodoro_end = None + sound_pomodoro_start = None timer_break = 5 * 60 timer_long_break = 15 * 60 timer_pomodoro = 25 * 60 @@ -23,15 +50,16 @@ class Py3status: def on_click(self, i3s_output_list, i3s_config, event): """ Handles click events: - - left click starts an inactive counter and pauses a running - Pomodoro - - middle click resets everything - - right click starts (and ends, if needed) a break + - left click starts an inactive counter and pauses a running + Pomodoro + - middle click resets everything + - right click starts (and ends, if needed) a break """ if event['button'] == 1: if self.status == 'stop': self.status = 'start' + self.__play_sound(self.sound_pomodoro_start) self.run = True elif self.status == 'break': @@ -64,9 +92,28 @@ class Py3status: """ Return the response full_text string """ - return { - 'full_text': '{} ({})'.format(self.prefix, self.timer) - } + if self.display_bar and self.status in ('start', 'pause'): + bar = u'' + items_cnt = len(PROGRESS_BAR_ITEMS) + bar = u'' + bar_val = float(self.timer) / self.time_window * \ + self.num_progress_bars + while bar_val > 0: + selector = int(bar_val * items_cnt) + selector = min(selector, items_cnt - 1) + bar += PROGRESS_BAR_ITEMS[selector] + bar_val -= 1 + + bar = bar.ljust(self.num_progress_bars).encode('utf_8') + else: + bar = self.timer + + if self.run: + text = '{} [{}]'.format(self.prefix, bar) + else: + text = '{} ({})'.format(self.prefix, bar) + + return dict(full_text=text) def __setup(self, status): """ @@ -77,20 +124,24 @@ class Py3status: self.prefix = 'Pomodoro' self.status = 'stop' self.timer = self.timer_pomodoro + self.time_window = self.timer self.breaks = 1 elif status == 'start': self.prefix = 'Pomodoro' self.timer = self.timer_pomodoro + self.time_window = self.timer elif status == 'break': self.prefix = 'Break #%d' % self.breaks if self.breaks > self.max_breaks: self.timer = self.timer_long_break + self.time_window = self.timer self.breaks = 1 else: self.breaks += 1 self.timer = self.timer_break + self.time_window = self.timer def __decrement(self): """ @@ -101,12 +152,16 @@ class Py3status: self.alert = True self.run = False self.__i3_nagbar() + if self.status == 'start': self.__setup('break') self.status = 'break' + self.__play_sound(self.sound_pomodoro_end) + elif self.status == 'break': self.__setup('start') self.status = 'start' + self.__play_sound(self.sound_break_end) def __i3_nagbar(self, level='warning'): """ @@ -144,6 +199,25 @@ class Py3status: response['cached_until'] = time() return response + def __play_sound(self, sound_fname): + """Play sound if required + """ + if not sound_fname: + return + + if not mixer: + syslog(LOG_INFO, "pomodoro module: the pygame library is required" + " to play sounds") + return + + try: + mixer.music.load(sound_fname) + except Exception as e: + return + + mixer.music.play() + + if __name__ == "__main__": """ Test this module by calling it directly. |
