summaryrefslogtreecommitdiff
path: root/src/python/widget/mediacontrol.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/python/widget/mediacontrol.py')
-rw-r--r--src/python/widget/mediacontrol.py161
1 files changed, 161 insertions, 0 deletions
diff --git a/src/python/widget/mediacontrol.py b/src/python/widget/mediacontrol.py
new file mode 100644
index 0000000..3e740d0
--- /dev/null
+++ b/src/python/widget/mediacontrol.py
@@ -0,0 +1,161 @@
+# -*- coding: utf-8 -*-
+# libavg - Media Playback Engine.
+# Copyright (C) 2003-2014 Ulrich von Zadow
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Current versions can be found at www.libavg.de
+
+from libavg import avg
+from . import slider, button, skin
+
+class TimeSlider(slider.Slider):
+
+ def __init__(self, orientation=slider.Orientation.HORIZONTAL,
+ skinObj=skin.Skin.default, **kwargs):
+ self.__progressThumb = None
+ super(TimeSlider, self).__init__(skinObj=skinObj, orientation=orientation,
+ **kwargs)
+
+ if self._orientation == slider.Orientation.HORIZONTAL:
+ progressCfg = skinObj.defaultProgressBarCfg["horizontal"]
+ else:
+ progressCfg = skinObj.defaultProgressBarCfg["vertical"]
+
+ thumbUpBmp = progressCfg["thumbUpBmp"]
+ thumbDisabledBmp = skin.getBmpFromCfg(progressCfg, "thumbDisabledBmp",
+ "thumbUpBmp")
+ endsExtent = progressCfg["thumbEndsExtent"]
+ self.__progressThumb = slider.ScrollBarThumb(orientation=orientation,
+ upBmp=thumbUpBmp, downBmp=thumbUpBmp, disabledBmp=thumbDisabledBmp,
+ endsExtent=endsExtent)
+ self.insertChildAfter(self.__progressThumb, self._trackNode)
+ self._positionNodes()
+
+ def _positionNodes(self, newSliderPos=None):
+ super(TimeSlider, self)._positionNodes(newSliderPos)
+
+ if self.__progressThumb:
+ if self._orientation == slider.Orientation.HORIZONTAL:
+ self.__progressThumb.width = self._thumbNode.x+self._thumbNode.width/2
+ else:
+ self.__progressThumb.height = self._thumbNode.y+self._thumbNode.height/2
+
+
+class MediaControl(avg.DivNode):
+
+ PLAY_CLICKED = avg.Publisher.genMessageID()
+ PAUSE_CLICKED = avg.Publisher.genMessageID()
+ SEEK_PRESSED = avg.Publisher.genMessageID()
+ SEEK_MOTION = avg.Publisher.genMessageID()
+ SEEK_RELEASED = avg.Publisher.genMessageID()
+
+ def __init__(self, skinObj=skin.Skin.default, duration=1000, time=0, parent=None,
+ **kwargs):
+ super(MediaControl, self).__init__(**kwargs)
+ self.registerInstance(self, parent)
+
+ cfg = skinObj.defaultMediaControlCfg
+
+ # subscribe to button & slider changes
+ self._playButton = button.ToggleButton(
+ uncheckedUpNode=self.__createImageNode(cfg, "playUpBmp"),
+ uncheckedDownNode=self.__createImageNode(cfg, "playDownBmp"),
+ uncheckedDisabledNode=self.__createImageNode(cfg, "playDisabledBmp",
+ "playUpBmp"),
+ checkedUpNode=self.__createImageNode(cfg, "pauseUpBmp"),
+ checkedDownNode=self.__createImageNode(cfg, "pauseDownBmp"),
+ checkedDisabledNode=self.__createImageNode(cfg, "pauseDisabledBmp",
+ "pauseUpBmp"),
+ parent=self)
+ self._playButton.subscribe(button.ToggleButton.TOGGLED, self.__onTogglePlay)
+
+ sliderWidth = self.width + cfg["barRight"] - cfg["barPos"][0]
+ self._timeSlider = TimeSlider(skinObj=skinObj, pos=cfg["barPos"],
+ width=sliderWidth, parent=self)
+ self._timeSlider.subscribe(TimeSlider.PRESSED, self.__onSliderPressed)
+ self._timeSlider.subscribe(TimeSlider.RELEASED, self.__onSliderReleased)
+ self._timeSlider.subscribe(TimeSlider.THUMB_POS_CHANGED, self.__onSliderMotion)
+
+ self._timeNode = avg.WordsNode(pos=cfg["timePos"], fontstyle=cfg["font"],
+ color="FFFFFF", parent=self)
+ timeLeftPos = (self.width+cfg["timeLeftPos"][0], cfg["timeLeftPos"][1])
+ self._timeLeftNode = avg.WordsNode(pos=timeLeftPos, fontstyle=cfg["font"],
+ color="FFFFFF", parent=self)
+
+ self.setDuration(duration)
+ self.setTime(time)
+
+ self.publish(MediaControl.PLAY_CLICKED)
+ self.publish(MediaControl.PAUSE_CLICKED)
+ self.publish(MediaControl.SEEK_PRESSED)
+ self.publish(MediaControl.SEEK_MOTION)
+ self.publish(MediaControl.SEEK_RELEASED)
+
+ def play(self):
+ self._playButton.checked = True
+
+ def pause(self):
+ self._playButton.checked = False
+
+ def getDuration(self):
+ return self._timeSlider.range[1]
+
+ def setDuration(self, duration):
+ self._timeSlider.range = (0, duration-100)
+ self.__updateText()
+ duration = property(getDuration, setDuration)
+
+ def getTime(self):
+ return self._timeSlider.thumbPos
+
+ def setTime(self, curTime):
+ self._timeSlider.thumbPos = curTime
+ self.__updateText()
+ time = property(getTime, setTime)
+
+ def __onTogglePlay(self, play):
+ if play:
+ self.notifySubscribers(MediaControl.PLAY_CLICKED, [])
+ else:
+ self.notifySubscribers(MediaControl.PAUSE_CLICKED, [])
+
+ def __onSliderPressed(self):
+ self.notifySubscribers(MediaControl.SEEK_PRESSED, [])
+
+ def __onSliderReleased(self):
+ self.notifySubscribers(MediaControl.SEEK_RELEASED, [])
+
+ def __onSliderMotion(self, curTime):
+ self.__updateText()
+ self.notifySubscribers(MediaControl.SEEK_MOTION, [curTime])
+
+ def __updateText(self):
+ self._timeNode.text = self.__msToMinSec(self._timeSlider.thumbPos)
+ self._timeLeftNode.text = "-"+self.__msToMinSec(
+ (self._timeSlider.range[1]-self._timeSlider.thumbPos))
+
+ def __createImageNode(self, cfg, src, defaultSrc=None):
+ bmp = skin.getBmpFromCfg(cfg, src, defaultSrc)
+ node = avg.ImageNode()
+ node.setBitmap(bmp)
+ return node
+
+ def __msToMinSec(self, ms):
+ ms += 500
+ minutes, ms = divmod(ms, 60000)
+ seconds, ms = divmod(ms, 1000)
+ return "%d:%02d"%(minutes, seconds)
+