[pitivi/ges: 187/287] project: Move ProjectSettingsDialog to project.py
- From: Jean-FranÃois Fortin Tam <jfft src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pitivi/ges: 187/287] project: Move ProjectSettingsDialog to project.py
- Date: Thu, 15 Mar 2012 16:41:33 +0000 (UTC)
commit a85dc3ede765702020151257648094ea6acfb412
Author: Thibault Saunier <thibault saunier collabora com>
Date: Tue Jan 10 18:35:18 2012 -0300
project: Move ProjectSettingsDialog to project.py
pitivi/project.py | 571 +++++++++++++++++++++++++++++++++++++++-
pitivi/render.py | 2 +-
pitivi/ui/Makefile.am | 1 -
pitivi/ui/mainwindow.py | 2 +-
pitivi/ui/projectsettings.py | 586 -----------------------------------------
po/POTFILES.in | 1 -
tests/test_projectsettings.py | 2 +-
7 files changed, 563 insertions(+), 602 deletions(-)
---
diff --git a/pitivi/project.py b/pitivi/project.py
index e26a356..b4a125e 100644
--- a/pitivi/project.py
+++ b/pitivi/project.py
@@ -23,27 +23,62 @@
Project related classes
"""
+import os
import ges
import gst
-
-from pitivi.utils.playback import Seeker
-from pitivi.utils.loggable import Loggable
-from pitivi.medialibrary import MediaLibrary
-from pitivi.settings import MultimediaSettings
-from pitivi.utils.signal import Signallable
-from pitivi.utils.timeline import Selection
-
-import gobject
-import os
+import gtk
import gio
+import gobject
+from datetime import datetime
from gettext import gettext as _
from urlparse import urlparse
from pwd import getpwuid
+from pitivi.medialibrary import MediaLibrary
+from pitivi.settings import MultimediaSettings
from pitivi.undo.undo import UndoableAction
+from pitivi.configure import get_ui_dir
-
+from pitivi.utils.playback import Seeker
+from pitivi.utils.loggable import Loggable
+from pitivi.utils.signal import Signallable
+from pitivi.utils.timeline import Selection
+from pitivi.utils.widgets import FractionWidget
+from pitivi.utils.ripple_update_group import RippleUpdateGroup
+from pitivi.utils.ui import model, frame_rates, audio_rates, audio_depths,\
+ audio_channels, get_combo_value, set_combo_value
+from pitivi.ui.preset import AudioPresetManager, DuplicatePresetNameException,\
+ VideoPresetManager
+
+# FIXME: are we sure the following tables correct?
+
+pixel_aspect_ratios = model((str, object), (
+ (_("Square"), gst.Fraction(1, 1)),
+ (_("480p"), gst.Fraction(10, 11)),
+ (_("480i"), gst.Fraction(8, 9)),
+ (_("480p Wide"), gst.Fraction(40, 33)),
+ (_("480i Wide"), gst.Fraction(32, 27)),
+ (_("576p"), gst.Fraction(12, 11)),
+ (_("576i"), gst.Fraction(16, 15)),
+ (_("576p Wide"), gst.Fraction(16, 11)),
+ (_("576i Wide"), gst.Fraction(64, 45)),
+))
+
+display_aspect_ratios = model((str, object), (
+ (_("Standard (4:3)"), gst.Fraction(4, 3)),
+ (_("DV (15:11)"), gst.Fraction(15, 11)),
+ (_("DV Widescreen (16:9)"), gst.Fraction(16, 9)),
+ (_("Cinema (1.37)"), gst.Fraction(11, 8)),
+ (_("Cinema (1.66)"), gst.Fraction(166, 100)),
+ (_("Cinema (1.85)"), gst.Fraction(185, 100)),
+ (_("Anamorphic (2.35)"), gst.Fraction(235, 100)),
+ (_("Anamorphic (2.39)"), gst.Fraction(239, 100)),
+ (_("Anamorphic (2.4)"), gst.Fraction(24, 10)),
+))
+
+
+#------------------ Backend classes ------------------------------------------#
class ProjectSettingsChanged(UndoableAction):
def __init__(self, project, old, new):
@@ -381,3 +416,517 @@ class Project(Signallable, Loggable):
def hasUnsavedModifications(self):
return self._dirty
+
+
+#----------------------- UI classes ------------------------------------------#
+class ProjectSettingsDialog():
+
+ def __init__(self, parent, project):
+ self.project = project
+ self.settings = project.getSettings()
+
+ self.builder = gtk.Builder()
+ self.builder.add_from_file(os.path.join(get_ui_dir(),
+ "projectsettings.ui"))
+ self._setProperties()
+ self.builder.connect_signals(self)
+
+ # add custom display aspect ratio widget
+ self.dar_fraction_widget = FractionWidget()
+ self.video_properties_table.attach(self.dar_fraction_widget,
+ 0, 1, 6, 7, xoptions=gtk.EXPAND | gtk.FILL, yoptions=0)
+ self.dar_fraction_widget.show()
+
+ # add custom pixel aspect ratio widget
+ self.par_fraction_widget = FractionWidget()
+ self.video_properties_table.attach(self.par_fraction_widget,
+ 1, 2, 6, 7, xoptions=gtk.EXPAND | gtk.FILL, yoptions=0)
+ self.par_fraction_widget.show()
+
+ # add custom framerate widget
+ self.frame_rate_fraction_widget = FractionWidget()
+ self.video_properties_table.attach(self.frame_rate_fraction_widget,
+ 1, 2, 2, 3, xoptions=gtk.EXPAND | gtk.FILL, yoptions=0)
+ self.frame_rate_fraction_widget.show()
+
+ # populate coboboxes with appropriate data
+ self.frame_rate_combo.set_model(frame_rates)
+ self.dar_combo.set_model(display_aspect_ratios)
+ self.par_combo.set_model(pixel_aspect_ratios)
+
+ self.channels_combo.set_model(audio_channels)
+ self.sample_rate_combo.set_model(audio_rates)
+ self.sample_depth_combo.set_model(audio_depths)
+
+ # behavior
+ self.wg = RippleUpdateGroup()
+ self.wg.addVertex(self.frame_rate_combo,
+ signal="changed",
+ update_func=self._updateCombo,
+ update_func_args=(self.frame_rate_fraction_widget,))
+ self.wg.addVertex(self.frame_rate_fraction_widget,
+ signal="value-changed",
+ update_func=self._updateFraction,
+ update_func_args=(self.frame_rate_combo,))
+ self.wg.addVertex(self.dar_combo, signal="changed")
+ self.wg.addVertex(self.dar_fraction_widget, signal="value-changed")
+ self.wg.addVertex(self.par_combo, signal="changed")
+ self.wg.addVertex(self.par_fraction_widget, signal="value-changed")
+ self.wg.addVertex(self.width_spinbutton, signal="value-changed")
+ self.wg.addVertex(self.height_spinbutton, signal="value-changed")
+ self.wg.addVertex(self.save_audio_preset_button,
+ update_func=self._updateAudioSaveButton)
+ self.wg.addVertex(self.save_video_preset_button,
+ update_func=self._updateVideoSaveButton)
+ self.wg.addVertex(self.channels_combo, signal="changed")
+ self.wg.addVertex(self.sample_rate_combo, signal="changed")
+ self.wg.addVertex(self.sample_depth_combo, signal="changed")
+
+ # constrain width and height IFF constrain_sar_button is active
+ self.wg.addEdge(self.width_spinbutton, self.height_spinbutton,
+ predicate=self.constrained, edge_func=self.updateHeight)
+ self.wg.addEdge(self.height_spinbutton, self.width_spinbutton,
+ predicate=self.constrained, edge_func=self.updateWidth)
+
+ # keep framereate text field and combo in sync
+ self.wg.addBiEdge(self.frame_rate_combo,
+ self.frame_rate_fraction_widget)
+
+ # keep dar text field and combo in sync
+ self.wg.addEdge(self.dar_combo, self.dar_fraction_widget,
+ edge_func=self.updateDarFromCombo)
+ self.wg.addEdge(self.dar_fraction_widget, self.dar_combo,
+ edge_func=self.updateDarFromFractionWidget)
+
+ # keep par text field and combo in sync
+ self.wg.addEdge(self.par_combo, self.par_fraction_widget,
+ edge_func=self.updateParFromCombo)
+ self.wg.addEdge(self.par_fraction_widget, self.par_combo,
+ edge_func=self.updateParFromFractionWidget)
+
+ # constrain DAR and PAR values. because the combo boxes are already
+ # linked, we only have to link the fraction widgets together.
+ self.wg.addEdge(self.par_fraction_widget, self.dar_fraction_widget,
+ edge_func=self.updateDarFromPar)
+ self.wg.addEdge(self.dar_fraction_widget, self.par_fraction_widget,
+ edge_func=self.updateParFromDar)
+
+ # update PAR when width/height change and the DAR checkbutton is
+ # selected
+ self.wg.addEdge(self.width_spinbutton, self.par_fraction_widget,
+ predicate=self.darSelected, edge_func=self.updateParFromDar)
+ self.wg.addEdge(self.height_spinbutton, self.par_fraction_widget,
+ predicate=self.darSelected, edge_func=self.updateParFromDar)
+
+ # update DAR when width/height change and the PAR checkbutton is
+ # selected
+ self.wg.addEdge(self.width_spinbutton, self.dar_fraction_widget,
+ predicate=self.parSelected, edge_func=self.updateDarFromPar)
+ self.wg.addEdge(self.height_spinbutton, self.dar_fraction_widget,
+ predicate=self.parSelected, edge_func=self.updateDarFromPar)
+
+ # presets
+ self.audio_presets = AudioPresetManager()
+ self.audio_presets.loadAll()
+ self.video_presets = VideoPresetManager()
+ self.video_presets.loadAll()
+
+ self._fillPresetsTreeview(
+ self.audio_preset_treeview, self.audio_presets,
+ self._updateAudioPresetButtons)
+ self._fillPresetsTreeview(
+ self.video_preset_treeview, self.video_presets,
+ self._updateVideoPresetButtons)
+
+ # A map which tells which infobar should be used when displaying
+ # an error for a preset manager.
+ self._infobarForPresetManager = {
+ self.audio_presets: self.audio_preset_infobar,
+ self.video_presets: self.video_preset_infobar}
+
+ # Bind the widgets in the Video tab to the Video Presets Manager.
+ self.bindSpinbutton(self.video_presets, "width", self.width_spinbutton)
+ self.bindSpinbutton(self.video_presets, "height",
+ self.height_spinbutton)
+ self.bindFractionWidget(self.video_presets, "frame-rate",
+ self.frame_rate_fraction_widget)
+ self.bindPar(self.video_presets)
+
+ # Bind the widgets in the Audio tab to the Audio Presets Manager.
+ self.bindCombo(self.audio_presets, "channels",
+ self.channels_combo)
+ self.bindCombo(self.audio_presets, "sample-rate",
+ self.sample_rate_combo)
+ self.bindCombo(self.audio_presets, "depth",
+ self.sample_depth_combo)
+
+ self.wg.addEdge(self.par_fraction_widget,
+ self.save_video_preset_button)
+ self.wg.addEdge(self.frame_rate_fraction_widget,
+ self.save_video_preset_button)
+ self.wg.addEdge(self.width_spinbutton,
+ self.save_video_preset_button)
+ self.wg.addEdge(self.height_spinbutton,
+ self.save_video_preset_button)
+
+ self.wg.addEdge(self.channels_combo,
+ self.save_audio_preset_button)
+ self.wg.addEdge(self.sample_rate_combo,
+ self.save_audio_preset_button)
+ self.wg.addEdge(self.sample_depth_combo,
+ self.save_audio_preset_button)
+
+ self.updateUI()
+
+ self.createAudioNoPreset(self.audio_presets)
+ self.createVideoNoPreset(self.video_presets)
+
+ def bindPar(self, mgr):
+
+ def updatePar(value):
+ # activate par so we can set the value
+ self.select_par_radiobutton.props.active = True
+ self.par_fraction_widget.setWidgetValue(value)
+
+ mgr.bindWidget("par", updatePar,
+ self.par_fraction_widget.getWidgetValue)
+
+ def bindFractionWidget(self, mgr, name, widget):
+ mgr.bindWidget(name, widget.setWidgetValue,
+ widget.getWidgetValue)
+
+ def bindCombo(self, mgr, name, widget):
+ mgr.bindWidget(name,
+ lambda x: set_combo_value(widget, x),
+ lambda: get_combo_value(widget))
+
+ def bindSpinbutton(self, mgr, name, widget):
+ mgr.bindWidget(name,
+ lambda x: widget.set_value(float(x)),
+ lambda: int(widget.get_value()))
+
+ def _fillPresetsTreeview(self, treeview, mgr, update_buttons_func):
+ """Set up the specified treeview to display the specified presets.
+
+ @param treeview: The treeview for displaying the presets.
+ @type treeview: TreeView
+ @param mgr: The preset manager.
+ @type mgr: PresetManager
+ @param update_buttons_func: A function which updates the buttons for
+ removing and saving a preset, enabling or disabling them accordingly.
+ @type update_buttons_func: function
+ """
+ renderer = gtk.CellRendererText()
+ renderer.props.editable = True
+ column = gtk.TreeViewColumn("Preset", renderer, text=0)
+ treeview.append_column(column)
+ treeview.props.headers_visible = False
+ model = mgr.getModel()
+ treeview.set_model(model)
+ model.connect("row-inserted", self._newPresetCb,
+ column, renderer, treeview)
+ renderer.connect("edited", self._presetNameEditedCb, mgr)
+ renderer.connect("editing-started", self._presetNameEditingStartedCb,
+ mgr)
+ treeview.get_selection().connect("changed", self._presetChangedCb,
+ mgr, update_buttons_func)
+ treeview.connect("focus-out-event", self._treeviewDefocusedCb, mgr)
+
+ def createAudioNoPreset(self, mgr):
+ mgr.prependPreset(_("No preset"), {
+ "depth": int(get_combo_value(self.sample_depth_combo)),
+ "channels": int(get_combo_value(self.channels_combo)),
+ "sample-rate": int(get_combo_value(self.sample_rate_combo))})
+
+ def createVideoNoPreset(self, mgr):
+ mgr.prependPreset(_("No preset"), {
+ "par": gst.Fraction(int(get_combo_value(self.par_combo).num),
+ int(get_combo_value(self.par_combo).denom)),
+ "frame-rate": gst.Fraction(int(get_combo_value(self.frame_rate_combo).num),
+ int(get_combo_value(self.frame_rate_combo).denom)),
+ "height": int(self.height_spinbutton.get_value()),
+ "width": int(self.width_spinbutton.get_value())})
+
+ def _newPresetCb(self, model, path, iter_, column, renderer, treeview):
+ """Handle the addition of a preset to the model of the preset manager.
+ """
+ treeview.set_cursor_on_cell(path, column, renderer, start_editing=True)
+ treeview.grab_focus()
+
+ def _presetNameEditedCb(self, renderer, path, new_text, mgr):
+ """Handle the renaming of a preset."""
+ try:
+ mgr.renamePreset(path, new_text)
+ except DuplicatePresetNameException:
+ error_markup = _('"%s" already exists.') % new_text
+ self._showPresetManagerError(mgr, error_markup)
+
+ def _presetNameEditingStartedCb(self, renderer, editable, path, mgr):
+ """Handle the start of a preset renaming."""
+ self._hidePresetManagerError(mgr)
+
+ def _presetChangedCb(self, selection, mgr, update_preset_buttons_func):
+ """Handle the selection of a preset."""
+ model, iter_ = selection.get_selected()
+ if iter_:
+ preset = model[iter_][0]
+ else:
+ preset = None
+ mgr.restorePreset(preset)
+ update_preset_buttons_func()
+ self._hidePresetManagerError(mgr)
+
+ def _treeviewDefocusedCb(self, widget, event, mgr):
+ """Handle the treeview loosing the focus."""
+ self._hidePresetManagerError(mgr)
+
+ def _showPresetManagerError(self, mgr, error_markup):
+ """Show the specified error on the infobar associated with the manager.
+
+ @param mgr: The preset manager for which to show the error.
+ @type mgr: PresetManager
+ """
+ infobar = self._infobarForPresetManager[mgr]
+ # The infobar must contain exactly one object in the content area:
+ # a label for displaying the error.
+ label = infobar.get_content_area().children()[0]
+ label.set_markup(error_markup)
+ infobar.show()
+
+ def _hidePresetManagerError(self, mgr):
+ """Hide the error infobar associated with the manager.
+
+ @param mgr: The preset manager for which to hide the error infobar.
+ @type mgr: PresetManager
+ """
+ infobar = self._infobarForPresetManager[mgr]
+ infobar.hide()
+
+ def constrained(self):
+ return self.constrain_sar_button.props.active
+
+ def _updateFraction(self, unused, fraction, combo):
+ fraction.setWidgetValue(get_combo_value(combo))
+
+ def _updateCombo(self, unused, combo, fraction):
+ set_combo_value(combo, fraction.getWidgetValue())
+
+ def getSAR(self):
+ width = int(self.width_spinbutton.get_value())
+ height = int(self.height_spinbutton.get_value())
+ return gst.Fraction(width, height)
+
+ def _setProperties(self):
+ self.window = self.builder.get_object("project-settings-dialog")
+ self.video_properties_table = self.builder.get_object(
+ "video_properties_table")
+ self.video_properties_table = self.builder.get_object(
+ "video_properties_table")
+ self.frame_rate_combo = self.builder.get_object("frame_rate_combo")
+ self.dar_combo = self.builder.get_object("dar_combo")
+ self.par_combo = self.builder.get_object("par_combo")
+ self.channels_combo = self.builder.get_object("channels_combo")
+ self.sample_rate_combo = self.builder.get_object("sample_rate_combo")
+ self.sample_depth_combo = self.builder.get_object("sample_depth_combo")
+ self.year_spinbutton = self.builder.get_object("year_spinbutton")
+ self.author_entry = self.builder.get_object("author_entry")
+ self.width_spinbutton = self.builder.get_object("width_spinbutton")
+ self.height_spinbutton = self.builder.get_object("height_spinbutton")
+ self.save_audio_preset_button = self.builder.get_object(
+ "save_audio_preset_button")
+ self.save_video_preset_button = self.builder.get_object(
+ "save_video_preset_button")
+ self.audio_preset_treeview = self.builder.get_object(
+ "audio_preset_treeview")
+ self.video_preset_treeview = self.builder.get_object(
+ "video_preset_treeview")
+ self.select_par_radiobutton = self.builder.get_object(
+ "select_par_radiobutton")
+ self.remove_audio_preset_button = self.builder.get_object(
+ "remove_audio_preset_button")
+ self.remove_video_preset_button = self.builder.get_object(
+ "remove_video_preset_button")
+ self.constrain_sar_button = self.builder.get_object(
+ "constrain_sar_button")
+ self.select_dar_radiobutton = self.builder.get_object(
+ "select_dar_radiobutton")
+ self.video_preset_infobar = self.builder.get_object(
+ "video-preset-infobar")
+ self.audio_preset_infobar = self.builder.get_object(
+ "audio-preset-infobar")
+ self.title_entry = self.builder.get_object("title_entry")
+ self.author_entry = self.builder.get_object("author_entry")
+ self.year_spinbutton = self.builder.get_object("year_spinbutton")
+
+ def _constrainSarButtonToggledCb(self, button):
+ if button.props.active:
+ self.sar = self.getSAR()
+
+ def _selectDarRadiobuttonToggledCb(self, button):
+ state = button.props.active
+ self.dar_fraction_widget.set_sensitive(state)
+ self.dar_combo.set_sensitive(state)
+ self.par_fraction_widget.set_sensitive(not state)
+ self.par_combo.set_sensitive(not state)
+
+ @staticmethod
+ def _getUniquePresetName(mgr):
+ """Get a unique name for a new preset for the specified PresetManager.
+ """
+ existing_preset_names = list(mgr.getPresetNames())
+ preset_name = _("New preset")
+ i = 1
+ while preset_name in existing_preset_names:
+ preset_name = _("New preset %d") % i
+ i += 1
+ return preset_name
+
+ def _addAudioPresetButtonClickedCb(self, button):
+ preset_name = self._getUniquePresetName(self.audio_presets)
+ self.audio_presets.addPreset(preset_name, {
+ "channels": get_combo_value(self.channels_combo),
+ "sample-rate": get_combo_value(self.sample_rate_combo),
+ "depth": get_combo_value(self.sample_depth_combo)
+ })
+ self.audio_presets.restorePreset(preset_name)
+ self._updateAudioPresetButtons()
+
+ def _removeAudioPresetButtonClickedCb(self, button):
+ selection = self.audio_preset_treeview.get_selection()
+ model, iter_ = selection.get_selected()
+ if iter_:
+ self.audio_presets.removePreset(model[iter_][0])
+
+ def _saveAudioPresetButtonClickedCb(self, button):
+ self.audio_presets.savePreset()
+ self.save_audio_preset_button.set_sensitive(False)
+ self.remove_audio_preset_button.set_sensitive(True)
+
+ def _addVideoPresetButtonClickedCb(self, button):
+ preset_name = self._getUniquePresetName(self.video_presets)
+ self.video_presets.addPreset(preset_name, {
+ "width": int(self.width_spinbutton.get_value()),
+ "height": int(self.height_spinbutton.get_value()),
+ "frame-rate": self.frame_rate_fraction_widget.getWidgetValue(),
+ "par": self.par_fraction_widget.getWidgetValue(),
+ })
+ self.video_presets.restorePreset(preset_name)
+ self._updateVideoPresetButtons()
+
+ def _removeVideoPresetButtonClickedCb(self, button):
+ selection = self.video_preset_treeview.get_selection()
+ model, iter_ = selection.get_selected()
+ if iter_:
+ self.video_presets.removePreset(model[iter_][0])
+
+ def _saveVideoPresetButtonClickedCb(self, button):
+ self.video_presets.savePreset()
+ self.save_video_preset_button.set_sensitive(False)
+ self.remove_video_preset_button.set_sensitive(True)
+
+ def _updateAudioPresetButtons(self):
+ can_save = self.audio_presets.isSaveButtonSensitive()
+ self.save_audio_preset_button.set_sensitive(can_save)
+ can_remove = self.audio_presets.isRemoveButtonSensitive()
+ self.remove_audio_preset_button.set_sensitive(can_remove)
+
+ def _updateVideoPresetButtons(self):
+ self.save_video_preset_button.set_sensitive(self.video_presets.isSaveButtonSensitive())
+ self.remove_video_preset_button.set_sensitive(self.video_presets.isRemoveButtonSensitive())
+
+ def _updateAudioSaveButton(self, unused_in, button):
+ button.set_sensitive(self.audio_presets.isSaveButtonSensitive())
+
+ def _updateVideoSaveButton(self, unused_in, button):
+ button.set_sensitive(self.video_presets.isSaveButtonSensitive())
+
+ def darSelected(self):
+ return self.select_dar_radiobutton.props.active
+
+ def parSelected(self):
+ return not self.darSelected()
+
+ def updateWidth(self):
+ height = int(self.height_spinbutton.get_value())
+ self.width_spinbutton.set_value(height * self.sar)
+
+ def updateHeight(self):
+ width = int(self.width_spinbutton.get_value())
+ self.height_spinbutton.set_value(width * (1 / self.sar))
+
+ def updateDarFromPar(self):
+ par = self.par_fraction_widget.getWidgetValue()
+ sar = self.getSAR()
+ self.dar_fraction_widget.setWidgetValue(sar * par)
+
+ def updateParFromDar(self):
+ dar = self.dar_fraction_widget.getWidgetValue()
+ sar = self.getSAR()
+ self.par_fraction_widget.setWidgetValue(dar * (1 / sar))
+
+ def updateDarFromCombo(self):
+ self.dar_fraction_widget.setWidgetValue(get_combo_value(
+ self.dar_combo))
+
+ def updateDarFromFractionWidget(self):
+ set_combo_value(self.dar_combo,
+ self.dar_fraction_widget.getWidgetValue())
+
+ def updateParFromCombo(self):
+ self.par_fraction_widget.setWidgetValue(get_combo_value(
+ self.par_combo))
+
+ def updateParFromFractionWidget(self):
+ set_combo_value(self.par_combo,
+ self.par_fraction_widget.getWidgetValue())
+
+ def updateUI(self):
+
+ self.width_spinbutton.set_value(self.settings.videowidth)
+ self.height_spinbutton.set_value(self.settings.videoheight)
+
+ # video
+ self.frame_rate_fraction_widget.setWidgetValue(self.settings.videorate)
+ self.par_fraction_widget.setWidgetValue(self.settings.videopar)
+
+ # audio
+ set_combo_value(self.channels_combo, self.settings.audiochannels)
+ set_combo_value(self.sample_rate_combo, self.settings.audiorate)
+ set_combo_value(self.sample_depth_combo, self.settings.audiodepth)
+
+ self._selectDarRadiobuttonToggledCb(self.select_dar_radiobutton)
+
+ # metadata
+ self.title_entry.set_text(self.project.name)
+ self.author_entry.set_text(self.project.author)
+ if self.project.year:
+ year = int(self.project.year)
+ else:
+ year = datetime.now().year
+ self.year_spinbutton.get_adjustment().set_value(year)
+
+ def updateMetadata(self):
+ self.project.name = self.title_entry.get_text()
+ self.project.author = self.author_entry.get_text()
+ self.project.year = str(self.year_spinbutton.get_value_as_int())
+
+ def updateSettings(self):
+ width = int(self.width_spinbutton.get_value())
+ height = int(self.height_spinbutton.get_value())
+ par = self.par_fraction_widget.getWidgetValue()
+ frame_rate = self.frame_rate_fraction_widget.getWidgetValue()
+
+ channels = get_combo_value(self.channels_combo)
+ sample_rate = get_combo_value(self.sample_rate_combo)
+ sample_depth = get_combo_value(self.sample_depth_combo)
+
+ self.settings.setVideoProperties(width, height, frame_rate, par)
+ self.settings.setAudioProperties(channels, sample_rate, sample_depth)
+
+ self.project.setSettings(self.settings)
+
+ def _responseCb(self, unused_widget, response):
+ if response == gtk.RESPONSE_OK:
+ self.updateSettings()
+ self.updateMetadata()
+ self.window.destroy()
diff --git a/pitivi/render.py b/pitivi/render.py
index 9590b8f..bbda591 100644
--- a/pitivi/render.py
+++ b/pitivi/render.py
@@ -1031,7 +1031,7 @@ class EncodingDialog(Loggable):
self.resolution_label.set_text(u"%dÃ%d" % (width, height))
def _projectSettingsButtonClickedCb(self, button):
- from pitivi.ui.projectsettings import ProjectSettingsDialog
+ from pitivi.project import ProjectSettingsDialog
dialog = ProjectSettingsDialog(self.window, self.project)
dialog.window.connect("destroy", self._projectSettingsDestroyCb)
dialog.window.run()
diff --git a/pitivi/ui/Makefile.am b/pitivi/ui/Makefile.am
index fbf4100..3b38cdc 100644
--- a/pitivi/ui/Makefile.am
+++ b/pitivi/ui/Makefile.am
@@ -10,7 +10,6 @@ ui_PYTHON = \
preset.py \
previewer.py \
preview.py \
- projectsettings.py \
basetabs.py \
startupwizard.py \
viewer.py \
diff --git a/pitivi/ui/mainwindow.py b/pitivi/ui/mainwindow.py
index 002f9b9..0c9a538 100644
--- a/pitivi/ui/mainwindow.py
+++ b/pitivi/ui/mainwindow.py
@@ -558,7 +558,7 @@ class PitiviMainWindow(gtk.Window, Loggable):
self.showProjectSettingsDialog()
def showProjectSettingsDialog(self):
- from projectsettings import ProjectSettingsDialog
+ from pitivi.project import ProjectSettingsDialog
ProjectSettingsDialog(self, self.app.current).window.run()
self.updateTitle()
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 21b068f..209a18d 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -30,7 +30,6 @@ pitivi/ui/filelisterrordialog.py
pitivi/ui/mainwindow.py
pitivi/ui/prefs.py
pitivi/ui/previewer.py
-pitivi/ui/projectsettings.py
pitivi/ui/viewer.py
pitivi/utils/misc.py
diff --git a/tests/test_projectsettings.py b/tests/test_projectsettings.py
index 9d5a5f9..3a9edce 100644
--- a/tests/test_projectsettings.py
+++ b/tests/test_projectsettings.py
@@ -22,7 +22,7 @@
from unittest import TestCase
from pitivi.ui.preset import PresetManager
-from pitivi.ui.projectsettings import ProjectSettingsDialog
+from pitivi.ui.project import ProjectSettingsDialog
class TestProjectSettingsDialog(TestCase):
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]