[pitivi/ges: 144/287] pitivi: Cleanup project setting code
- From: Jean-FranÃois Fortin Tam <jfft src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pitivi/ges: 144/287] pitivi: Cleanup project setting code
- Date: Thu, 15 Mar 2012 16:37:56 +0000 (UTC)
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]