Basic play controls are now working
authorEd Page <eopage@byu.net>
Sat, 1 May 2010 13:17:07 +0000 (08:17 -0500)
committerEd Page <eopage@byu.net>
Sat, 1 May 2010 13:17:07 +0000 (08:17 -0500)
hand_tests/fake_player.py [new file with mode: 0644]
hand_tests/test_controls.py [new file with mode: 0755]
src/imagestore.py [new file with mode: 0644]
src/playcontrol.py [new file with mode: 0644]

diff --git a/hand_tests/fake_player.py b/hand_tests/fake_player.py
new file mode 100644 (file)
index 0000000..78e6840
--- /dev/null
@@ -0,0 +1,97 @@
+import logging
+
+import gobject
+import gtk
+
+
+_moduleLogger = logging.getLogger(__name__)
+
+
+class FakePlayer(gobject.GObject):
+
+       __gsignals__ = {
+               'state_change' : (
+                       gobject.SIGNAL_RUN_LAST,
+                       gobject.TYPE_NONE,
+                       (gobject.TYPE_PYOBJECT, ),
+               ),
+               'navigate_change' : (
+                       gobject.SIGNAL_RUN_LAST,
+                       gobject.TYPE_NONE,
+                       (gobject.TYPE_PYOBJECT, ),
+               ),
+               'title_change' : (
+                       gobject.SIGNAL_RUN_LAST,
+                       gobject.TYPE_NONE,
+                       (gobject.TYPE_PYOBJECT, ),
+               ),
+       }
+
+       def __init__(self):
+               gobject.GObject.__init__(self)
+
+               self._title = gtk.Entry()
+               self._title.connect("activate", self._title_change)
+
+               self._playButton = gtk.RadioButton(label="Play")
+               self._playButton.connect("clicked", self._state_change, "play")
+               self._pauseButton = gtk.RadioButton(group=self._playButton, label="Pause")
+               self._pauseButton.connect("clicked", self._state_change, "pause")
+               self._stopButton = gtk.RadioButton(group=self._playButton, label="stop")
+               self._stopButton.connect("clicked", self._state_change, "stop")
+
+               self._canNavigate = gtk.CheckButton("Can Navigate?")
+               self._canNavigate.connect("clicked", self._navigate_change)
+
+               self._layout = gtk.VBox()
+               self._layout.pack_start(self._title)
+               self._layout.pack_start(self._playButton)
+               self._layout.pack_start(self._pauseButton)
+               self._layout.pack_start(self._stopButton)
+               self._layout.pack_start(self._canNavigate)
+
+               self._state = "play"
+
+       @property
+       def toplevel(self):
+               return self._layout
+
+       @property
+       def title(self):
+               return self._title.get_text()
+
+       @property
+       def can_navigate(self):
+               return self._canNavigate.get_active()
+
+       @property
+       def state(self):
+               return self._state
+
+       def _state_change(self, widget, state):
+               self.emit("state_change", state)
+               self._state = state
+
+       def _navigate_change(self, widget):
+               self.emit("navigate_change", self._canNavigate.get_active())
+
+       def _title_change(self, widget):
+               self.emit("title_change", self._title.get_text())
+
+       def play(self):
+               _moduleLogger.info("play")
+
+       def pause(self):
+               _moduleLogger.info("pause")
+
+       def stop(self):
+               _moduleLogger.info("stop")
+
+       def back(self):
+               _moduleLogger.info("back")
+
+       def next(self):
+               _moduleLogger.info("next")
+
+
+gobject.type_register(FakePlayer)
diff --git a/hand_tests/test_controls.py b/hand_tests/test_controls.py
new file mode 100755 (executable)
index 0000000..fcfe8bc
--- /dev/null
@@ -0,0 +1,33 @@
+#!/usr/bin/env python
+
+import sys
+import logging
+
+import gtk
+
+sys.path.append('../src')
+
+import imagestore
+import playcontrol
+import fake_player
+
+
+if __name__ == "__main__":
+       logging.basicConfig(level=logging.DEBUG)
+
+       store = imagestore.ImageStore("../data", ".")
+
+       player = fake_player.FakePlayer()
+       sp = playcontrol.PlayControl(player, store)
+
+       layout = gtk.VBox()
+       layout.pack_start(player.toplevel)
+       layout.pack_start(sp.toplevel)
+
+       window = gtk.Window()
+       window.set_title("Test")
+       window.add(layout)
+       window.connect("destroy", lambda w: gtk.main_quit())
+       window.show_all()
+
+       gtk.main()
diff --git a/src/imagestore.py b/src/imagestore.py
new file mode 100644 (file)
index 0000000..7119d65
--- /dev/null
@@ -0,0 +1,22 @@
+import os
+
+import cairo
+import gtk
+
+
+class ImageStore(object):
+
+       def __init__(self, storePath, cachePath):
+               self._storePath = storePath
+               self._cachePath = cachePath
+
+       def get_surface_from_store(self, image):
+               path = os.path.join(self._storePath, image)
+               image = cairo.ImageSurface.create_from_png(path)
+               return image
+
+       def get_image_from_store(self, image):
+               path = os.path.join(self._storePath, image)
+               image = gtk.Image()
+               image.set_from_file(path)
+               return image
diff --git a/src/playcontrol.py b/src/playcontrol.py
new file mode 100644 (file)
index 0000000..b24325d
--- /dev/null
@@ -0,0 +1,108 @@
+import logging
+
+import gtk
+
+import util.misc as misc_utils
+
+
+_moduleLogger = logging.getLogger(__name__)
+
+
+class PlayControl(object):
+
+       def __init__(self, player, store):
+               self._store = store
+
+               self._player = player
+               self._player.connect("state-change", self._on_player_state_change)
+               self._player.connect("navigate-change", self._on_player_nav_change)
+
+               img = store.get_image_from_store("prev.png")
+               self._back = gtk.Button()
+               self._back.set_image(img)
+               self._back.connect("clicked", self._on_back_clicked)
+
+               img = store.get_image_from_store("stop.png")
+               self._stop = gtk.Button()
+               self._stop.set_image(img)
+               self._stop.connect("clicked", self._on_stop_clicked)
+
+               img = store.get_image_from_store("pause.png")
+               self._pause = gtk.Button()
+               self._pause.set_image(img)
+               self._pause.connect("clicked", self._on_pause_clicked)
+
+               img = store.get_image_from_store("play.png")
+               self._play = gtk.Button()
+               self._play.set_image(img)
+               self._play.connect("clicked", self._on_play_clicked)
+
+               img = store.get_image_from_store("next.png")
+               self._next = gtk.Button()
+               self._next.set_image(img)
+               self._next.connect("clicked", self._on_next_clicked)
+
+               self._controls = gtk.HBox()
+               self._controls.pack_start(self._back)
+               self._controls.pack_start(self._stop)
+               self._controls.pack_start(self._pause)
+               self._controls.pack_start(self._play)
+               self._controls.pack_start(self._next)
+
+       @property
+       def toplevel(self):
+               return self._controls
+
+       @misc_utils.log_exception(_moduleLogger)
+       def _on_player_state_change(self, player, newState):
+               if newState == "play":
+                       self._pause.show()
+                       self._play.hide()
+               elif newState == "pause":
+                       self._pause.hide()
+                       self._play.show()
+               elif newState == "stop":
+                       self._pause.hide()
+                       self._play.show()
+
+               if self._player.can_navigate:
+                       self._back.show()
+                       self._next.show()
+               else:
+                       self._back.hide()
+                       self._next.hide()
+
+       @misc_utils.log_exception(_moduleLogger)
+       def _on_player_nav_change(self, player, canNavigate):
+               if canNavigate:
+                       self._back.show()
+                       self._next.show()
+               else:
+                       self._back.hide()
+                       self._next.hide()
+
+       @misc_utils.log_exception(_moduleLogger)
+       def _on_back_clicked(self, *args):
+               self._player.back()
+
+       @misc_utils.log_exception(_moduleLogger)
+       def _on_stop_clicked(self, *args):
+               self._pause.hide()
+               self._play.show()
+               self._player.stop()
+
+       @misc_utils.log_exception(_moduleLogger)
+       def _on_pause_clicked(self, *args):
+               self._pause.show()
+               self._play.hide()
+               self._player.pause()
+
+       @misc_utils.log_exception(_moduleLogger)
+       def _on_play_clicked(self, *args):
+               self._pause.hide()
+               self._play.show()
+               self._player.play()
+
+       @misc_utils.log_exception(_moduleLogger)
+       def _on_next_clicked(self, *args):
+               self._player.next()