Skip to content

Commit cea63ce

Browse files
committedSep 29, 2017
Add countdown panel. Working on issue #5
1 parent 192c969 commit cea63ce

File tree

3 files changed

+81
-1
lines changed

3 files changed

+81
-1
lines changed
 

Diff for: ‎src/countdown_panel.py

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import wx
2+
import wx.lib.newevent
3+
import datetime
4+
import time
5+
6+
CountdownPanelEvent, EVT_COUNTDOWN_RANOUT_EVENT = wx.lib.newevent.NewEvent()
7+
8+
class CountdownPanel(wx.Panel):
9+
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.TAB_TRAVERSAL, name=wx.PanelNameStr):
10+
super(CountdownPanel, self).__init__(parent, id, pos, size, style, name)
11+
self.timer = wx.Timer()
12+
self.timer.Bind(wx.EVT_TIMER, self._on_timer)
13+
self.end_time = 0
14+
15+
self.label = wx.StaticText(self, label="00:00:00", style=wx.ALIGN_CENTRE_HORIZONTAL)
16+
17+
sizer = wx.BoxSizer(wx.VERTICAL)
18+
sizer.Add((0,0), 1, wx.EXPAND)
19+
sizer.Add(self.label, 0, wx.CENTER | wx.ALL)
20+
sizer.Add((0,0), 1, wx.EXPAND)
21+
self.SetSizer(sizer)
22+
23+
self.Bind(wx.EVT_SIZE, self._on_resize)
24+
self._recalculate_font_size()
25+
26+
def start_timer(self, timedelta):
27+
if self.timer.IsRunning():
28+
self.timer.Stop()
29+
self.timer.Start(1000)
30+
seconds = timedelta
31+
if (type(timedelta) is datetime.timedelta):
32+
seconds = timedelta.total_seconds()
33+
self.end_time = time.time() + seconds
34+
self._update_label()
35+
36+
def _recalculate_font_size(self):
37+
font = self.label.GetFont()
38+
fontHeight = self.GetSize().height / 4
39+
font.SetPixelSize(wx.Size(0, fontHeight))
40+
self.label.SetFont(font)
41+
42+
def _on_resize(self, e):
43+
self._recalculate_font_size()
44+
e.Skip()
45+
46+
def _on_timer(self, e):
47+
self._update_label()
48+
49+
def _update_label(self):
50+
seconds = int(round(self.end_time - time.time()))
51+
if seconds < 0:
52+
self.timer.Stop()
53+
wx.PostEvent(self.GetEventHandler(), CountdownPanelEvent())
54+
return
55+
minutes, seconds = divmod(seconds, 60)
56+
hours, minutes = divmod(minutes, 60)
57+
self.label.SetLabel( "{:0>2}:{:0>2}:{:0>2}".format(hours, minutes, seconds) )

Diff for: ‎src/main.pyw

+6
Original file line numberDiff line numberDiff line change
@@ -189,13 +189,15 @@ class MainFrame(wx.Frame):
189189
no_show_item = menu_play.Append(wx.ID_ANY, "&No Show")
190190
menu_play.AppendSeparator()
191191
play_pause_bg_item = menu_play.Append(wx.ID_ANY, "&Play/Pause Background\tF3")
192+
start_countdown_item = menu_play.Append(wx.ID_ANY, "Countdown")
192193

193194
self.Bind(wx.EVT_MENU, self.emergency_stop, emergency_stop_item)
194195
self.Bind(wx.EVT_MENU, self.show_zad, show_zad_item)
195196
self.Bind(wx.EVT_MENU, self.play_async, play_track_item)
196197
self.Bind(wx.EVT_MENU, self.clear_zad, clear_zad_item)
197198
self.Bind(wx.EVT_MENU, lambda e: self.clear_zad(e, True), no_show_item)
198199
self.Bind(wx.EVT_MENU, self.play_pause_bg, play_pause_bg_item)
200+
self.Bind(wx.EVT_MENU, self.start_countdown, start_countdown_item)
199201

200202
self.SetAcceleratorTable(wx.AcceleratorTable([
201203
wx.AcceleratorEntry(wx.ACCEL_NORMAL, wx.WXK_ESCAPE, emergency_stop_item.GetId()),
@@ -1061,6 +1063,10 @@ class MainFrame(wx.Frame):
10611063
else:
10621064
self.background_pause(paused=True)
10631065

1066+
def start_countdown(self, e=None):
1067+
self.ensure_proj_win()
1068+
self.proj_win.switch_to_timer(65) # TODO: dialog with time settings
1069+
10641070

10651071
if __name__ == "__main__":
10661072
app = wx.App(False)

Diff for: ‎src/projector.py

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import wx
2-
2+
import countdown_panel
33

44
class ProjectorWindow(wx.Frame):
55
def __init__(self, parent, screen=None):
@@ -49,8 +49,14 @@ def on_paint(self, e):
4949
dc.DrawBitmap(self.drawable_bitmap, w//2 - drw_w//2, 0)
5050

5151
self.images_panel = ImagesPanel(self)
52+
53+
self.countdown_panel = countdown_panel.CountdownPanel(self)
54+
self.countdown_panel.Bind(countdown_panel.EVT_COUNTDOWN_RANOUT_EVENT, self.on_timer_ranout)
55+
self.countdown_panel.Hide()
56+
5257
self.sizer.Add(self.images_panel, 1, wx.EXPAND)
5358
self.sizer.Add(self.video_panel, 1, wx.EXPAND) # TODO: Align top
59+
self.sizer.Add(self.countdown_panel, 1, wx.EXPAND)
5460

5561
self.SetSizer(self.sizer)
5662
self.Layout()
@@ -81,3 +87,14 @@ def no_show(self):
8187
self.images_panel.drawable_bitmap = \
8288
wx.Bitmap(wx.Image(*self.images_panel.drawable_bitmap.GetSize()))
8389
self.images_panel.Refresh()
90+
91+
def switch_to_timer(self, timedelta):
92+
self.video_panel.Hide()
93+
self.images_panel.Hide()
94+
self.countdown_panel.start_timer(timedelta)
95+
self.countdown_panel.Show()
96+
97+
def on_timer_ranout(self, e):
98+
self.countdown_panel.Hide()
99+
self.images_panel.Show()
100+
self.no_show()

0 commit comments

Comments
 (0)
Please sign in to comment.