Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Plugin for limiting the number of consecutive skips or postpones #526

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
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
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 @@ -500,3 +500,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 @@ -288,6 +290,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.
94 changes: 94 additions & 0 deletions safeeyes/plugins/limitconsecutiveskipping/plugin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
#!/usr/bin/env python
# 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 @@ -155,6 +155,9 @@ def __show_break_screen(self, message, image_path, widget, tray_actions):
no_of_monitors = screen.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 in range(no_of_monitors):
monitor_gemoetry = screen.get_monitor_geometry(monitor)
x = monitor_gemoetry.x
Expand Down Expand Up @@ -186,15 +189,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(_('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(_('Skip'))
btn_skip.get_style_context().add_class('btn_skip')
Expand Down