X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/9db4b5a47686981facc54c3eeab1113a814a961f..2ce501a469cb168b98708fd8425679f2006b7b93:/lib/python/Plugins/Extensions/CutListEditor/plugin.py?ds=sidebyside diff --git a/lib/python/Plugins/Extensions/CutListEditor/plugin.py b/lib/python/Plugins/Extensions/CutListEditor/plugin.py index 0ffc7008..7e591d26 100644 --- a/lib/python/Plugins/Extensions/CutListEditor/plugin.py +++ b/lib/python/Plugins/Extensions/CutListEditor/plugin.py @@ -7,12 +7,11 @@ from Components.ActionMap import HelpableActionMap from Components.MenuList import MenuList from Components.MultiContent import MultiContentEntryText, RT_HALIGN_RIGHT from Components.ServiceEventTracker import ServiceEventTracker - from Screens.InfoBarGenerics import InfoBarSeek, InfoBarCueSheetSupport - from Components.GUIComponent import GUIComponent - from enigma import eListboxPythonMultiContent, eListbox, gFont, iPlayableService +from Screens.FixedMenu import FixedMenu +import bisect def CutListEntry(where, what): res = [ (where, what) ] @@ -32,6 +31,72 @@ def CutListEntry(where, what): return res +class CutListContextMenu(FixedMenu): + RET_STARTCUT = 0 + RET_ENDCUT = 1 + RET_DELETECUT = 2 + RET_MARK = 3 + RET_DELETEMARK = 4 + RET_REMOVEBEFORE = 5 + RET_REMOVEAFTER = 6 + + SHOW_STARTCUT = 0 + SHOW_ENDCUT = 1 + SHOW_DELETECUT = 2 + + def __init__(self, session, state, nearmark): + menu = [(_("back"), self.close)] #, (None, )] + + if state == self.SHOW_STARTCUT: + menu.append((_("start cut here"), self.startCut)) + else: + menu.append((_("start cut here"), )) + + if state == self.SHOW_ENDCUT: + menu.append((_("end cut here"), self.endCut)) + else: + menu.append((_("end cut here"), )) + + if state == self.SHOW_DELETECUT: + menu.append((_("delete cut"), self.deleteCut)) + else: + menu.append((_("delete cut"), )) + + menu.append((_("remove before this position"), self.removeBefore)) + menu.append((_("remove after this position"), self.removeAfter)) + +# menu.append((None, )) + + if not nearmark: + menu.append((_("insert mark here"), self.insertMark)) + else: + menu.append((_("remove this mark"), self.removeMark)) + + FixedMenu.__init__(self, session, _("Cut"), menu) + self.skinName = "Menu" + + def startCut(self): + self.close(self.RET_STARTCUT) + + def endCut(self): + self.close(self.RET_ENDCUT) + + def deleteCut(self): + self.close(self.RET_DELETECUT) + + def insertMark(self): + self.close(self.RET_MARK) + + def removeMark(self): + self.close(self.RET_DELETEMARK) + + def removeBefore(self): + self.close(self.RET_REMOVEBEFORE) + + def removeAfter(self): + self.close(self.RET_REMOVEAFTER) + + class CutList(GUIComponent): def __init__(self, list): GUIComponent.__init__(self) @@ -81,13 +146,14 @@ class CutListEditor(Screen, InfoBarSeek, InfoBarCueSheetSupport): - + """ def __init__(self, session, service): self.skin = CutListEditor.skin Screen.__init__(self, session) InfoBarSeek.__init__(self) InfoBarCueSheetSupport.__init__(self) + self.old_service = session.nav.getCurrentlyPlayingServiceReference() session.nav.playService(service) service = session.nav.getCurrentService() @@ -110,7 +176,8 @@ class CutListEditor(Screen, InfoBarSeek, InfoBarCueSheetSupport): "setMark": (self.setMark, _("Make this mark just a mark")), "addMark": (self.__addMark, _("Add a mark")), "removeMark": (self.__removeMark, _("Remove a mark")), - "leave": (self.exit, _("Exit editor")) + "leave": (self.exit, _("Exit editor")), + "showMenu": self.showMenu, }) self.tutorial_seen = False @@ -123,16 +190,17 @@ class CutListEditor(Screen, InfoBarSeek, InfoBarCueSheetSupport): # to track new entries we save the last version of the cutlist self.last_cuts = [ ] + self.cut_start = None def showTutorial(self): if not self.tutorial_seen: self.tutorial_seen = True self.session.open(MessageBox, - """Welcome to the Cutlist editor. It has a *very* unintuitive handling: + """Welcome to the Cutlist editor. It's still a bit strange to use, but anyway: -You can add use the color keys to move around in the recorded movie. -By pressing shift-yellow, you can add a mark or remove an existing one. -You can then assign them to be either 'in' or 'out' positions by selecting them in the list and pressing 1 or 2. +Seek to the start of the stuff you want to cut away. Press OK, select 'start cut'. + +Then seek to the end, press OK, select 'end cut'. That's it. """, MessageBox.TYPE_INFO) def checkSkipShowHideLock(self): @@ -167,6 +235,7 @@ You can then assign them to be either 'in' or 'out' positions by selecting them self.removeMark(m) def exit(self): + self.session.nav.playService(self.old_service) self.close() def getCutlist(self): @@ -201,8 +270,110 @@ You can then assign them to be either 'in' or 'out' positions by selecting them break self.last_cuts = new_list -def main(session, service): + def getStateForPosition(self, pos): + state = 0 # in + + # when first point is "in", the beginning is "out" + if len(self.cut_list) and self.cut_list[0][1] == 0: + state = 1 + + for (where, what) in self.cut_list: + if where < pos: + if what == 0: # in + state = 0 + elif what == 1: # out + state = 1 + return state + + def showMenu(self): + curpos = self.cueGetCurrentPosition() + if curpos is None: + return + + self.setSeekState(self.SEEK_STATE_PAUSE) + + self.context_position = curpos + + self.context_nearest_mark = self.toggleMark(onlyreturn=True) + + cur_state = self.getStateForPosition(curpos) + if cur_state == 0: + print "currently in 'IN'" + if self.cut_start is None or self.context_position < self.cut_start: + state = CutListContextMenu.SHOW_STARTCUT + else: + state = CutListContextMenu.SHOW_ENDCUT + else: + print "currently in 'OUT'" + state = CutListContextMenu.SHOW_DELETECUT + + if self.context_nearest_mark is None: + nearmark = False + else: + nearmark = True + + self.session.openWithCallback(self.menuCallback, CutListContextMenu, state, nearmark) + + def menuCallback(self, *result): + self.setSeekState(self.SEEK_STATE_PLAY) + if not len(result): + return + result = result[0] + + if result == CutListContextMenu.RET_STARTCUT: + self.cut_start = self.context_position + elif result == CutListContextMenu.RET_ENDCUT: + # remove in/out marks between the new cut + for (where, what) in self.cut_list[:]: + if self.cut_start <= where <= self.context_position and what in [0,1]: + self.cut_list.remove((where, what)) + + bisect.insort(self.cut_list, (self.cut_start, 1)) + bisect.insort(self.cut_list, (self.context_position, 0)) + self.uploadCuesheet() + self.cut_start = None + elif result == CutListContextMenu.RET_DELETECUT: + out_before = None + in_after = None + + for (where, what) in self.cut_list: + if what == 1 and where < self.context_position: # out + out_before = (where, what) + elif what == 0 and where < self.context_position: # in, before out + out_before = None + elif what == 0 and where > self.context_position and in_after is None: + in_after = (where, what) + + if out_before is not None: + self.cut_list.remove(out_before) + + if in_after is not None: + self.cut_list.remove(in_after) + self.uploadCuesheet() + elif result == CutListContextMenu.RET_MARK: + self.__addMark() + elif result == CutListContextMenu.RET_DELETEMARK: + self.cut_list.remove(self.context_nearest_mark) + self.uploadCuesheet() + elif result == CutListContextMenu.RET_REMOVEBEFORE: + # remove in/out marks before current position + for (where, what) in self.cut_list[:]: + if where <= self.context_position and what in [0,1]: + self.cut_list.remove((where, what)) + # add 'in' point + bisect.insort(self.cut_list, (self.context_position, 0)) + self.uploadCuesheet() + elif result == CutListContextMenu.RET_REMOVEAFTER: + # remove in/out marks after current position + for (where, what) in self.cut_list[:]: + if where >= self.context_position and what in [0,1]: + self.cut_list.remove((where, what)) + # add 'out' point + bisect.insort(self.cut_list, (self.context_position, 1)) + self.uploadCuesheet() + +def main(session, service, **kwargs): session.open(CutListEditor, service) -def Plugins(): +def Plugins(**kwargs): return PluginDescriptor(name="Cutlist Editor", description=_("Cutlist editor..."), where = PluginDescriptor.WHERE_MOVIELIST, fnc=main)