Source code for timelinelib.wxgui.frames.mainframe.alertcontroller
# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 Rickard Lindberg, Roger Lindberg
#
# This file is part of Timeline.
#
# Timeline 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.
#
# Timeline 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 Timeline. If not, see <http://www.gnu.org/licenses/>.
import wx
from timelinelib.wxgui.dialogs.textdisplay.view import TextDisplayDialog
from timelinelib.wxgui.timer import TimelineTimer
[docs]class AlertController:
"""
This controller checks all events to find out if any alert is due to expire.
If an alert time has expired a dialog is opened that shows the alert information.
The AlertController is created and "owned" by the
:class:`~timelinelib.wxgui.frames.mainframe.mainframe.MainFrame` class.
"""
[docs] def __init__(self, main_frame):
self._main_frame = main_frame
self._timeline = main_frame.timeline
self._timer = None
self._alert_dialog_open = False
[docs] def start_timer(self):
"""Start the timer that issuses tick events every 10 seconds."""
self._timer = TimelineTimer(self._main_frame)
self._timer.register(self._timer_tick)
self._timer.start(10000)
return self
[docs] def stop_timer(self):
"""Just stop the timer."""
self._timer.stop()
def _timer_tick(self, evt):
if self._timeline is None:
return
if self._alert_dialog_open:
return
self._display_events_alerts()
self._alert_dialog_open = False
def _display_events_alerts_dialogs(self, all_events, time_type, dialog=None):
self._active = True
self._dialog = dialog
self.time_type = time_type
for event in [event for event in all_events if event.get_data("alert") is not None]:
alert = event.get_data("alert")
if self._time_has_expired(alert[0]):
self._display_and_delete_event_alert(event, alert)
def _display_events_alerts(self):
self._alert_dialog_open = True
all_events = self._timeline.get_all_events()
self._display_events_alerts_dialogs(all_events, self._timeline.get_time_type())
def _display_and_delete_event_alert(self, event, alert):
self._display_alert_dialog(alert, event)
event.set_data("alert", None)
if self._main_frame.controller.ok_to_edit():
try:
event.save()
finally:
self._main_frame.controller.edit_ends()
def _time_has_expired(self, time):
return time <= self.time_type.now()
def _display_alert_dialog(self, alert, event):
text = self._format_alert_text(alert, event)
if self._dialog is None:
self._dialog = TextDisplayDialog("Alert")
wx.Bell()
self._dialog.SetText(text)
self._dialog.SetWindowStyleFlag(self._dialog.GetWindowStyleFlag() | wx.STAY_ON_TOP)
self._dialog.ShowModal()
self._dialog.Destroy()
def _format_alert_text(self, alert, event):
text1 = "Trigger time: %s\n\n" % alert[0]
text2 = "Event: %s\n\n" % event.get_label(self.time_type)
text = "%s%s%s" % (text1, text2, alert[1])
return text