# PiTiVi , Non-linear video editor # # pitivi/pitivi.py # # Copyright (c) 2005, Edward Hervey # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. """ Main application """ import gobject import gtk import gst import check from ui import mainwindow from pitivigstutils import patch_gst_python from playground import PlayGround from project import Project, file_is_project from effects import Magician from configure import APPNAME from settings import GlobalSettings from threads import ThreadMaster import instance from gettext import gettext as _ class Pitivi(gobject.GObject): """ Pitivi's main class Signals: new-project : A new project has been loaded, the Project object is given closing-project : Pitivi wishes to close the project, callbacks return False if they don't want the project to be closed, True otherwise not-project : The given uri is not a project file shutdown : PiTiVi has shutdown """ __gsignals__ = { "new-project" : ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT, )), "closing-project" : ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, (gobject.TYPE_PYOBJECT, )), "not-project" : ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_STRING, )), "shutdown" : ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ( )) } project = None def __init__(self, use_ui=True, *args, **kwargs): """ initialize pitivi with the command line arguments """ print "starting up pitivi..." print args gst.log("starting up pitivi...") gobject.GObject.__init__(self) self._use_ui = use_ui # patch gst-python for new behaviours patch_gst_python() # store ourself in the instance global if instance.PiTiVi: raise RuntimeWarning(_("There is already a %s instance, inform developers") % APPNAME) instance.PiTiVi = self # TODO parse cmd line arguments print args, kwargs # get settings self.settings = GlobalSettings() self.threads = ThreadMaster() self.playground = PlayGround() self.current = Project(_("New Project")) self.effects = Magician() if self._use_ui: # we're starting a GUI for the time being self.gui = mainwindow.PitiviMainWindow() self.gui.show() def loadProject(self, uri=None, filepath=None): """ Load the given file through it's uri or filepath """ gst.info("uri:%s, filepath:%s" % (uri, filepath)) if not uri and not filepath: self.emit("not-project", "") return if filepath: uri = "file://" + filepath # is the given filepath a valid pitivi project if not file_is_project(uri): self.emit("not-project", uri) return # if current project, try to close it if self._closeRunningProject(): self.current = Project(uri) self.emit("new-project", self.current) def _closeRunningProject(self): """ close the current project """ gst.info("closing running project") if self.current: if not self.emit("closing-project", self.current): return False self.playground.pause() self.current = None return True def newBlankProject(self): """ start up a new blank project """ # if there's a running project we must close it print "pitivi: newBlankProject(self)" if self._closeRunningProject(): self.playground.pause() self.current = Project(_("New Project")) self.emit("new-project", self.current) def shutdown(self): """ close PiTiVi """ gst.debug("shutting down") # we refuse to close if we're running a user interface and the user # doesn't want us to close the current project. if self._use_ui and not self._closeRunningProject(): gst.warning("Not closing since running project doesn't want to close") return self.threads.stopAllThreads() self.playground.shutdown() instance.PiTiVi = None self.emit("shutdown") def shutdownCb(pitivi): gst.debug("Exiting main loop") gtk.main_quit() def main(argv): check.initial_checks() print "Pitivi:", argv ptv = Pitivi(*argv) ptv.connect('shutdown', shutdownCb) gtk.main()