From a97a3a7ab405b56fdce94015e555a469d58b012b Mon Sep 17 00:00:00 2001 From: Ed Page Date: Sat, 1 May 2010 11:57:22 -0500 Subject: [PATCH] Initial checkin of the presentor --- data/next.png | Bin 9204 -> 9598 bytes data/pause.png | Bin 7974 -> 5695 bytes data/play.png | Bin 8498 -> 6281 bytes data/prev.png | Bin 9388 -> 9641 bytes data/stop.png | Bin 5677 -> 5397 bytes hand_tests/fake_player.py | 4 + hand_tests/test_presenter.py | 32 +++++ src/__init__.py | 2 + src/imagestore.py | 20 +++ src/presenter.py | 304 ++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 362 insertions(+) create mode 100755 hand_tests/test_presenter.py create mode 100644 src/presenter.py diff --git a/data/next.png b/data/next.png index 20c771ef193fa61bf1423f6ad8f045501e08f958..cfc53dd5cf730e42acd00acfc26473aede66a004 100644 GIT binary patch delta 6989 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 diff --git a/data/pause.png b/data/pause.png index 5b89e1835574a5cd449fddb8a157dc1371347958..e9d5aa65c535672cbace2f5f1557c52faab6972a 100644 GIT binary patch literal 5695 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 NXsSL@sa3WL{XaQLl3oA+ literal 8498 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

Kmx^ zOm79MjeeYaU!H|oTJ8Iy1Hd$2PGXUz)Y{ZKx4{eM3%B?80sjnohF%}i`U)QA7lRmc zDoHc(O}Yw8nj5}<_o#f=dKJ!XK7iP{6u80#zl)NNBKT^xebt_5-C}lg?od}$)YIFm zriFaH9W7WjM+XK^lWdW* zcttnv63t8aoiOkTu{Dsm_+1nJNKc?u{tu}#cks^d1)j8Ou23Xz!{9R|H~Daz7klQM zi38@4uFT=gvrMX%+~j~3atfoL*Y774M8sG+qfuJz)h=O(gOOlsJb!9{q`MX&773rj zQln%2Y}#nc{DBbjMP`9d9S}u)`&lN;<9(}LIxc#q>_LPC1O$Q~fT13IXr5dEGa8SE z!^!UvA(Br4fr(Phx_~w)NBHUQ7qg0yO0Keu-#)XEQp9!g2?%(z88x51k0<368>1-r zN!0LFtBeA+huc|Rj^#(ykW7z_h4lfKTIkYAS~>z6lDsSfkgQ8$1ye0`eIXA9gm1Q95(b=?z*y#a|i z`_LOrh&)|;qREPZJ6v~Z1Mnm&=>kg1Vb-L=ix$k&K=y7Wfp=OWjl#^764}4?47UW? zdc{I$P2}jKV$hejc)i##DVTqe)ViD9}yEgJv z;SPmxc;kPMu(|jk-Ho ztbbWlSNEEanR#$WX)yNX-`#&k(I?{~&3E{>KR_CHlT1k8Gv}#MXGh0CB1%fbT8p6% z;?thBMADHhS~KG!$A4%AoN|C+W$+prTu5Oxz1yRaC0BfWycP!8tLM1e)#7L1hE{}| zqDU8=eGro22nFzFl_^bd@x=Q%a-37k=H0Kjyu9QbWK;Ivf$IcIZ&H9U z9+v6af*yqE-w=N7*NoraMQ#*p3``{?6=zZJk}SAQ!DpU7bW5zZhd1aYrO!HN@~!jf z#_dB(@Z!w5AFKd!$wP8Y0RX%%Mp+4puIh8HtajLJ?7qIA5URfoewGVhHAq(a|1TZ> fA5HO^>)b?RM5fa^QJv#CzW^x6s7hB$BEtR)0zJf* diff --git a/data/prev.png b/data/prev.png index cd50dec4621abaeffc84649fbdfd1ca4324cd9fd..cacd89e141fc9e9824de80c90edf3b0e516f22d5 100644 GIT binary patch delta 7032 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 diff --git a/data/stop.png b/data/stop.png index 9ea591f4869941663878c16ea2074d96520937ad..abffa482edbe3b602cf437fe021000954b0806c7 100644 GIT binary patch literal 5397 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 O1#~rUYE-D%Mf@K%^HSsh diff --git a/hand_tests/fake_player.py b/hand_tests/fake_player.py index 78e6840..d9c84cc 100644 --- a/hand_tests/fake_player.py +++ b/hand_tests/fake_player.py @@ -68,6 +68,10 @@ class FakePlayer(gobject.GObject): def state(self): return self._state + @property + def background(self): + return "night_temple_background" + def _state_change(self, widget, state): self.emit("state_change", state) self._state = state diff --git a/hand_tests/test_presenter.py b/hand_tests/test_presenter.py new file mode 100755 index 0000000..70622b2 --- /dev/null +++ b/hand_tests/test_presenter.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +import sys +import logging + +import gtk + +sys.path.append('../src') + +import imagestore +import presenter +import fake_player + + +if __name__ == "__main__": + logging.basicConfig(level=logging.DEBUG) + + store = imagestore.ImageStore("../data", ".") + player = fake_player.FakePlayer() + sp = presenter.StreamPresenter(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/__init__.py b/src/__init__.py index 4265cc3..7132119 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1 +1,3 @@ #!/usr/bin/env python + +import utils diff --git a/src/imagestore.py b/src/imagestore.py index 7119d65..e5e351c 100644 --- a/src/imagestore.py +++ b/src/imagestore.py @@ -6,6 +6,26 @@ import gtk class ImageStore(object): + STORE_LOOKUP = { + "next": "next.png", + "prev": "prev.png", + "pause": "pause.png", + "play": "play.png", + "stop": "stop.png", + "generic_background": "radiobackground_01.png", + "night_temple_background": "radiobackground_02.png", + "day_temple_background": "radiobackground_03.png", + "presidency_background": "radiobackground_04.png", + "scriptures_background": "radiobackground_05.png", + "conference": "conference.png", + "magazines": "magazines.png", + "more": "more.png", + "mormonmessages": "mormonmessages.png", + "radio": "radio.png", + "scriptures": "scriptures.png", + "icon": "icon.png", + } + def __init__(self, storePath, cachePath): self._storePath = storePath self._cachePath = cachePath diff --git a/src/presenter.py b/src/presenter.py new file mode 100644 index 0000000..20359af --- /dev/null +++ b/src/presenter.py @@ -0,0 +1,304 @@ +import logging + +import pango +import cairo +import gtk + +import util.misc as misc_utils + + +_moduleLogger = logging.getLogger(__name__) + + +class StreamPresenter(object): + + MINIMUM_MOVEMENT = 20 + + BUTTON_STATE_PLAY = "play" + BUTTON_STATE_PAUSE = "pause" + BUTTON_STATE_NEXT = "next" + BUTTON_STATE_BACK = "back" + BUTTON_STATE_UP = "up" + BUTTON_STATE_CANCEL = "cancel" + + _NO_POSITION = -1, -1 + + _STATE_TO_IMAGE = { + BUTTON_STATE_PLAY: "play.png", + BUTTON_STATE_PAUSE: "pause.png", + BUTTON_STATE_NEXT: "next.png", + BUTTON_STATE_BACK: "prev.png", + } + + 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) + self._player.connect("title-change", self._on_player_title_change) + + self._image = gtk.DrawingArea() + self._image.connect("expose_event", self._on_expose) + self._imageEvents = gtk.EventBox() + self._imageEvents.connect("motion_notify_event", self._on_motion_notify) + #self._imageEvents.connect("leave_notify_event", self._on_leave_notify) + #self._imageEvents.connect("proximity_in_event", self._on_motion_notify) + #self._imageEvents.connect("proximity_out_event", self._on_leave_notify) + self._imageEvents.connect("button_press_event", self._on_button_press) + self._imageEvents.connect("button_release_event", self._on_button_release) + self._imageEvents.add(self._image) + + self._isPortrait = True + + self._canNavigate = True + self._clickPosition = self._NO_POSITION + self._potentialButtonState = self.BUTTON_STATE_PLAY + self._currentButtonState = self.BUTTON_STATE_PLAY + + imagePath = self._store.STORE_LOOKUP[self._player.background] + self._backgroundImage = self._store.get_surface_from_store(imagePath) + imagePath = self._STATE_TO_IMAGE[self._currentButtonState] + self._buttonImage = self._store.get_surface_from_store(imagePath) + + if self._isPortrait: + backWidth = self._backgroundImage.get_width() + backHeight = self._backgroundImage.get_height() + else: + backHeight = self._backgroundImage.get_width() + backWidth = self._backgroundImage.get_height() + self._image.set_size_request(backWidth, backHeight) + + @property + def toplevel(self): + return self._imageEvents + + def set_orientation(self, orientation): + if orientation == gtk.ORIENTATION_VERTICAL: + self._isPortrait = True + elif orientation == gtk.ORIENTATION_HORIZONTAL: + self._isPortrait = False + else: + raise NotImplementedError(orientation) + + cairoContext = self._image.window.cairo_create() + if not self._isPortrait: + cairoContext.transform(cairo.Matrix(0, 1, 1, 0, 0, 0)) + self._draw_presenter(cairoContext, self._currentButtonState) + + @misc_utils.log_exception(_moduleLogger) + def _on_player_state_change(self, player, newState): + if newState == "play": + newState = self.BUTTON_STATE_PLAY + elif newState == "pause": + newState = self.BUTTON_STATE_PAUSE + elif newState == "stop": + newState = self.BUTTON_STATE_PAUSE + else: + newState = self._currentButtonState + + if newState != self._currentButtonState: + self._currentButtonState = newState + if self._clickPosition == self._NO_POSITION: + cairoContext = self._image.window.cairo_create() + if not self._isPortrait: + cairoContext.transform(cairo.Matrix(0, 1, 1, 0, 0, 0)) + self._draw_state(cairoContext, self._currentButtonState) + + @misc_utils.log_exception(_moduleLogger) + def _on_player_nav_change(self, player, newState): + canNavigate = self._player.can_navigate + newPotState = self._potentialButtonState + if self._canNavigate != canNavigate: + self._canNavigate = canNavigate + if self._potentialButtonState in (self.BUTTON_STATE_NEXT, self.BUTTON_STATE_BACK): + if self._currentButtonState == self.BUTTON_STATE_PLAY: + newPotState = self.BUTTON_STATE_PAUSE + else: + newPotState = self.BUTTON_STATE_PLAY + + if newPotState != self._potentialButtonState: + self._potentialButtonState = newPotState + if self._clickPosition == self._NO_POSITION: + cairoContext = self._image.window.cairo_create() + if not self._isPortrait: + cairoContext.transform(cairo.Matrix(0, 1, 1, 0, 0, 0)) + self._draw_state(cairoContext, self._potentialButtonState) + + @misc_utils.log_exception(_moduleLogger) + def _on_player_title_change(self, player, newState): + if self._isPortrait: + backWidth = self._backgroundImage.get_width() + backHeight = self._backgroundImage.get_height() + else: + backHeight = self._backgroundImage.get_width() + backWidth = self._backgroundImage.get_height() + self._image.set_size_request(backWidth, backHeight) + + imagePath = self._store.STORE_LOOKUP[self._player.background] + self._backgroundImage = self._store.get_surface_from_store(imagePath) + if self._clickPosition == self._NO_POSITION: + cairoContext = self._image.window.cairo_create() + if not self._isPortrait: + cairoContext.transform(cairo.Matrix(0, 1, 1, 0, 0, 0)) + self._draw_presenter(cairoContext, self._currentButtonState) + else: + cairoContext = self._image.window.cairo_create() + if not self._isPortrait: + cairoContext.transform(cairo.Matrix(0, 1, 1, 0, 0, 0)) + self._draw_presenter(cairoContext, self._potentialButtonState) + + @misc_utils.log_exception(_moduleLogger) + def _on_button_press(self, widget, event): + self._clickPosition = event.get_coords() + if self._currentButtonState == self.BUTTON_STATE_PLAY: + newState = self.BUTTON_STATE_PAUSE + else: + newState = self.BUTTON_STATE_PLAY + self._potentialButtonState = newState + cairoContext = self._image.window.cairo_create() + if not self._isPortrait: + cairoContext.transform(cairo.Matrix(0, 1, 1, 0, 0, 0)) + self._draw_state(cairoContext, self._potentialButtonState) + + @misc_utils.log_exception(_moduleLogger) + def _on_button_release(self, widget, event): + try: + mousePosition = event.get_coords() + newState = self._calculate_state(mousePosition) + if newState == self.BUTTON_STATE_PLAY: + self._player.play() + elif newState == self.BUTTON_STATE_PAUSE: + self._player.pause() + elif newState == self.BUTTON_STATE_NEXT: + self._player.next() + elif newState == self.BUTTON_STATE_BACK: + self._player.back() + elif newState == self.BUTTON_STATE_UP: + raise NotImplementedError("Drag-down not implemented yet") + elif newState == self.BUTTON_STATE_CANCEL: + pass + finally: + if self._player.state == "play": + newState = self.BUTTON_STATE_PLAY + else: + newState = self.BUTTON_STATE_PAUSE + self._potentialButtonState = newState + cairoContext = self._image.window.cairo_create() + if not self._isPortrait: + cairoContext.transform(cairo.Matrix(0, 1, 1, 0, 0, 0)) + self._draw_state(cairoContext, self._potentialButtonState) + self._clickPosition = self._NO_POSITION + + @misc_utils.log_exception(_moduleLogger) + def _on_motion_notify(self, widget, event): + if self._clickPosition == self._NO_POSITION: + return + + mousePosition = event.get_coords() + newState = self._calculate_state(mousePosition) + if newState != self._potentialButtonState: + self._potentialButtonState = newState + cairoContext = self._image.window.cairo_create() + if not self._isPortrait: + cairoContext.transform(cairo.Matrix(0, 1, 1, 0, 0, 0)) + self._draw_state(cairoContext, self._potentialButtonState) + + def _calculate_state(self, newCoord): + assert self._clickPosition != self._NO_POSITION + + if self._isPortrait: + delta = ( + newCoord[0] - self._clickPosition[0], + - (newCoord[1] - self._clickPosition[1]) + ) + else: + delta = ( + newCoord[1] - self._clickPosition[1], + - (newCoord[0] - self._clickPosition[0]) + ) + absDelta = (abs(delta[0]), abs(delta[1])) + if max(*absDelta) < self.MINIMUM_MOVEMENT or not self._canNavigate: + if self._currentButtonState == self.BUTTON_STATE_PLAY: + return self.BUTTON_STATE_PAUSE + else: + return self.BUTTON_STATE_PLAY + + if absDelta[0] < absDelta[1]: + if 0 < delta[1]: + return self.BUTTON_STATE_CANCEL + else: + return self.BUTTON_STATE_UP + else: + if 0 < delta[0]: + return self.BUTTON_STATE_BACK + else: + return self.BUTTON_STATE_NEXT + + @misc_utils.log_exception(_moduleLogger) + def _on_expose(self, widget, event): + self._potentialButtonState = self._player.state + cairoContext = self._image.window.cairo_create() + if not self._isPortrait: + cairoContext.transform(cairo.Matrix(0, 1, 1, 0, 0, 0)) + self._draw_presenter(cairoContext, self._player.state) + + def _draw_presenter(self, cairoContext, state): + assert state in (self._currentButtonState, self._potentialButtonState) + + # Blank things + rect = self._image.get_allocation() + cairoContext.rectangle( + 0, + 0, + rect.width, + rect.height, + ) + cairoContext.set_source_rgb(0, 0, 0) + cairoContext.fill() + cairoContext.paint() + + # Draw Background + cairoContext.set_source_surface( + self._backgroundImage, + 0, + 0, + ) + cairoContext.paint() + + # title + if self._player.title: + _moduleLogger.info("Displaying text") + backWidth = self._backgroundImage.get_width() + backHeight = self._backgroundImage.get_height() + + pangoContext = self._image.create_pango_context() + textLayout = pango.Layout(pangoContext) + textLayout.set_markup(self._player.title) + + textWidth, textHeight = textLayout.get_pixel_size() + textX = backWidth / 2 - textWidth / 2 + textY = backHeight - textHeight - self._buttonImage.get_height() + + cairoContext.move_to(textX, textY) + cairoContext.set_source_rgb(0, 0, 0) + cairoContext.show_layout(textLayout) + + self._draw_state(cairoContext, state) + + def _draw_state(self, cairoContext, state): + assert state in (self._currentButtonState, self._potentialButtonState) + if state == self.BUTTON_STATE_CANCEL: + state = self._currentButtonState + + backWidth = self._backgroundImage.get_width() + backHeight = self._backgroundImage.get_height() + + imagePath = self._STATE_TO_IMAGE[state] + self._buttonImage = self._store.get_surface_from_store(imagePath) + cairoContext.set_source_surface( + self._buttonImage, + backWidth / 2 - self._buttonImage.get_width() / 2, + backHeight - self._buttonImage.get_height() + 5, + ) + cairoContext.paint() -- 1.7.9.5