From f50ae710c1bfbbccb9f25302ff038235845224d4 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Sat, 18 Nov 2006 13:15:18 +0000 Subject: [PATCH] add PicturePlayer plugin --- lib/python/Plugins/Extensions/Makefile.am | 3 +- .../Extensions/PicturePlayer/__init__.py | 0 .../PicturePlayer/pictureplayer.png | Bin 0 -> 3484 bytes .../Extensions/PicturePlayer/plugin.py | 515 ++++++++++++++++++ 4 files changed, 517 insertions(+), 1 deletion(-) create mode 100644 lib/python/Plugins/Extensions/PicturePlayer/__init__.py create mode 100644 lib/python/Plugins/Extensions/PicturePlayer/pictureplayer.png create mode 100644 lib/python/Plugins/Extensions/PicturePlayer/plugin.py diff --git a/lib/python/Plugins/Extensions/Makefile.am b/lib/python/Plugins/Extensions/Makefile.am index 576ca701..cb1021b3 100644 --- a/lib/python/Plugins/Extensions/Makefile.am +++ b/lib/python/Plugins/Extensions/Makefile.am @@ -1,3 +1,4 @@ -SUBDIRS = TuxboxPlugins WebInterface FileManager CutListEditor ZappingAlternatives FritzCall +SUBDIRS = TuxboxPlugins WebInterface FileManager CutListEditor ZappingAlternatives FritzCall PicturePlayer + diff --git a/lib/python/Plugins/Extensions/PicturePlayer/__init__.py b/lib/python/Plugins/Extensions/PicturePlayer/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/lib/python/Plugins/Extensions/PicturePlayer/pictureplayer.png b/lib/python/Plugins/Extensions/PicturePlayer/pictureplayer.png new file mode 100644 index 0000000000000000000000000000000000000000..d58d11ba11df65623a60f8fbc1719f2539ede61b GIT binary patch literal 3484 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 + + + + + + + + + + + + + + + """ + + def __init__(self, session, filelist, name, path): + self.skin = ThumbView.skin + Screen.__init__(self, session) + + self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "MovieSelectionActions"], + { + "cancel": self.Exit, + "ok": self.KeyOk, + "showEventInfo": self.StartExif, + "right": self.key_right, + "left": self.key_left, + "up": self.key_up, + "down": self.key_down + }, -1) + + for x in range(6): + self["label"+str(x)] = Label() + self["thumb"+str(x)] = Pixmap() + self["frame"] = MovingPixmap() + + self.aspect = getAspect() + self.path = path + self.filelist = filelist + self.currPage = -1 + self.index = 0 + self.old_index = 0 + self.thumblist = [] + self.thumbindex = 0 + self.list = [] + self.poslist = [[50,63],[265,63],[480,63],[50,288],[265,288],[480,288]] + + count=0 + pos=0 + for x in self.filelist: + if x[0][1] == False: + self.list.append((x[0][0], self.path + x[0][0], count/6, pos, "(" + str(count+1) + ") ")) + pos += 1 + if pos == 6: + pos = 0 + if x[0][0] == name: + self.index = count + count += 1 + self.maxentry = len(self.list)-1 + + self.ThumbTimer = eTimer() + self.ThumbTimer.timeout.get().append(self.showThumb) + + self.fillPage() + + def key_left(self): + self.index -= 1 + if self.index < 0: + self.index = self.maxentry + self.fillPage() + + def key_right(self): + self.index += 1 + if self.index > self.maxentry: + self.index = 0 + self.fillPage() + + def key_up(self): + self.index -= 3 + if self.index < 0: + self.index = 0 + self.fillPage() + + def key_down(self): + self.index += 3 + if self.index > self.maxentry: + self.index = self.maxentry + self.fillPage() + + def fillPage(self): + self["frame"].moveTo(self.poslist[self.list[self.index][3]][0], self.poslist[self.list[self.index][3]][1], 1) + self["frame"].startMoving() + + if self.list[self.index][2] != self.currPage: + self.currPage = self.list[self.index][2] + textlist = ["","","","","",""] + self.thumblist = ["","","","","",""] + + for x in self.list: + if x[2] == self.currPage: + textlist[x[3]] = x[4] + x[0] + self.thumblist[x[3]] = x[0] + + for x in range(6): + self["label"+str(x)].setText(textlist[x]) + self["thumb"+str(x)].hide() + + self.ThumbTimer.start(500, True) + + def showThumb(self): + if self.thumblist[self.thumbindex] != "": + cachefile = "" + if config.pic.cache.value: + cachedir = self.path + ".Thumbnails/" + if not os.path.exists(cachedir): + os.mkdir(cachedir) + cachefile = cachedir + self.thumblist[self.thumbindex] + str(180) + str(160) + str(self.aspect) + + ptr = loadPic(self.path + self.thumblist[self.thumbindex], 180, 160, self.aspect, int(config.pic.resize.value), int(config.pic.rotate.value),1, cachefile) + if ptr != None: + self["thumb"+str(self.thumbindex)].show() + self["thumb"+str(self.thumbindex)].instance.setPixmap(ptr.__deref__()) + + self.thumbindex += 1 + if self.thumbindex < 6: + self.ThumbTimer.start(500, True) + else: + self.thumbindex = 0 + else: + self.thumbindex = 0 + + def StartExif(self): + self.session.open(ExifView, self.list[self.index][1], self.list[self.index][0]) + + def KeyOk(self): + self.old_index = self.index + self.session.openWithCallback(self.returnView ,PicView, self.filelist, self.list[self.index][0], self.path) + + def returnView(self, val=0): + self.index = val + if self.old_index != self.index: + self.fillPage() + + def Exit(self): + self.close(self.index) + +#------------------------------------------------------------------------------------------ + +class PicView(Screen): + skin = """ + + + + + + + + + + + """ + + def __init__(self, session, filelist, name, path): + self.skin = PicView.skin + Screen.__init__(self, session) + + self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "MovieSelectionActions"], + { + "cancel": self.Exit, + "showEventInfo": self.StartExif, + "green": self.Play, + "yellow": self.Pause, + "blue": self.nextPic, + "red": self.prevPic + }, -1) + + self.aspect = getAspect() + self.blinking = False + self.autoShow = True + self.slideOn = False + self.pauseOn = False + self.index = 0 + self.list = [] + + count=0 + for x in filelist: + if x[0][1] == False: + self.list.append((x[0][0], path + x[0][0], 0)) + if x[0][0] == name: + self.index = count + count += 1 + self.maxentry = len(self.list)-1 + + self["file"] = Label(_("please wait, loading picture...")) + self["picture"] = Pixmap() + self["point"] = Pixmap() + self["play"] = Pixmap() + self["pause"] = Pixmap() + + self.decodeTimer = eTimer() + self.decodeTimer.timeout.get().append(self.decodePic) + self.decodeTimer.start(300, True) + + self.slideTimer = eTimer() + self.slideTimer.timeout.get().append(self.slidePic) + + + def Pause(self): + if self.slideOn: + if self.pauseOn: + self.pauseOn=False + self["pause"].show() + else: + self.pauseOn=True + self["play"].show() + self.slideValue = 0 + + def Play(self): + if self.pauseOn == False: + if self.slideOn: + self.slideOn=False + self["play"].show() + else: + self.slideOn=True + self.slideTimer.start(1000, True) + + self.slideValue = int(config.pic.slidetime.value) + + def slidePic(self): + if self.slideOn == True and self.pauseOn == False: + self.blinkingWidget("play") + self.slideValue -= 1 + if self.slideValue <= 0: + self.slideValue = int(config.pic.slidetime.value) + self.nextPic() + + self.slideTimer.start(1000, True) + + if self.pauseOn: + self.blinkingWidget("pause") + self.slideTimer.start(1000, True) + + def decodePic(self): + self.currPic = loadPic(self.list[self.index][1], 560, 450, self.aspect, int(config.pic.resize.value), int(config.pic.rotate.value),1) + self["point"].hide() + if self.autoShow: + self.showPic() + self.autoShow = False + + def showPic(self): + if self.currPic != None: + self.old = self.index + self["file"].setText(self.list[self.old][0] + " (" + str(self.old+1) + "/" + str(self.maxentry+1) + ")") + self["picture"].instance.setPixmap(self.currPic.__deref__()) + + self.next() + self["point"].show() + self.decodeTimer.start(300, True) + + def nextPic(self): + self.showPic() + + def prevPic(self): + self.index = self.old + self.prev() + self.autoShow = True + self["point"].show() + self.decodeTimer.start(300, True) + + def next(self): + self.index += 1 + if self.index > self.maxentry: + self.index = 0 + + def prev(self): + self.index -= 1 + if self.index < 0: + self.index = self.maxentry + + def blinkingWidget(self, name): + if self.blinking: + self.blinking=False + self[name].show() + else: + self.blinking=True + self[name].hide() + + def StartExif(self): + if self.pauseOn == False: + self.Pause() + self.session.openWithCallback(self.StopExif ,ExifView, self.list[self.old][1], self.list[self.old][0]) + + def StopExif(self): + if self.pauseOn: + self.Pause() + + def Exit(self): + self.close(self.old) + +#------------------------------------------------------------------------------------------ + +class ExifView(Screen): + skin = """ + + + """ + + def __init__(self, session, fullname, name): + self.skin = ExifView.skin + Screen.__init__(self, session) + + self["actions"] = ActionMap(["OkCancelActions"], + { + "cancel": self.close + }, -1) + + dlist = ["Name:", "EXIF-Version:", "Camera-Make:", "Camera-Model:", "Date/Time:", "User Comments:", "Width / Height:", "Orientation:", "Metering Mode:", "Exposure Program:", "Light Source:", "Flash used:", "CompressedBitsPerPixel:", "ISO Speed Rating:", "X-Resolution:", "Y-Resolution:", "Resolution Unit:", "Brightness:", "Exposure Time:", "Exposure Bias:", "Distance:", "CCD-Width:", "ApertureFNumber:"] + tlist = [ ] + self["exiflist"] = ServiceInfoList(tlist) + tlist.append(ServiceInfoListEntry(dlist[0], name)) + count=1 + for x in getExif(fullname): + tlist.append(ServiceInfoListEntry(dlist[count], x)) + count += 1 + +#------------------------------------------------------------------------------------------ + +class PicSetup(Screen): + skin = """ + + + """ + + def __init__(self, session): + self.skin = PicSetup.skin + Screen.__init__(self, session) + + self["actions"] = NumberActionMap(["SetupActions"], + { + "cancel": self.close, + "left": self.keyLeft, + "right": self.keyRight, + "0": self.keyNumber, + "1": self.keyNumber, + "2": self.keyNumber, + "3": self.keyNumber, + "4": self.keyNumber, + "5": self.keyNumber, + "6": self.keyNumber, + "7": self.keyNumber, + "8": self.keyNumber, + "9": self.keyNumber + }, -1) + + self.list = [] + self["liste"] = ConfigList(self.list) + self.list.append(getConfigListEntry(_("Slideshow Interval (sec.)"), config.pic.slidetime)) + self.list.append(getConfigListEntry(_("Scaling Mode"), config.pic.resize)) + self.list.append(getConfigListEntry(_("Cache Thumbnails"), config.pic.cache)) + #self.list.append(getConfigListEntry(_("Rotate Picture"), config.pic.rotate)) + + def keyLeft(self): + self["liste"].handleKey(KEY_LEFT) + + def keyRight(self): + self["liste"].handleKey(KEY_RIGHT) + + def keyNumber(self, number): + self["liste"].handleKey(KEY_0 + number) + + +#------------------------------------------------------------------------------------------ + +class picmain(Screen): + skin = """ + + + + + + + + + + """ + + def __init__(self, session): + self.skin = picmain.skin + Screen.__init__(self, session) + + self["actions"] = ActionMap(["OkCancelActions", "DirectionActions", "ColorActions", "MovieSelectionActions"], + { + "ok": self.KeyOk, + "cancel": self.Exit, + "right": self.rightDown, + "left": self.leftUp, + "up": self.up, + "down": self.down, + "showEventInfo": self.StartExif, + "contextMenu": self.Settings, + "red": self.StartThumb + }, -1) + + self.aspect = getAspect() + self.currDir = config.pic.lastDir.value + if not os.path.exists(self.currDir): + self.currDir = "/" + + self.filelist = FileList(self.currDir, matchingPattern = "(?i)^.*\.(jpeg|jpg|png|bmp)") + self["filelist"] = self.filelist + self["thumbnail"] = Pixmap() + + self.ThumbTimer = eTimer() + self.ThumbTimer.timeout.get().append(self.showThumb) + self.ThumbTimer.start(500, True) + + def up(self): + self["filelist"].up() + self.ThumbTimer.start(1500, True) + + def down(self): + self["filelist"].down() + self.ThumbTimer.start(1500, True) + + def leftUp(self): + self["filelist"].pageUp() + self.ThumbTimer.start(1500, True) + + def rightDown(self): + self["filelist"].pageDown() + self.ThumbTimer.start(1500, True) + + def showThumb(self): + if not self.filelist.canDescent(): + cachefile = "" + if config.pic.cache.value: + cachedir = self.currDir + ".Thumbnails/" + if not os.path.exists(cachedir): + os.mkdir(cachedir) + cachefile = cachedir + self.filelist.getSelection()[0] + str(180) + str(160) + str(self.aspect) + + ptr = loadPic(self.currDir + self.filelist.getSelection()[0], 180, 160, self.aspect, int(config.pic.resize.value), 0, 0, cachefile) + if ptr != None: + self["thumbnail"].show() + self["thumbnail"].instance.setPixmap(ptr.__deref__()) + else: + self["thumbnail"].hide() + + def KeyOk(self): + if self.filelist.canDescent(): + self.currDir = self.filelist.getSelection()[0] + self.filelist.descent() + else: + self.session.openWithCallback(self.returnVal, PicView, self.filelist.getFileList(), self.filelist.getSelection()[0], self.currDir) + + def StartThumb(self): + self.session.openWithCallback(self.returnVal, ThumbView, self.filelist.getFileList(), self.filelist.getSelection()[0], self.currDir) + + def returnVal(self, val=0): + print val + + def StartExif(self): + if not self.filelist.canDescent(): + self.session.open(ExifView, self.currDir + self.filelist.getSelection()[0], self.filelist.getSelection()[0]) + + def Settings(self): + self.session.open(PicSetup) + + def Exit(self): + config.pic.lastDir.value = self.currDir + config.pic.save() + self.close() + +#------------------------------------------------------------------------------------------ + +def main(session, **kwargs): + session.open(picmain) + +def Plugins(**kwargs): + return PluginDescriptor(name="PicturePlayer", description="Picture Viewer (BMP, PNG, JPG)", icon="pictureplayer.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=main) -- 2.30.2