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) # set the project metadata # FIXME: not saved in the project file if self.year_spinbutton.get_value_as_int() == 1900: self.year_spinbutton.set_value(datetime.now().year) if self.author_entry.get_text() == "": self.full_user_name = getpwuid(os.getuid()).pw_gecos.split(",")[0] self.author_entry.set_text(self.full_user_name) # 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.load() self.video_presets = VideoPresetManager() self.video_presets.load() 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()