Skip to content

Commit

Permalink
Merge pull request #526 from undefiened/limit_consecutive_skips
Browse files Browse the repository at this point in the history
Plugin for limiting the number of consecutive skips or postpones
  • Loading branch information
archisman-panigrahi authored Jul 14, 2024
2 parents e91f8a5 + fabdc4a commit 3df23f1
Show file tree
Hide file tree
Showing 6 changed files with 147 additions and 2 deletions.
16 changes: 16 additions & 0 deletions safeeyes/config/locale/en_US/LC_MESSAGES/safeeyes.po
Original file line number Diff line number Diff line change
Expand Up @@ -512,3 +512,19 @@ msgstr "Pause media"
# plugin/healthstats
#~ msgid "Interval to reset statistics (in hours)"
#~ msgstr "Interval to reset statistics (in hours)"

# plugin/limitconsecutiveskipping
msgid "Limit Consecutive Skipping"
msgstr "Limit Consecutive Skipping"

# plugin/limitconsecutiveskipping
msgid "How many skips or postpones are allowed in a row"
msgstr "How many skips or postpones are allowed in a row"

# plugin/limitconsecutiveskipping
msgid "Limit how many breaks can be skipped or postponed in a row"
msgstr "Limit how many breaks can be skipped or postponed in a row"

# plugin/limitconsecutiveskipping
msgid "Skipped or postponed %d/%d breaks in a row"
msgstr "Skipped or postponed %d/%d breaks in a row"
4 changes: 4 additions & 0 deletions safeeyes/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ def __init__(self, context):
self.context = context
self.context['skipped'] = False
self.context['postponed'] = False
self.context['skip_button_disabled'] = False
self.context['postpone_button_disabled'] = False
self.context['state'] = State.WAITING

def initialize(self, config):
Expand Down Expand Up @@ -299,6 +301,8 @@ def __fire_stop_break(self):

# Reset the skipped flag
self.context['skipped'] = False
self.context['skip_button_disabled'] = False
self.context['postpone_button_disabled'] = False
self.__start_next_break()

def __wait_for(self, duration):
Expand Down
23 changes: 23 additions & 0 deletions safeeyes/plugins/limitconsecutiveskipping/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"meta": {
"name": "Limit Consecutive Skipping",
"description": "Limit how many breaks can be skipped or postponed in a row",
"version": "0.0.1"
},
"dependencies": {
"python_modules": [],
"shell_commands": [],
"operating_systems": [],
"desktop_environments": [],
"resources": []
},
"settings": [{
"id": "number_of_allowed_skips_in_a_row",
"label": "How many skips or postpones are allowed in a row",
"type": "INT",
"default": 2,
"min": 1,
"max": 100
}],
"break_override_allowed": true
}
Binary file added safeeyes/plugins/limitconsecutiveskipping/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
99 changes: 99 additions & 0 deletions safeeyes/plugins/limitconsecutiveskipping/plugin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
#!/usr/bin/env python
# Safe Eyes is a utility to remind you to take break frequently
# to protect your eyes from eye strain.

# Copyright (C) 2024 Leo (@undefiened), based on the code written by Gobinath

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
Limit how many breaks can be skipped or postponed in a row.
"""

import logging

context = None
no_of_skipped_breaks = 0
session = None
enabled = True

def init(ctx, safeeyes_config, plugin_config):
"""
Initialize the plugin.
"""
global enabled
global context
global session
global no_of_skipped_breaks
global no_allowed_skips

logging.debug('Initialize Limit consecutive skipping plugin')
context = ctx

no_allowed_skips = plugin_config.get('number_of_allowed_skips_in_a_row', 2)

if session is None:
# Read the session
session = context['session']['plugin'].get('limitconsecutiveskipping', None)
if session is None:
session = {'no_of_skipped_breaks': 0}
context['session']['plugin']['limitconsecutiveskipping'] = session
no_of_skipped_breaks = session.get('no_of_skipped_breaks', 0)


def on_stop_break():
"""
After the break, check if it is skipped.
"""
# Check if the plugin is enabled
if not enabled:
return

global no_of_skipped_breaks
if context['skipped'] or context['postponed']:
no_of_skipped_breaks += 1
session['no_of_skipped_breaks'] = no_of_skipped_breaks
else:
no_of_skipped_breaks = 0
session['no_of_skipped_breaks'] = no_of_skipped_breaks


def on_start_break(break_obj):
logging.debug('Skipped / allowed = {} / {}'.format(no_of_skipped_breaks, no_allowed_skips))

if no_of_skipped_breaks >= no_allowed_skips:
context['postpone_button_disabled'] = True
context['skip_button_disabled'] = True


def get_widget_title(break_obj):
"""
Return the widget title.
"""
# Check if the plugin is enabled
if not enabled:
return ""

return _('Limit Consecutive Skipping')


def get_widget_content(break_obj):
"""
Return the statistics.
"""
# Check if the plugin is enabled
if not enabled:
return ""

return _('Skipped or postponed %d/%d breaks in a row') % (no_of_skipped_breaks, no_allowed_skips)

7 changes: 5 additions & 2 deletions safeeyes/ui/break_screen.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,9 @@ def __show_break_screen(self, message, image_path, widget, tray_actions):
no_of_monitors = display.get_n_monitors()
logging.info("Show break screens in %d display(s)", no_of_monitors)

skip_button_disabled = self.context.get('skip_button_disabled', False)
postpone_button_disabled = self.context.get('postpone_button_disabled', False)

for monitor_num in range(no_of_monitors):
monitor = display.get_monitor(monitor_num)
monitor_gemoetry = monitor.get_geometry()
Expand Down Expand Up @@ -188,15 +191,15 @@ def __show_break_screen(self, message, image_path, widget, tray_actions):
toolbar_button.show()

# Add the buttons
if self.enable_postpone:
if self.enable_postpone and not postpone_button_disabled:
# Add postpone button
btn_postpone = Gtk.Button.new_with_label(_('Postpone'))
btn_postpone.get_style_context().add_class('btn_postpone')
btn_postpone.connect('clicked', self.on_postpone_clicked)
btn_postpone.set_visible(True)
box_buttons.pack_start(btn_postpone, True, True, 0)

if not self.strict_break:
if not self.strict_break and not skip_button_disabled:
# Add the skip button
btn_skip = Gtk.Button.new_with_label(_('Skip'))
btn_skip.get_style_context().add_class('btn_skip')
Expand Down

0 comments on commit 3df23f1

Please sign in to comment.