[pitivi/ges: 144/287] pitivi: Cleanup project setting code



commit 47cc5b81d70a6c13fe1bb0c7281ad1cd085613f3
Author: Thibault Saunier <thibault saunier collabora com>
Date:   Tue Jan 3 17:13:10 2012 -0300

    pitivi: Cleanup project setting code
    
    Rename ExportSettings to MultimediaSettings as this class is used for both
    Project settings and Encoding settings.
    
    Make sure to take into account project settings changes

 pitivi/project.py           |   37 +++++++++----------
 pitivi/projectmanager.py    |   82 +++++++++----------------------------------
 pitivi/settings.py          |   27 ++------------
 pitivi/sourcelist.py        |    5 ---
 pitivi/ui/encodingdialog.py |    8 ++--
 pitivi/ui/mainwindow.py     |   49 +++++++++++++++++--------
 6 files changed, 74 insertions(+), 134 deletions(-)
---
diff --git a/pitivi/project.py b/pitivi/project.py
index 59e5fc3..b4d9fde 100644
--- a/pitivi/project.py
+++ b/pitivi/project.py
@@ -23,13 +23,13 @@
 Project class
 """
 
-import gst
 import ges
+import gst
 
 from pitivi.utils import Seeker
 from pitivi.log.loggable import Loggable
 from pitivi.sourcelist import SourceList
-from pitivi.settings import ExportSettings
+from pitivi.settings import MultimediaSettings
 from pitivi.signalinterface import Signallable
 from pitivi.timeline.timeline import Selection
 
@@ -93,12 +93,22 @@ class Project(Signallable, Loggable):
         self.timeline.selection = Selection()
 
         self.pipeline = ges.TimelinePipeline()
-        self.pipeline._setUp = False
         self.pipeline.add_timeline(self.timeline)
         self.seeker = Seeker(80)
 
-        self.settings = ExportSettings()
-        self._videocaps = self.settings.getVideoCaps()
+        self.settings = MultimediaSettings()
+
+    def getUri(self):
+        return self._uri
+
+    def setUri(self, uri):
+        # FIXME support not local project
+        if uri and not gst.uri_has_protocol(uri, "file"):
+            self._uri = gst.uri_construct("file", uri)
+        else:
+            self._uri = uri
+
+    uri = property(getUri, setUri)
 
     def release(self):
         self.pipeline = None
@@ -116,14 +126,14 @@ class Project(Signallable, Loggable):
         """
         Sets the given settings as the project's settings.
         @param settings: The new settings for the project.
-        @type settings: ExportSettings
+        @type settings: MultimediaSettings
         """
         assert settings
         self.log("Setting %s as the project's settings", settings)
         oldsettings = self.settings
         self.settings = settings
-        self._projectSettingsChanged()
         self.emit('settings-changed', oldsettings, settings)
+        self.seeker.flush()
 
     #}
 
@@ -136,16 +146,3 @@ class Project(Signallable, Loggable):
 
     def hasUnsavedModifications(self):
         return self._dirty
-
-    def _projectSettingsChanged(self):
-        settings = self.getSettings()
-        self._videocaps = settings.getVideoCaps()
-
-        if self.pipeline.get_state() != gst.STATE_NULL:
-            self.pipeline.set_state(gst.STATE_READY)
-            self.pipeline.set_state(gst.STATE_PAUSED)
-
-    def loadSources(self):
-        for layer in self.timeline.get_layers():
-            for obj in layer.get_objects():
-                self.sources.addUri(obj.get_uri())
diff --git a/pitivi/projectmanager.py b/pitivi/projectmanager.py
index a751308..56e8502 100644
--- a/pitivi/projectmanager.py
+++ b/pitivi/projectmanager.py
@@ -22,6 +22,7 @@
 import gobject
 import os
 import ges
+import gio
 
 from gettext import gettext as _
 from urlparse import urlparse
@@ -100,11 +101,11 @@ class ProjectManager(Signallable, Loggable):
         self.timeline = self.current.timeline
         self.formatter = ges.PitiviFormatter()
 
+        self.formatter.connect("source-moved", self._formatterMissingURICb)
         if self.formatter.load_from_uri(self.timeline, uri):
             self.current.connect("project-changed", self._projectChangedCb)
             self.emit("new-project-loaded", self.current)
-            #FIXME GES hack to make sure sources are added to the sourcelist
-            self.current.loadSources()
+            self.current.sources.addUris(self.formatter.get_sources())
 
     def saveProject(self, project, uri=None, overwrite=False, formatter=None, backup=False):
         """
@@ -126,24 +127,22 @@ class ProjectManager(Signallable, Loggable):
 
         @see: L{Formatter.saveProject}
         """
-        #if formatter is None:
-            #if project.format:
-                #formatter = project.format
-            #else:
-        formatter = ges.PitiviFormatter()
+        if formatter is None:
+            formatter = ges.PitiviFormatter()
 
         if uri is None:
-            if project.uri is None:
-                self.emit("save-project-failed", project, uri)
-                        #FIXME GES port break
-                        #FormatterSaveError(_("No URI specified.")))
-                return
-
             uri = project.uri
 
-        #FIXME Implement when avalaible in GES
-        #self._connectToFormatter(formatter)
-        return formatter.save_to_uri(project.timeline, uri)
+        if uri is None or not ges.formatter_can_save_uri(uri):
+            self.emit("save-project-failed", project, uri)
+            return
+
+        # FIXME Using query_exist is not the best thing to do, but makes
+        # the trick for now
+        file = gio.File(uri)
+        if overwrite or not file.query_exist():
+            formatter.set_sources(project.sources.getSources())
+            return formatter.save_to_uri(project.timeline, uri)
 
     def closeRunningProject(self):
         """ close the current project """
@@ -252,52 +251,5 @@ class ProjectManager(Signallable, Loggable):
             return name + ext + "~"
         return None
 
-    ###
-    #FIXME reimplement with GES
-    ###
-    def _connectToFormatter(self, formatter):
-        formatter.connect("missing-uri", self._formatterMissingURICb)
-        formatter.connect("new-project-created",
-                self._formatterNewProjectCreated)
-        formatter.connect("new-project-loaded",
-                self._formatterNewProjectLoaded)
-        formatter.connect("new-project-failed",
-                self._formatterNewProjectFailed)
-        formatter.connect("save-project-failed",
-                self._formatterSaveProjectFailed)
-        formatter.connect("project-saved",
-                self._formatterProjectSaved)
-
-    def _disconnectFromFormatter(self, formatter):
-        formatter.disconnect_by_function(self._formatterMissingURICb)
-        formatter.disconnect_by_function(self._formatterNewProjectCreated)
-        formatter.disconnect_by_function(self._formatterNewProjectLoaded)
-        formatter.disconnect_by_function(self._formatterNewProjectFailed)
-        formatter.disconnect_by_function(self._formatterSaveProjectFailed)
-        formatter.disconnect_by_function(self._formatterProjectSaved)
-
-    def _formatterNewProjectCreated(self, formatter, project):
-        self.emit("new-project-created", project)
-
-    def _formatterNewProjectLoaded(self, formatter, project):
-        self._disconnectFromFormatter(formatter)
-
-        self.current = project
-        project.connect("project-changed", self._projectChangedCb)
-        self.emit("new-project-loaded", project)
-
-    def _formatterNewProjectFailed(self, formatter, uri, exception):
-        self._disconnectFromFormatter(formatter)
-        self.current = None
-        self.emit("new-project-failed", uri, exception)
-
-    def _formatterMissingURICb(self, formatter, uri, factory):
-        return self.emit("missing-uri", formatter, uri, factory)
-
-    def _formatterSaveProjectFailed(self, formatter, project, uri, exception):
-        self._disconnectFromFormatter(formatter)
-        self.emit("save-project-failed", project, uri, exception)
-
-    def _formatterProjectSaved(self, formatter, project, uri):
-        self._disconnectFromFormatter(formatter)
-        self.emit("project-saved", project, uri)
+    def _formatterMissingURICb(self, formatter, tfs):
+        return self.emit("missing-uri", formatter, tfs)
diff --git a/pitivi/settings.py b/pitivi/settings.py
index 9b24bcc..3c6488c 100644
--- a/pitivi/settings.py
+++ b/pitivi/settings.py
@@ -319,30 +319,9 @@ class GlobalSettings(Signallable):
         cls.options[section] = {}
 
 
-class RenderSettings(object):
+class MultimediaSettings(Signallable, Loggable):
     """
-    Settings for rendering and multiplexing one or multiple streams.
-
-    @cvar settings: Ordered list of encoding stream settings.
-    @type settings: List of L{StreamEncodeSettings}
-    @cvar muxer: Name of the muxer to use.
-    @type muxer: C{str}
-    @cvar muxersettings: Muxer-specific settings.
-    @type muxersettings: C{dict}
-    """
-
-    def __init__(self, settings=[], muxer=None, muxersettings={}):
-        self.settings = settings
-        self.muxer = muxer
-        self.muxersettings = muxersettings
-
-    def __str__(self):
-        return "<RenderSettings %s [%d streams]>" % (self.muxer, len(self.settings))
-
-
-class ExportSettings(Signallable, Loggable):
-    """
-    Multimedia export settings
+    Multimedia encoding and previewing settings
 
     Signals:
     'settings-changed' : the settings have changed
@@ -385,7 +364,7 @@ class ExportSettings(Signallable, Loggable):
         self._acodecsettings_cache = {}
 
     def copy(self):
-        ret = ExportSettings()
+        ret = MultimediaSettings()
         ret.videowidth = self.videowidth
         ret.videoheight = self.videoheight
         ret.render_scale = self.render_scale
diff --git a/pitivi/sourcelist.py b/pitivi/sourcelist.py
index 0d499ec..26ecae4 100644
--- a/pitivi/sourcelist.py
+++ b/pitivi/sourcelist.py
@@ -124,11 +124,6 @@ class SourceList(Signallable, Loggable):
             assert info is None
         self.emit("source-removed", uri, info)
 
-    def _newProjectLoadedCb(self, unused_pitivi, project):
-        for layer in project.timeline.get_layers():
-            for obj in layer.get_objects():
-                self.addUri(obj.get_uri())
-
     def getInfoFromUri(self, uri):
         """
         Get the source corresponding to C{uri}.
diff --git a/pitivi/ui/encodingdialog.py b/pitivi/ui/encodingdialog.py
index 61a817f..ff81595 100644
--- a/pitivi/ui/encodingdialog.py
+++ b/pitivi/ui/encodingdialog.py
@@ -34,7 +34,7 @@ from gettext import gettext as _
 
 from pitivi import configure
 from pitivi.utils import togglePlayback, Seeker, beautify_ETA
-from pitivi.settings import ExportSettings
+from pitivi.settings import MultimediaSettings
 from pitivi.signalinterface import Signallable
 
 from pitivi.log.loggable import Loggable
@@ -162,7 +162,7 @@ class EncodingDialog(Loggable):
     @ivar preferred_vencoder: The last video encoder selected by the user.
     @type preferred_vencoder: str
     @ivar settings: The settings used for rendering.
-    @type settings: ExportSettings
+    @type settings: MultimediaSettings
     """
     INHIBIT_REASON = _("Currently rendering media")
 
@@ -566,7 +566,7 @@ class EncodingDialog(Loggable):
         self.channels_combo.set_model(audio_channels)
         self.sample_rate_combo.set_model(audio_rates)
         self.sample_depth_combo.set_model(audio_depths)
-        self.muxercombobox.set_model(factorylist(ExportSettings.muxers))
+        self.muxercombobox.set_model(factorylist(MultimediaSettings.muxers))
 
     def _displaySettings(self):
         """Display the settings that also change in the ProjectSettingsDialog.
@@ -652,7 +652,7 @@ class EncodingDialog(Loggable):
 
         @param factory: An element factory whose properties the user will edit.
         @type factory: gst.ElementFactory
-        @param settings_attr: The ExportSettings attribute holding
+        @param settings_attr: The MultimediaSettings attribute holding
         the properties.
         @type settings_attr: str
         """
diff --git a/pitivi/ui/mainwindow.py b/pitivi/ui/mainwindow.py
index 32fa24e..8d45ec1 100644
--- a/pitivi/ui/mainwindow.py
+++ b/pitivi/ui/mainwindow.py
@@ -726,7 +726,7 @@ class PitiviMainWindow(gtk.Window, Loggable):
         self.log("A NEW project is being loaded, deactivate UI")
 
     def _projectManagerSaveProjectFailedCb(self, projectManager,
-            project, uri, exception):
+            project, uri):
         # FIXME: do something here
         self.error("failed to save project")
 
@@ -845,7 +845,7 @@ class PitiviMainWindow(gtk.Window, Loggable):
         dialog.destroy()
         self.set_sensitive(True)
 
-    def _projectManagerMissingUriCb(self, instance, formatter, uri, info):
+    def _projectManagerMissingUriCb(self, instance, formatter, tfs):
         dialog = gtk.Dialog(_("Locate missing file..."),
             self,
             gtk.DIALOG_MODAL,
@@ -856,17 +856,23 @@ class PitiviMainWindow(gtk.Window, Loggable):
         dialog.get_content_area().set_spacing(SPACING)
         dialog.set_transient_for(self)
 
+        # FIXME GES port, help user identify files with more information
+        # need work to be done in GES directly
         # TODO: display the filesize to help the user identify the file
-        if info.get_duration() == gst.CLOCK_TIME_NONE:
-            # The file is probably an image, not video or audio.
-            text = _('The following file has moved: "<b>%s</b>"'
-                     '\nPlease specify its new location:'
-                     % info_name(info))
-        else:
-            length = beautify_length(info.get_duration())
-            text = _('The following file has moved: "<b>%s</b>" (duration: %s)'
-                     '\nPlease specify its new location:'
-                     % (info_name(info), length))
+        #if info.get_duration() == gst.CLOCK_TIME_NONE:
+            ## The file is probably an image, not video or audio.
+            #text = _('The following file has moved: "<b>%s</b>"'
+                     #'\nPlease specify its new location:'
+                     #% info_name(info))
+        #else:
+            #length = beautify_length(info.get_duration())
+            #text = _('The following file has moved: "<b>%s</b>" (duration: %s)'
+                     #'\nPlease specify its new location:'
+                     #% (info_name(info), length))
+
+        text = _('The following file has moved: "<b>%s</b>"'
+                 '\nPlease specify its new location:'
+                 % info_name(tfs))
 
         label = gtk.Label()
         label.set_markup(text)
@@ -890,9 +896,10 @@ class PitiviMainWindow(gtk.Window, Loggable):
 
         if response == gtk.RESPONSE_OK:
             self.log("User chose a new URI for the missing file")
-            new = chooser.get_uri()
-            if new:
-                formatter.addMapping(uri, unquote(new))
+            new_uri = chooser.get_uri()
+            if new_uri:
+                self.project.sources.addUri(new_uri)
+                formatter.update_source_uri(tfs, new_uri)
                 self._missingUriOnLoading = True
         else:
             self.log("User didn't choose a URI for the missing file")
@@ -942,15 +949,25 @@ class PitiviMainWindow(gtk.Window, Loggable):
 ## PiTiVi current project callbacks
 
     def _setProject(self, project):
-        self.project = project
         if self.project:
+            self.project.disconnect_by_func(self._settingsChangedCb)
+
+        if project:
+            self.project = project
             self.project_pipeline = self.project.pipeline
             self.project_timeline = self.project.timeline
             self.viewer.setPipeline(project.pipeline)
+            self._settingsChangedCb(project, None, project.settings)
             if self.timeline:
                 self.timeline.setProject(self.project)
                 self.clipconfig.project = self.project
+                #FIXME GES port undo/redo
                 #self.app.timelineLogObserver.pipeline = self.project.pipeline
+            self.project.connect("settings-changed", self._settingsChangedCb)
+
+    def _settingsChangedCb(self, project, old, new):
+        self.viewer.setDisplayAspectRatio(float(new.videopar * new.videowidth) /\
+                float(new.videoheight))
 
     def _sourceListMissingPluginsCb(self, project, uri, factory,
             details, descriptions, missingPluginsCallback):



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]