Roughly working first try for show/take long break

This commit is contained in:
AdamPS 2021-04-28 18:27:50 +01:00
parent 736f15e907
commit c8a874611d
6 changed files with 63 additions and 23 deletions

View File

@ -77,6 +77,7 @@
"version": "0.0.3",
"settings": {
"show_time_in_tray": false,
"show_long_break_time": false,
"allow_disabling": true,
"disable_options": [{
"time": 30,

View File

@ -131,7 +131,20 @@ class SafeEyesCore:
logging.debug("Postpone the break for %d seconds", self.postpone_duration)
self.context['postponed'] = True
def take_break(self):
def get_break_time(self, long_break=False):
"""
Returns the next break time
"""
time = self.scheduled_next_break_time;
if (long_break):
break_obj = self.break_queue.get_break(long_break)
if not break_obj:
return False
time += datetime.timedelta(minutes=break_obj.time)
return time
def take_break(self, long_break=False):
"""
Calling this method stops the scheduler and show the next break screen
"""
@ -139,15 +152,15 @@ class SafeEyesCore:
return
if not self.context['state'] == State.WAITING:
return
utility.start_thread(self.__take_break)
utility.start_thread(self.__take_break, long_break=long_break)
def has_breaks(self):
def has_breaks(self, long_break=False):
"""
Check whether Safe Eyes has breaks or not.
"""
return not self.break_queue.is_empty()
return not self.break_queue.is_empty(long_break)
def __take_break(self):
def __take_break(self, long_break=False):
"""
Show the next break screen
"""
@ -167,7 +180,7 @@ class SafeEyesCore:
time.sleep(1) # Wait for 1 sec to ensure the sceduler is dead
self.running = True
utility.execute_main_thread(self.__fire_start_break)
utility.execute_main_thread(self.__fire_start_break, long_break)
def __scheduler_job(self):
"""
@ -243,9 +256,9 @@ class SafeEyesCore:
self.__wait_for(self.postpone_duration)
utility.execute_main_thread(self.__fire_start_break)
def __fire_start_break(self):
def __fire_start_break(self, long_break=False):
# Show the break screen
if not self.on_start_break.fire(self.break_queue.get_break()):
if not self.on_start_break.fire(self.break_queue.get_break(long_break)):
# Plugins want to ignore this break
self.__start_next_break()
return
@ -258,15 +271,15 @@ class SafeEyesCore:
# Wait in user thread
utility.start_thread(self.__postpone_break)
else:
self.start_break.fire(self.break_queue.get_break())
utility.start_thread(self.__start_break)
self.start_break.fire(self.break_queue.get_break(long_break))
utility.start_thread(self.__start_break, long_break=long_break)
def __start_break(self):
def __start_break(self, long_break=False):
"""
Start the break screen.
"""
self.context['state'] = State.BREAK
break_obj = self.break_queue.get_break()
break_obj = self.break_queue.get_break(long_break)
countdown = break_obj.duration
total_break_time = countdown

View File

@ -113,10 +113,13 @@ class BreakQueue:
while brk != current_break and brk.name != last_break:
brk = self.next()
def get_break(self):
def get_break(self, long_break=False):
if self.__current_break is None:
self.__current_break = self.next()
return self.__current_break
if long_break:
return self.__next_long()
else:
return self.__current_break
def is_long_break(self):
return self.__current_break is not None and self.__current_break.type == BreakType.LONG_BREAK
@ -162,12 +165,12 @@ class BreakQueue:
def reset(self):
for break_object in self.__short_queue:
break_object.time = self.__short_break_time
for break_object in self.__long_queue:
break_object.time = self.__long_break_time
def is_empty(self):
return self.__short_queue is None and self.__long_queue is None
def is_empty(self, long_break=False):
return (long_break or self.__short_queue is None) and self.__long_queue is None
def __next_short(self):
longs = self.__long_queue

View File

@ -18,6 +18,12 @@
"type": "BOOL",
"default": false
},
{
"id": "show_long_break_time",
"label": "Show long break times",
"type": "BOOL",
"default": false
},
{
"id": "allow_disabling",
"label": "Allow disabling Safe Eyes",

View File

@ -51,6 +51,7 @@ class TrayIcon:
self.on_disable = context['api']['disable_safeeyes']
self.take_break = context['api']['take_break']
self.has_breaks = context['api']['has_breaks']
self.get_break_time = context['api']['get_break_time']
self.plugin_config = plugin_config
self.date_time = None
self.active = True
@ -122,10 +123,14 @@ class TrayIcon:
# Add the sub menu to the enable/disable menu
self.item_disable.set_submenu(self.sub_menu_disable)
# Settings menu item
# Manual break menu item
self.item_manual_break = Gtk.MenuItem()
self.item_manual_break.connect('activate', self.on_manual_break_clicked)
# Manual long break menu item
self.item_manual_long_break = Gtk.MenuItem()
self.item_manual_long_break.connect('activate', self.on_manual_long_break_clicked)
# Settings menu item
self.item_settings = Gtk.MenuItem()
self.item_settings.connect('activate', self.show_settings)
@ -149,6 +154,7 @@ class TrayIcon:
self.menu.append(self.item_enable)
self.menu.append(self.item_disable)
self.menu.append(self.item_manual_break)
self.menu.append(self.item_manual_long_break)
self.menu.append(self.item_settings)
self.menu.append(self.item_about)
self.menu.append(self.item_quit)
@ -186,6 +192,7 @@ class TrayIcon:
self.item_disable.set_label(_('Disable Safe Eyes'))
breaks_found = self.has_breaks()
long_breaks_found = self.has_breaks(long_break = True)
if breaks_found:
if self.active:
if self.date_time:
@ -206,8 +213,10 @@ class TrayIcon:
self.item_enable.set_sensitive(breaks_found and not self.active)
self.item_disable.set_sensitive(breaks_found and self.active)
self.item_manual_break.set_sensitive(breaks_found and self.active)
self.item_manual_long_break.set_sensitive(long_breaks_found and self.active)
self.item_manual_break.set_label(_('Take a break now'))
self.item_manual_long_break.set_label(_('Take a long break now'))
self.item_settings.set_label(_('Settings'))
self.item_about.set_label(_('About'))
self.item_quit.set_label(_('Quit'))
@ -263,8 +272,10 @@ class TrayIcon:
"""
A private method to be called within this class to update the next break information using self.dateTime.
"""
formatted_time = utility.format_time(self.date_time)
show_long = self.plugin_config.get('show_long_break_time', False)
formatted_time = utility.format_time(self.get_break_time(show_long))
message = _('Next break at %s') % (formatted_time)
# Update the menu item label
utility.execute_main_thread(self.item_info.set_label, message)
# Update the tray icon label
@ -279,6 +290,12 @@ class TrayIcon:
"""
self.take_break()
def on_manual_long_break_clicked(self, *args):
"""
Trigger a break manually.
"""
self.take_break(long_break = True)
def on_enable_clicked(self, *args):
"""
Handle 'Enable Safe Eyes' menu action.

View File

@ -93,10 +93,10 @@ class SafeEyes:
self.safe_eyes_core.on_stop_break += self.stop_break
self.safe_eyes_core.on_update_next_break += self.update_next_break
self.safe_eyes_core.initialize(self.config)
self.context['api']['take_break'] = lambda: utility.execute_main_thread(
self.safe_eyes_core.take_break)
self.context['api']['take_break'] = self.safe_eyes_core.take_break
self.context['api']['has_breaks'] = self.safe_eyes_core.has_breaks
self.context['api']['postpone'] = self.safe_eyes_core.postpone
self.context['api']['get_break_time'] = self.safe_eyes_core.get_break_time
self.plugins_manager.init(self.context, self.config)
atexit.register(self.persist_session)
@ -295,11 +295,11 @@ class SafeEyes:
self.plugins_manager.stop_break()
return True
def take_break(self):
def take_break(self, long_break=False):
"""
Take a break now.
"""
self.safe_eyes_core.take_break()
self.safe_eyes_core.take_break(long_break)
def status(self):
"""