Merge remote branch 'origin/bug_348_dvdburn_residenttask'
[vuplus_dvbapp] / lib / python / Plugins / Extensions / DVDBurn / TitleList.py
old mode 100644 (file)
new mode 100755 (executable)
index d67f112..dbc988b
@@ -1,98 +1,61 @@
-import DVDProject, TitleList, TitleCutter
-
+import DVDProject, TitleList, TitleCutter, TitleProperties, ProjectSettings, DVDToolbox, Process
 from Screens.Screen import Screen
 from Screens.ChoiceBox import ChoiceBox
 from Screens.InputBox import InputBox
 from Screens.MessageBox import MessageBox
 from Screens.HelpMenu import HelpableScreen
+from Screens.TaskView import JobView
+from Components.Task import job_manager
 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
-from Tools.Directories import resolveFilename, SCOPE_PLAYLIST
-
-class WaitBox(MessageBox):
-       def __init__(self, session, callback):
-               MessageBox.__init__(self, session, text=_("please wait, loading picture..."), 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, HelpableScreen):
-       skin = """
-       <screen name="FileBrowser" position="100,100" size="520,376" title="DVD File Browser" >
-               <widget name="filelist" position="0,0" size="520,376" scrollbarMode="showOnDemand" />
-       </screen>"""
-       def __init__(self, session, currDir = None, projectBrowser = False):
-               Screen.__init__(self, session)
-               HelpableScreen.__init__(self)
-               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)
+from Components.MultiContent import MultiContentEntryText
+from enigma import gFont, RT_HALIGN_LEFT, RT_HALIGN_RIGHT
+from Tools.Directories import resolveFilename, SCOPE_PLUGINS
 
-
-class TitleList(Screen):
+class TitleList(Screen, HelpableScreen):
        skin = """
-               <screen position="90,83" size="560,445" title="DVD Tool" >
-                   <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
-                   <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
-                   <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
-                   <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
-                   <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
-                   <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
-                   <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
-                   <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
-                   <widget source="title_label" render="Label" position="6,48" size="540,38" font="Regular;18" />
-                   <widget source="titles" render="Listbox" scrollbarMode="showOnDemand" position="10,86" size="540,312">
-                       <convert type="StaticMultiList" />
-                   </widget>
-                   <widget source="space_bar" render="Progress" position="10,410" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
-                   <widget source="space_label" render="Label" position="40,414" size="480,22" zPosition="2" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" />
+               <screen name="TitleList" position="center,center" size="560,445" title="DVD Tool" >
+                       <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" alphatest="on" />
+                       <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+                       <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+                       <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+                       <widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#18188b" transparent="1" />
+                       <widget source="title_label" render="Label" position="10,48" size="540,38" font="Regular;18" transparent="1" />
+                       <widget source="error_label" render="Label" position="10,48" size="540,395" zPosition="3" font="Regular;20" transparent="1" />
+                       <widget source="titles" render="Listbox" scrollbarMode="showOnDemand" position="10,86" size="540,312" zPosition="3" transparent="1" >
+                               <convert type="TemplatedMultiContent">
+                                       {"template": [
+                                                       MultiContentEntryText(pos = (0, 0), size = (420, 20), font = 0, flags = RT_HALIGN_LEFT, text = 1), # index 1 Title,
+                                                       MultiContentEntryText(pos = (0, 20), size = (328, 17), font = 1, flags = RT_HALIGN_LEFT, text = 2), # index 2 description,
+                                                       MultiContentEntryText(pos = (420, 6), size = (120, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 3), # index 3 begin time,
+                                                       MultiContentEntryText(pos = (328, 20), size = (154, 17), font = 1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 channel,
+                                                       MultiContentEntryText(pos = (482, 20), size = (58, 20), font = 1, flags = RT_HALIGN_RIGHT, text = 5), # index 4 channel,
+                                               ],
+                                       "fonts": [gFont("Regular", 20), gFont("Regular", 14)],
+                                       "itemHeight": 37
+                                       }
+                               </convert>
+                       </widget>
+                       <widget source="space_bar" render="Progress" position="10,410" size="540,26" borderWidth="1" backgroundColor="#254f7497" />
+                       <widget source="space_label" render="Label" position="40,414" size="480,22" zPosition="2" font="Regular;18" halign="center" transparent="1" foregroundColor="#000000" />
                </screen>"""
 
        def __init__(self, session, project = None):
                Screen.__init__(self, session)
+               HelpableScreen.__init__(self)
                
                self["titleactions"] = HelpableActionMap(self, "DVDTitleList",
                        {
                                "addTitle": (self.addTitle, _("Add a new title"), _("Add title")),
-                               "editTitle": (self.editTitle, _("Edit chapters of current title"), _("Edit title")),
+                               "titleProperties": (self.titleProperties, _("Properties of current title"), _("Title properties")),
                                "removeCurrentTitle": (self.removeCurrentTitle, _("Remove currently selected title"), _("Remove title")),
-                               "saveProject": (self.saveProject, _("Save current collection to disk"), _("Save")),
-                               "burnProject": (self.burnProject, _("Burn DVD"), _("Burn DVD")),
+                               "settings": (self.settings, _("Collection settings"), _("Settings")),
+                               "burnProject": (self.askBurnProject, _("Burn DVD"), _("Burn DVD")),
                        })
 
                self["MovieSelectionActions"] = HelpableActionMap(self, "MovieSelectionActions",
@@ -100,207 +63,288 @@ class TitleList(Screen):
                                "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)
-               
+               self["key_red"] = StaticText()
+               self["key_green"] = StaticText(_("Add title"))
+               self["key_yellow"] = StaticText()
+               self["key_blue"] = StaticText(_("Settings"))
+
+               self["title_label"] = StaticText()
+               self["error_label"] = StaticText()
+               self["space_label"] = StaticText()
+               self["space_bar"] = Progress()
+
                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["titles"] = List([])
                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")
-               
+               self.previous_size = 0
+               self.onLayoutFinish.append(self.layoutFinished)
+
+       def layoutFinished(self):
+               self.setTitle(_("DVD Titlelist"))
+
+       def checkBackgroundJobs(self):
+               for job in job_manager.getPendingJobs():
+                       print "type(job):", type(job)
+                       print "Process.DVDJob:", Process.DVDJob
+                       if type(job) == Process.DVDJob:
+                               self.backgroundJob = job
+                               return
+               self.backgroundJob = None
+
        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 collection to disk"), "save"));
-               menu.append((_("Load saved collection from disk"), "load"));
-               menu.append((_("Preview menu"), "previewMenu"));
-               menu.append((_("Burn DVD"), "burn"));
+               self.checkBackgroundJobs()
+               if self.backgroundJob:
+                       j = self.backgroundJob
+                       menu.append(("%s: %s (%d%%)" % (j.getStatustext(), j.name, int(100*j.progress/float(j.end))), self.showBackgroundJob))
+               menu.append((_("DVD media toolbox"), self.toolbox))
+               menu.append((_("Preview menu"), self.previewMenu))
+               if self.project.settings.output.getValue() == "dvd":
+                       if len(self["titles"].list):
+                               menu.append((_("Burn DVD"), self.burnProject))
+               elif self.project.settings.output.getValue() == "iso":
+                       menu.append((_("Create DVD-ISO"), self.burnProject))
+               menu.append((_("Burn existing image to DVD"), self.selectImage))
+               menu.append((_("Edit chapters of current title"), self.editTitle))
+               menu.append((_("Reset and renumerate title names"), self.resetTitles))
+               menu.append((_("Exit"), self.leave))
                self.session.openWithCallback(self.menuCallback, ChoiceBox, title="", list=menu)
 
        def menuCallback(self, choice):
-               if choice is None:
-                       return
+               if choice:
+                       choice[1]()
 
-               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 showBackgroundJob(self):
+               job_manager.in_background = False
+               self.session.openWithCallback(self.JobViewCB, JobView, self.backgroundJob)
+               self.backgroundJob = None
+       
+       def titleProperties(self):
+               if self.getCurrentTitle():
+                       self.session.openWithCallback(self.updateTitleList, TitleProperties.TitleProperties, self, self.project, self["titles"].getIndex())
+
+       def selectImage(self):
+               self.session.openWithCallback(self.burnISO, ProjectSettings.FileBrowser, "image", self.project.settings)
 
        def newProject(self):
                self.project = DVDProject.DVDProject()
-               if self.loadProject():
+               if self.loadTemplate():
                        self.project.session = self.session
-                       self.updateCollectionName()
-
-       def updateCollectionName(self):
-               self["title_label"].text = _("Table of content for collection") + " \"" + self.project.name + "\":"
+                       self.settingsCB()
 
        def addTitle(self):
                from Screens.MovieSelection import MovieSelection
-               class MovieSelectionNoMenu(MovieSelection):
+               from Components.ActionMap import HelpableActionMap
+               class DVDMovieSelection(MovieSelection):
+                       skin = """<screen name="DVDMovieSelection" position="center,center" size="560,445" title="Select a movie">
+                               <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+                               <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+                               <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
+                               <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+                               <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+                               <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+                               <widget name="waitingtext" position="0,45" size="560,395" zPosition="4" font="Regular;22" halign="center" valign="center" />
+                               <widget name="list" position="5,40" size="550,375" zPosition="2" scrollbarMode="showOnDemand" />
+                               <widget name="DescriptionBorder" pixmap="skin_default/border_eventinfo.png" position="0,316" zPosition="1" size="560,103" transparent="1" alphatest="on" />
+                               <widget source="Service" render="Label" position="5,318" zPosition="1" size="480,35" font="Regular;17" foregroundColor="#cccccc">
+                                       <convert type="MovieInfo">ShortDescription</convert>
+                               </widget>
+                               <widget source="Service" render="Label" position="495,318" zPosition="1" size="60,22" font="Regular;17" halign="right">
+                                       <convert type="ServiceTime">Duration</convert>
+                                       <convert type="ClockToText">AsLength</convert>
+                               </widget>
+                               <widget source="Service" render="Label" position="380,337" zPosition="2" size="175,22" font="Regular;17" halign="right">
+                                       <convert type="MovieInfo">RecordServiceName</convert>
+                               </widget>
+                               <widget source="Service" render="Label" position="5,357" zPosition="1" size="550,58" font="Regular;19">
+                                       <convert type="EventName">ExtendedDescription</convert>
+                               </widget>
+                               <widget name="freeDiskSpace" position="10,425" size="540,20" font="Regular;19" valign="center" halign="right" />
+                       </screen>"""
                        def __init__(self, session):
                                MovieSelection.__init__(self, session)
-                               self.skinName = "MovieSelection"
-
+                               self["key_red"] = StaticText(_("Close"))
+                               self["key_green"] = StaticText(_("Add"))
+                               self["key_yellow"] = StaticText(_("Edit title"))
+                               self["ColorActions"] = HelpableActionMap(self, "ColorActions",
+                               {
+                                       "red": (self.close, _("Close title selection")),
+                                       "green": (self.insertWithoutEdit, ("insert without cutlist editor")),
+                                       "yellow": (self.movieSelected, _("Add a new title"))
+                               })
+                       def updateTags(self):
+                               pass
                        def doContext(self):
                                print "context menu forbidden inside DVDBurn to prevent calling multiple instances"
-                               
-               self.session.openWithCallback(self.selectedSource, MovieSelectionNoMenu)
+                       def insertWithoutEdit(self):
+                               current = self.getCurrent()
+                               if current is not None:
+                                       current.edit = False
+                                       self.close(current)
+                       def movieSelected(self):
+                               current = self.getCurrent()
+                               if current is not None:
+                                       current.edit = True
+                                       self.close(current)
+               self.session.openWithCallback(self.selectedSource, DVDMovieSelection)
 
        def selectedSource(self, source):
                if source is None:
                        return None
+               if not source.getPath().endswith(".ts"):
+                       self.session.open(MessageBox,text = _("You can only burn Dreambox recordings!"), type = MessageBox.TYPE_ERROR)
+                       return None
                t = self.project.addService(source)
-               self.editTitle(t, readOnly=True)
+               try:
+                       editor = source.edit
+               except AttributeError:
+                       editor = True
+               self.editTitle(t, editor)
 
        def removeCurrentTitle(self):
                title = self.getCurrentTitle()
+               self.removeTitle(title)
+       
+       def removeTitle(self, title):
                if title is not None:
                        self.project.titles.remove(title)
                        self.updateTitleList()
 
-       def saveProject(self):
-               self.project.saveProject(resolveFilename(SCOPE_PLAYLIST))
+       def toolbox(self):
+               self.session.open(DVDToolbox.DVDToolbox)
+
+       def settings(self):
+               self.session.openWithCallback(self.settingsCB, ProjectSettings.ProjectSettings, self.project)
+
+       def settingsCB(self, update=True):
+               if not update:
+                       return
+               self["title_label"].text = _("Table of content for collection") + " \"" + self.project.settings.name.getValue() + "\":"
 
-       def loadProject(self, filename=None):
-               if not filename:
-                       filename = resolveFilename(SCOPE_PLAYLIST)+"DreamboxDVDtemplate.ddvdp.xml"
-               if self.project.loadProject(filename):
+       def loadTemplate(self):
+               filename = resolveFilename(SCOPE_PLUGINS)+"Extensions/DVDBurn/DreamboxDVD.ddvdp.xml"
+               if self.project.load(filename):
+                       self["error_label"].setText("")
                        return True
                else:
-                       try:
-                               self.session.open(MessageBox,self.project.error,MessageBox.TYPE_ERROR)
-                       except:
-                               self["title_label"].text = self.project.error
-                               print self.project.error
+                       self["error_label"].setText(self.project.error)
                        return False
 
-       def burnProject(self):
-               self.project.waitboxref = self.project.session.open(WaitBox,self.burnProjectCB)
+       def askBurnProject(self):
+               if len(self["titles"].list):
+                       self.session.openWithCallback(self.burnProject,MessageBox,text = _("Do you want to burn this collection to DVD medium?"), type = MessageBox.TYPE_YESNO)
 
-       def burnProjectCB(self):
-               import Process
-               job = Process.Burn(self.session, self.project)
-               from Screens.TaskView import JobView
-               self.session.open(JobView, job)
+       def burnProject(self, answer=True):
+               if not answer:
+                       return
+               if self.project.settings.authormode.getValue() == "data_ts":
+                       job = Process.DVDdataJob(self.project)
+                       job_manager.AddJob(job)
+                       job_manager.in_background = False
+                       self.session.openWithCallback(self.JobViewCB, JobView, job)
+               else:
+                       job = Process.DVDJob(self.project)
+                       job_manager.AddJob(job)
+                       job_manager.in_background = False
+                       self.session.openWithCallback(self.JobViewCB, JobView, job)
+
+       def burnISO(self, path, scope, configRef):
+               if path:
+                       job = Process.DVDisoJob(self.project, path)
+                       job_manager.AddJob(job)
+                       job_manager.in_background = False
+                       self.session.openWithCallback(self.JobViewCB, JobView, job)
+
+       def JobViewCB(self, in_background):
+               job_manager.in_background = in_background
 
        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)
+               job = Process.DVDJob(self.project, menupreview=True)
+               job_manager.in_background = False
+               job_manager.AddJob(job)
 
        def updateTitleList(self):
-               res = [ ]
-               totalsize = 0
+               list = [ ]
                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)
+                       list.append((title, title.properties.menutitle.getValue(), title.properties.menusubtitle.getValue(), title.DVBchannel, title.formatDVDmenuText("$D.$M.$Y, $T", 0), title.formatDVDmenuText("$l", 0)))
+               self["titles"].list = list
+               self.updateSize()
+               if len(list):
+                       self["key_red"].text = _("Remove title")
+                       self["key_yellow"].text = _("Title properties")
+               else:
+                       self["key_red"].text = ""
+                       self["key_yellow"].text = ""
+
+       def updateSize(self):
+               size = self.project.size/(1024*1024)
+               MAX_DL = self.project.MAX_DL-100
+               MAX_SL = self.project.MAX_SL-100
+               print "updateSize:", size, "MAX_DL:", MAX_DL, "MAX_SL:", MAX_SL
+               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)
+                       if self.previous_size < MAX_DL:
+                               self.session.open(MessageBox,text = _("exceeds dual layer medium!"), type = MessageBox.TYPE_ERROR)
+               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)
+                       if self.previous_size < MAX_SL:
+                               self.session.open(MessageBox,text = _("Your collection exceeds the size of a single layer medium, you will need a blank dual layer DVD!"), type = MessageBox.TYPE_INFO)
+               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)
+               self.previous_size = size
 
        def getCurrentTitle(self):
                t = self["titles"].getCurrent()
                return t and t[0]
 
-       def editTitle(self, title = None, readOnly = False):
+       def editTitle(self, title = None, editor = True):
                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:
+                       if editor:
                                self.session.openWithCallback(self.titleEditDone, TitleCutter.TitleCutter, t)
+                       else:
+                               self.session.openWithCallback(self.titleEditDone, TitleCutter.CutlistReader, t)
 
        def titleEditDone(self, cutlist):
                t = self.current_edit_title
+               t.initDVDmenuText(self.project,len(self.project.titles))
                t.cuesheet = cutlist
                t.produceFinalCuesheet()
-               print "title edit of %s done, resulting cutlist:" % (t.source.toString()), t.cutlist, "chaptermarks:", t.chaptermarks
+               if t.VideoType != 0:
+                       self.session.openWithCallback(self.DVDformatCB,MessageBox,text = _("The DVD standard doesn't support H.264 (HDTV) video streams. Do you want to create a Dreambox format data DVD (which will not play in stand-alone DVD players) instead?"), type = MessageBox.TYPE_YESNO)
+               else:
+                       self.updateTitleList()
+
+       def resetTitles(self):
+               count = 0
+               for title in self.project.titles:
+                       count += 1
+                       title.initDVDmenuText(self.project,count)
                self.updateTitleList()
 
+       def DVDformatCB(self, answer):
+               t = self.current_edit_title
+               if answer == True:
+                       self.project.settings.authormode.setValue("data_ts")
+                       self.updateTitleList()
+               else:
+                       self.removeTitle(t)
+
        def leave(self):
                self.close()
-
-       def showFileBrowser(self, projectBrowser=False):
-               if projectBrowser:
-                       currDir = resolveFilename(SCOPE_PLAYLIST)
-               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):
-               if projectBrowser:
-                       self.loadProject(path)
-               else:
-                       self.project.menubg = path