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