import DVDProject, TitleList, TitleCutter from Screens.Screen import Screen from Screens.ChoiceBox import ChoiceBox from Screens.InputBox import InputBox from Screens.MessageBox import MessageBox from Components.ActionMap import HelpableActionMap, ActionMap from Components.Sources.List import List from Components.Sources.StaticText import StaticText from Components.Sources.Progress import Progress from Components.FileList import FileList from enigma import eListboxPythonMultiContent, gFont, RT_HALIGN_LEFT class WaitBox(MessageBox): def __init__(self, session, callback): MessageBox.__init__(self, session, text=_("Preparing... Please wait"), type = MessageBox.TYPE_INFO) self.skinName = "MessageBox" self.CB = callback self.onShown.append(self.runCB) def ok(self): pass def runCB(self): from enigma import eTimer self.delayTimer = eTimer() self.delayTimer.callback.append(self.CB) self.delayTimer.start(10,1) class FileBrowser(Screen): skin = """ """ def __init__(self, session, currDir = None, projectBrowser = False): Screen.__init__(self, session) self.projectBrowser = projectBrowser if not currDir: currDir = "/" if projectBrowser: self.filelist = FileList(currDir, matchingPattern = "(?i)^.*\.(ddvdp\.xml)") else: self.filelist = FileList(currDir, matchingPattern = "(?i)^.*\.(jpeg|jpg|jpe|png|bmp)") self["filelist"] = self.filelist self["FilelistActions"] = ActionMap(["OkCancelActions"], { "ok": self.ok, "cancel": self.exit }) def ok(self): if self.filelist.canDescent(): self.filelist.descent() else: ret = self["filelist"].getCurrentDirectory() + '/' + self["filelist"].getFilename() self.close(ret,self.projectBrowser) def exit(self): self.close(None) class TitleList(Screen): skin = """ """ def __init__(self, session, project = None): Screen.__init__(self, session) self["titleactions"] = HelpableActionMap(self, "DVDTitleList", { "addTitle": (self.addTitle, _("Add a new title"), _("Add title")), "editTitle": (self.editTitle, _("Edit chapters of current title"), _("Edit title")), "removeCurrentTitle": (self.removeCurrentTitle, _("Remove currently selected title"), _("Remove title")), "saveProject": (self.saveProject, _("Save current project to disk"), _("Save")), "burnProject": (self.burnProject, _("Burn DVD"), _("Burn DVD")), }) self["MovieSelectionActions"] = HelpableActionMap(self, "MovieSelectionActions", { "contextMenu": (self.showMenu, _("menu")), }) self["key_red"] = StaticText(_("Add title")) self["key_green"] = StaticText(_("Edit title")) self["key_yellow"] = StaticText(_("Remove title")) self["key_blue"] = StaticText(_("Save")) self["title_label"] = StaticText() self["space_label"] = StaticText() self["space_bar"] = Progress() self["actions"] = ActionMap(["OkCancelActions"], { "cancel": self.leave }) #Action("addTitle", self.addTitle) if project is not None: self.project = project else: self.newProject() self["titles"] = List(list = [ ], enableWrapAround = True, item_height=30, fonts = [gFont("Regular", 20)]) self.updateTitleList() self.updateCollectionName() #self["addTitle"] = ActionButton("titleactions", "addTitle") #self["editTitle"] = ActionButton("titleactions", "editTitle") #self["removeCurrentTitle"] = ActionButton("titleactions", "removeCurrentTitle") #self["saveProject"] = ActionButton("titleactions", "saveProject") #self["burnProject"] = ActionButton("titleactions", "burnProject") def showMenu(self): menu = [] menu.append((_("Add a new title"), "addtitle")); menu.append((_("Remove title"), "removetitle")); menu.append((_("Edit chapters of current title"), "edittitle")); menu.append((_("Set collection name"), "setname")); menu.append((_("Set menu background"), "setbackground")); menu.append((_("Save current project to disk"), "save")); menu.append((_("Load saved project from disk"), "load")); menu.append((_("Preview menu"), "previewMenu")); menu.append((_("Burn DVD"), "burn")); self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu) def menuCallback(self, choice): if choice is None: return if choice[1] == "removetitle": self.removeCurrentTitle() elif choice[1] == "addtitle": self.addTitle() elif choice[1] == "edittitle": self.editTitle() elif choice[1] == "setname": self.setName() elif choice[1] == "setbackground": self.showFileBrowser(False) elif choice[1] == "save": self.saveProject() elif choice[1] == "load": self.showFileBrowser(True) elif choice[1] == "previewMenu": self.previewMenu() elif choice[1] == "burn": self.burnProject() def setName(self): self.session.openWithCallback(self.setNameCallback, InputBox, title=_("Set collection name"), text=self.project.name, maxSize=False, visible_width = 56) def setNameCallback(self, name): if name is not None: self.project.name = name self.updateCollectionName() def newProject(self): self.project = DVDProject.DVDProject() self.project.titles = [ ] self.project.session = self.session self.updateCollectionName() def updateCollectionName(self): self["title_label"].text = _("Table of content for collection") + " \"" + self.project.name + "\":" def addTitle(self): from Screens.MovieSelection import MovieSelection class MovieSelectionNoMenu(MovieSelection): def __init__(self, session): MovieSelection.__init__(self, session) self.skinName = "MovieSelection" def doContext(self): print "context menu forbidden inside DVDBurn to prevent calling multiple instances" self.session.openWithCallback(self.selectedSource, MovieSelectionNoMenu) def selectedSource(self, source): if source is None: return None t = self.project.addService(source) self.editTitle(t, readOnly=True) def removeCurrentTitle(self): title = self.getCurrentTitle() if title is not None: self.project.titles.remove(title) self.updateTitleList() def saveProject(self): from Tools.Directories import resolveFilename, SCOPE_PLAYLIST self.project.saveProject(resolveFilename(SCOPE_PLAYLIST)) def burnProject(self): self.project.waitboxref = self.project.session.open(WaitBox,self.burnProjectCB) def burnProjectCB(self): import Process job = Process.Burn(self.session, self.project) from Screens.TaskView import JobView self.session.open(JobView, job) def previewMenu(self): self.project.waitboxref = self.project.session.open(WaitBox,self.previewMenuCB) def previewMenuCB(self): import Process job = Process.PreviewMenu(self.session, self.project) def updateTitleList(self): res = [ ] totalsize = 0 for title in self.project.titles: a = [ title, (eListboxPythonMultiContent.TYPE_TEXT, 0, 10, 500, 50, 0, RT_HALIGN_LEFT, title.name) ] res.append(a) totalsize += title.estimatedDiskspace self["titles"].list = res self.updateSize(totalsize) def updateSize(self, totalsize): size = int((totalsize/1024)/1024) max_SL = 4370 max_DL = 7950 if size > max_DL: percent = 100 * size / float(max_DL) self["space_label"].text = "%d MB - " % size + _("exceeds dual layer medium!") + " (%.2f%% " % (100-percent) + _("free") + ")" self["space_bar"].value = int(percent) elif size > max_SL: percent = 100 * size / float(max_DL) self["space_label"].text = "%d MB " % size + _("of a DUAL layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")" self["space_bar"].value = int(percent) elif size < max_SL: percent = 100 * size / float(max_SL) self["space_label"].text = "%d MB " % size + _("of a SINGLE layer medium used.") + " (%.2f%% " % (100-percent) + _("free") + ")" self["space_bar"].value = int(percent) def getCurrentTitle(self): t = self["titles"].getCurrent() return t and t[0] def editTitle(self, title = None, readOnly = False): t = title or self.getCurrentTitle() if t is not None: self.current_edit_title = t if readOnly: self.session.openWithCallback(self.titleEditDone, TitleCutter.CutlistReader, t) else: self.session.openWithCallback(self.titleEditDone, TitleCutter.TitleCutter, t) def titleEditDone(self, cutlist): t = self.current_edit_title t.cuesheet = cutlist t.produceFinalCuesheet() print "title edit of %s done, resulting cutlist:" % (t.source.toString()), t.cutlist, "chaptermarks:", t.chaptermarks self.updateTitleList() def leave(self): self.close() def showFileBrowser(self, projectBrowser=False): if projectBrowser: currDir = "/home/root" else: currDir = self.project.menubg if len(currDir) > 1: currDir = (currDir.rstrip("/").rsplit("/",1))[0] self.session.openWithCallback(self.FileBrowserClosed, FileBrowser, currDir, projectBrowser) def FileBrowserClosed(self, path, projectBrowser=False): print "FileBrowserClosed", path, projectBrowser if projectBrowser: print "would load project", path else: self.project.menubg = path