[pitivi: 1/6] Make project loading suck less by calling addFactory every time we rescan a factory.



commit e7c4a8fa3333bc22c2d836d647c8617351985fa7
Author: Alessandro Decina <alessandro d gmail com>
Date:   Mon Jun 8 16:31:16 2009 +0200

    Make project loading suck less by calling addFactory every time we rescan a factory.
---
 pitivi/application.py      |    7 +++++++
 pitivi/formatters/base.py  |   25 ++++++++++---------------
 pitivi/formatters/etree.py |    2 ++
 pitivi/project.py          |   14 --------------
 pitivi/projectmanager.py   |    7 +++++++
 pitivi/ui/mainwindow.py    |    4 ----
 pitivi/ui/sourcelist.py    |   27 +++++++++++++--------------
 tests/test_basic.py        |    2 +-
 8 files changed, 40 insertions(+), 48 deletions(-)

diff --git a/pitivi/application.py b/pitivi/application.py
index ebf3a9a..0561354 100644
--- a/pitivi/application.py
+++ b/pitivi/application.py
@@ -89,6 +89,7 @@ class Pitivi(Loggable, Signallable):
         "new-project" : ["project"],
 
         "new-project-loading" : ["uri"],
+        "new-project-created" : ["project"],
         "new-project-loaded" : ["project"],
         "new-project-failed" : ["uri", "exception"],
         "closing-project" : ["project"],
@@ -162,6 +163,8 @@ class Pitivi(Loggable, Signallable):
     def _connectToProjectManager(self, projectManager):
         projectManager.connect("new-project-loading",
                 self._projectManagerNewProjectLoading)
+        projectManager.connect("new-project-created",
+                self._projectManagerNewProjectCreated)
         projectManager.connect("new-project-loaded",
                 self._projectManagerNewProjectLoaded)
         projectManager.connect("new-project-failed",
@@ -174,6 +177,10 @@ class Pitivi(Loggable, Signallable):
     def _projectManagerNewProjectLoading(self, projectManager, uri):
         self.emit("new-project-loading", uri)
 
+    def _projectManagerNewProjectCreated(self, projectManager, project):
+        self.current = project
+        self.emit("new-project-created", project)
+
     def _projectManagerNewProjectLoaded(self, projectManager, project):
         self.current = project
         self.emit("new-project-loaded", project)
diff --git a/pitivi/formatters/base.py b/pitivi/formatters/base.py
index 74016b0..ad9a900 100644
--- a/pitivi/formatters/base.py
+++ b/pitivi/formatters/base.py
@@ -63,6 +63,7 @@ class Formatter(Signallable, Loggable):
     """
 
     __signals__ = {
+        "new-project-created": ["project"],
         "new-project-loaded": ["project"],
         "new-project-failed": ["uri", "exception"],
         "missing-uri" : ["uri"]
@@ -85,9 +86,9 @@ class Formatter(Signallable, Loggable):
     def newProject(self):
         return self.ProjectClass()
 
-    def loadProject(self, location, project=None):
+    def loadProject(self, location):
         try:
-            self._loadProjectUnchecked(location, project)
+            self._loadProjectUnchecked(location)
         except FormatterError, e:
             self.emit("new-project-failed", location, e)
 
@@ -100,7 +101,7 @@ class Formatter(Signallable, Loggable):
         if not uri_is_valid(uri) or not uri_is_reachable(uri):
             raise FormatterURIError()
 
-    def _loadProjectUnchecked(self, location, project=None):
+    def _loadProjectUnchecked(self, location):
         """
         Loads the project from the given location.
 
@@ -113,8 +114,8 @@ class Formatter(Signallable, Loggable):
         @return: The L{Project}
         @raise FormatterLoadError: If the file couldn't be properly loaded.
         """
-        if not project:
-            project = self.newProject()
+        project = self.newProject()
+        self.emit("new-project-created", project)
 
         project.uri = location
 
@@ -145,8 +146,8 @@ class Formatter(Signallable, Loggable):
         project._formatter = self
 
         # add all factories to the project sourcelist
-        for fact in factories:
-            project.sources.addFactory(factory=fact)
+        #for fact in factories:
+        #    project.sources.addFactory(factory=fact)
 
         # if all sources were discovered, or don't require discovering,
         if uris == []:
@@ -154,19 +155,14 @@ class Formatter(Signallable, Loggable):
             # then
             # .. Fill in the timeline
             self._fillTimeline()
-            # .. make the project as loaded
-            self.project.loaded = True
+            self.emit("new-project-loaded", self.project)
         else:
             self.debug("Got undiscovered sources, calling discoverer")
             # else
             # .. connect to the sourcelist 'ready' signal
             self.project.sources.connect("ready", self._sourcesReadyCb)
-            # .. Add all uris to be discovered to the project sourcelist
-            self.project.loaded = False
             self.project.sources.addUris(uris)
 
-        self.emit("new-project-loaded", self.project)
-
         # finally return the project.
         return self.project
 
@@ -367,8 +363,7 @@ class Formatter(Signallable, Loggable):
     def _sourcesReadyCb(self, sources):
         self.debug("Sources inspected, calling fillTimeline")
         self._fillTimeline()
-        self.project.loaded = True
-        Project.emit(self.project, 'loaded')
+        self.emit("new-project-loaded", self.project)
 
 
 class LoadOnlyFormatter(Formatter):
diff --git a/pitivi/formatters/etree.py b/pitivi/formatters/etree.py
index b7db18f..3e249b5 100644
--- a/pitivi/formatters/etree.py
+++ b/pitivi/formatters/etree.py
@@ -623,6 +623,8 @@ class ElementTreeFormatter(Formatter):
             new_streams[stream_id] = new_stream
         self._context.streams = new_streams
 
+        project.sources.addFactory(factory=factory)
+
         if closure["rediscovered"] == len(sources):
             self._finishLoadingProject(project)
             return
diff --git a/pitivi/project.py b/pitivi/project.py
index e3eda3b..52f93ae 100644
--- a/pitivi/project.py
+++ b/pitivi/project.py
@@ -66,7 +66,6 @@ class Project(Signallable, Loggable):
     __signals__ = {
         "settings-changed" : None,
         "missing-plugins": ["uri", "detail", "description"],
-        "loaded" : None
         }
 
     def __init__(self, name="", uri=None, **kwargs):
@@ -96,9 +95,6 @@ class Project(Signallable, Loggable):
         self.view_action = ViewAction()
         self.view_action.addProducers(self.factory)
 
-        # the loading formatter will set this accordingly
-        self.loaded = True
-
     def release(self):
         self.pipeline.release()
         self.pipeline = None
@@ -200,13 +196,3 @@ class Project(Signallable, Loggable):
 
     def hasUnsavedModifications(self):
         return self._dirty
-
-    def markLoaded(self):
-        """
-        Mark the project as loaded.
-
-        Will emit the 'loaded' signal. Only meant to be used by
-        L{Formatter}s.
-        """
-        self.loaded = True
-        self.emit('loaded')
diff --git a/pitivi/projectmanager.py b/pitivi/projectmanager.py
index 8f67486..28e648d 100644
--- a/pitivi/projectmanager.py
+++ b/pitivi/projectmanager.py
@@ -36,6 +36,7 @@ from pitivi.timeline.track import Track
 class ProjectManager(Signallable, Loggable):
     __signals__ = {
         "new-project-loading": ["uri"],
+        "new-project-created": ["project"],
         "new-project-failed": ["uri", "exception"],
         "new-project-loaded": ["project"],
         "closing-project": ["project"],
@@ -118,6 +119,8 @@ class ProjectManager(Signallable, Loggable):
 
     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",
@@ -125,9 +128,13 @@ class ProjectManager(Signallable, Loggable):
 
     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)
 
+    def _formatterNewProjectCreated(self, formatter, project):
+        self.emit("new-project-created", project)
+
     def _formatterNewProjectLoaded(self, formatter, project):
         self._disconnectFromFormatter(formatter)
 
diff --git a/pitivi/ui/mainwindow.py b/pitivi/ui/mainwindow.py
index 4a11cf7..c3cfd59 100644
--- a/pitivi/ui/mainwindow.py
+++ b/pitivi/ui/mainwindow.py
@@ -645,13 +645,9 @@ class PitiviMainWindow(gtk.Window, Loggable):
     def _projectManagerNewProjectLoadedCb(self, projectManager, project):
         self.log("A NEW project is loaded, update the UI!")
         self.project = project
-        # ungrey UI
-        self.set_sensitive(True)
 
     def _projectManagerNewProjectLoadingCb(self, projectManager, uri):
         self.log("A NEW project is being loaded, deactivate UI")
-        # grey UI
-        self.set_sensitive(False)
 
     def _projectManagerClosingProjectCb(self, projectManager, project):
         if not project.hasUnsavedModifications():
diff --git a/pitivi/ui/sourcelist.py b/pitivi/ui/sourcelist.py
index 3c7b573..31b945b 100644
--- a/pitivi/ui/sourcelist.py
+++ b/pitivi/ui/sourcelist.py
@@ -90,10 +90,7 @@ def beautify_stream(stream):
             templ = ngettext("<b>Audio:</b> %d channel at %d <i>Hz</i> (%d <i>bits</i>)",
                     "<b>Audio:</b> %d channels at %d <i>Hz</i> (%d <i>bits</i>)",
                     stream.channels)
-            try:
-                templ = templ % (stream.channels, stream.rate, stream.width)
-            except TypeError:
-                import pdb; pdb.set_trace()
+            templ = templ % (stream.channels, stream.rate, stream.width)
             return templ
 
         return _("<b>Unknown Audio format:</b> %s") % stream.audiotype
@@ -249,6 +246,8 @@ class SourceList(gtk.VBox, Loggable):
         # Connect to project.  We must remove and reset the callbacks when
         # changing project.
         self.project_signals = SignalGroup()
+        self.app.connect("new-project-created",
+            self._newProjectCreatedCb)
         self.app.connect("new-project-loaded",
             self._newProjectLoadedCb)
         self.app.connect("new-project-failed",
@@ -653,19 +652,19 @@ class SourceList(gtk.VBox, Loggable):
         factory = self.storemodel[path][COL_FACTORY]
         self.emit('play', factory)
 
-    def _newProjectLoadedCb(self, unused_pitivi, project):
+    def _newProjectCreatedCb(self, app, project):
         # clear the storemodel
         self.storemodel.clear()
         self._connectToProject(project)
-        # synchronize the storemodel with the new project's sourcelist
-        if project.loaded:
-            for uri, factory in project.sources:
-                self.log("loading uri %s", uri)
-                self._addFactory(factory)
-        else:
-            if not self.infostub.showing:
-                self.pack_start(self.infostub, expand=False)
-                self.infostub.startingImport()
+
+
+    def _newProjectLoadingCb(self, unused_pitivi, uri):
+        if not self.infostub.showing:
+            self.pack_start(self.infostub, expand=False)
+            self.infostub.startingImport()
+
+    def _newProjectLoadedCb(self, unused_pitivi, project):
+        pass
 
     def _newProjectFailedCb(self, unused_pitivi, unused_reason,
         unused_uri):
diff --git a/tests/test_basic.py b/tests/test_basic.py
index 7123c26..e23c9a4 100644
--- a/tests/test_basic.py
+++ b/tests/test_basic.py
@@ -14,7 +14,7 @@ class BasicTest(TestCase):
         self.assert_(ptv)
 
         # were the contents of pitivi properly created
-        self.assert_(ptv.current)
+        self.assertEqual(ptv.current, None)
         self.assert_(ptv.effects)
 
         # was the unique instance object properly set



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