--- /dev/null
+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)
--- /dev/null
+#!/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()
--- /dev/null
+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
--- /dev/null
+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()