def __init__(self, script_data_object): self.script_data_object = copy.deepcopy(script_data_object) self.preview_frame = -1 # -1 used as flag that no preview renders ongoing and new one can be started # Create panels for objects self.editor_widgets = [] editors_list = self.script_data_object["editors_list"] for editor_data in editors_list: name, type, value = editor_data editor_type = int(type) self.editor_widgets.append( _get_editor(editor_type, name, name, value, "")) editors_v_panel = Gtk.VBox(True, 2) for w in self.editor_widgets: editors_v_panel.pack_start(w, False, False, 0) pane = Gtk.VBox(False, 2) if len(self.editor_widgets) != 0: pane.pack_start(editors_v_panel, False, False, 0) else: pane.pack_start(Gtk.Label(_("No Editors for this script")), False, False, 0) # Put in scrollpane if too many editors for screensize. n_editors = len(self.editor_widgets) add_scroll = False if editorstate.screen_size_small_height() == True and n_editors > 4: add_scroll = True h = 500 elif editorstate.screen_size_small_height( ) == True and editorstate.screen_size_large_height( ) == False and n_editors > 5: add_scroll = True h = 600 elif editorstate.screen_size_large_height() == True and n_editors > 6: add_scroll = True h = 700 if add_scroll == True: sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) sw.add(pane) sw.set_size_request(400, h) if add_scroll == True: editors_panel = sw else: editors_panel = pane self.editors_panel = editors_panel
def init(profile): audio_level_filter = mlt.Filter(profile, "audiolevel") global MONITORING_AVAILABLE if audio_level_filter != None: MONITORING_AVAILABLE = True editorstate.audio_monitoring_available = True else: MONITORING_AVAILABLE = False editorstate.audio_monitoring_available = False global CONTROL_SLOT_H, METER_SLOT_H, METER_LIGHTS, METER_HEIGHT if editorstate.screen_size_small_height() == True: if editorstate.SCREEN_HEIGHT > 898: METER_SLOT_H = 400 CONTROL_SLOT_H = 240 METER_LIGHTS = 123 METER_HEIGHT = METER_LIGHTS * DASH_INK + (METER_LIGHTS - 1) * DASH_SKIP else: METER_SLOT_H = 275 CONTROL_SLOT_H = 240 METER_LIGHTS = 82 METER_HEIGHT = METER_LIGHTS * DASH_INK + (METER_LIGHTS - 1) * DASH_SKIP # We want this to be always present when closing app or we'll need to handle it being missing. global _update_ticker _update_ticker = utils.Ticker(_audio_monitor_update, 0.04) _update_ticker.start_ticker() _update_ticker.stop_ticker()
def get_render_panel_left(render_widgets): small_height = editorstate.screen_size_small_height() file_opts_panel = guiutils.get_named_frame(_("File"), render_widgets.file_panel.vbox, 4) profile_panel = guiutils.get_named_frame(_("Render Profile"), render_widgets.profile_panel.vbox, 4) if small_height == False: encoding_panel = guiutils.get_named_frame( _("Encoding Format"), render_widgets.encoding_panel.vbox, 4) render_type_panel = guiutils.get_named_frame( _("Render Type"), render_widgets.render_type_panel.vbox, 4) render_panel = Gtk.VBox() render_panel.pack_start(file_opts_panel, False, False, 0) render_panel.pack_start(render_type_panel, False, False, 0) render_panel.pack_start(profile_panel, False, False, 0) if small_height == False: render_panel.pack_start(encoding_panel, False, False, 0) render_panel.pack_start(Gtk.Label(), True, True, 0) elif editorstate.SCREEN_HEIGHT == 900: # 900px height screens need most small height fixes but not this encoding_panel = guiutils.get_named_frame( _("Encoding Format"), render_widgets.encoding_panel.vbox, 4) render_panel.pack_start(encoding_panel, False, False, 0) render_panel.pack_start(Gtk.Label(), True, True, 0) return render_panel
def __init__(self, out_profile_changed_callback): self.use_project_label = Gtk.Label(label=_("Use Project Profile:")) self.use_args_label = Gtk.Label(label=_("Render using args:")) self.use_project_profile_check = Gtk.CheckButton() self.use_project_profile_check.set_active(True) self.use_project_profile_check.connect("toggled", self.use_project_check_toggled) self.out_profile_combo = ProfileSelector(out_profile_changed_callback) self.out_profile_info_box = ProfileInfoBox() # filled later when current sequence known use_project_profile_row = Gtk.HBox() use_project_profile_row.pack_start(self.use_project_label, False, False, 0) use_project_profile_row.pack_start(self.use_project_profile_check, False, False, 0) use_project_profile_row.pack_start(Gtk.Label(), True, True, 0) self.use_project_profile_check.set_tooltip_text(_("Select used project profile for rendering")) self.out_profile_info_box.set_tooltip_text(_("Render profile info")) self.vbox = Gtk.VBox(False, 2) self.vbox.pack_start(use_project_profile_row, False, False, 0) self.vbox.pack_start(self.out_profile_combo.widget, False, False, 0) if editorstate.screen_size_small_height() == False: self.vbox.pack_start(self.out_profile_info_box, False, False, 0)
def _set_draw_params(): if editorstate.screen_size_small_width() == True: appconsts.NOTEBOOK_WIDTH = 400 editorwindow.MONITOR_AREA_WIDTH = 400 editorwindow.MEDIA_MANAGER_WIDTH = 100 if editorstate.screen_size_small_height() == True: appconsts.TOP_ROW_HEIGHT = 10 projectinfogui.PROJECT_INFO_PANEL_HEIGHT = 140 tlinewidgets.HEIGHT = 252 if editorstate.screen_size_large_height() == True: keyframeeditcanvas.GEOMETRY_EDITOR_HEIGHT = 300 if editorstate.SCREEN_WIDTH < 1153 or editorstate.SCREEN_HEIGHT < 865: editorwindow.MONITOR_AREA_WIDTH = 400 positionbar.BAR_WIDTH = 100 if editorpersistance.prefs.double_track_hights == True: appconsts.TRACK_HEIGHT_NORMAL = 100 # track height in canvas and column appconsts.TRACK_HEIGHT_SMALL = 50 # track height in canvas and column appconsts.TRACK_HEIGHT_SMALLEST = 50 # maybe remove as it is no longer meaningful appconsts.TLINE_HEIGHT = 520 sequence.TRACK_HEIGHT_NORMAL = appconsts.TRACK_HEIGHT_NORMAL # track height in canvas and column sequence.TRACK_HEIGHT_SMALL = appconsts.TRACK_HEIGHT_SMALL # track height in canvas and column tlinewidgets.set_tracks_double_height_consts()
def init(profile): audio_level_filter = mlt.Filter(profile, "audiolevel") global MONITORING_AVAILABLE if audio_level_filter != None: MONITORING_AVAILABLE = True editorstate.audio_monitoring_available = True else: MONITORING_AVAILABLE = False editorstate.audio_monitoring_available = False global CONTROL_SLOT_H, METER_SLOT_H, METER_LIGHTS, METER_HEIGHT if editorstate.screen_size_small_height() == True: if editorstate.SCREEN_HEIGHT > 898: METER_SLOT_H = 400 CONTROL_SLOT_H = 240 METER_LIGHTS = 123 METER_HEIGHT = METER_LIGHTS * DASH_INK + (METER_LIGHTS - 1) * DASH_SKIP else: METER_SLOT_H = 275 CONTROL_SLOT_H = 240 METER_LIGHTS = 82 METER_HEIGHT = METER_LIGHTS * DASH_INK + (METER_LIGHTS - 1) * DASH_SKIP # We want this to be always present when closing app or we'll need to handle it being missing. global _update_ticker _update_ticker = utils.Ticker(_audio_monitor_update, 0.04) _update_ticker.start_ticker() _update_ticker.stop_ticker()
def get_render_panel_left(render_widgets): small_height = editorstate.screen_size_small_height() file_opts_panel = guiutils.get_named_frame(_("File"), render_widgets.file_panel.vbox, 4) profile_panel = guiutils.get_named_frame(_("Render Profile"), render_widgets.profile_panel.vbox, 4) if small_height == False: encoding_panel = guiutils.get_named_frame( _("Encoding Format"), render_widgets.encoding_panel.vbox, 4) render_type_panel = guiutils.get_named_frame( _("Render Type"), render_widgets.render_type_panel.vbox, 4) render_panel = Gtk.VBox() render_panel.pack_start(file_opts_panel, False, False, 0) render_panel.pack_start(render_type_panel, False, False, 0) render_panel.pack_start(profile_panel, False, False, 0) if small_height == False: render_panel.pack_start(encoding_panel, False, False, 0) render_panel.pack_start(Gtk.Label(), True, True, 0) return render_panel
def _set_draw_params(): if editorstate.screen_size_small_width() == True: appconsts.NOTEBOOK_WIDTH = 400 editorwindow.MONITOR_AREA_WIDTH = 400 editorwindow.MEDIA_MANAGER_WIDTH = 100 if editorstate.screen_size_small_height() == True: appconsts.TOP_ROW_HEIGHT = 10 projectinfogui.PROJECT_INFO_PANEL_HEIGHT = 140 tlinewidgets.HEIGHT = 252 if editorstate.screen_size_large_height() == True: keyframeeditcanvas.GEOMETRY_EDITOR_HEIGHT = 300 if editorstate.SCREEN_WIDTH < 1153 or editorstate.SCREEN_HEIGHT < 865: editorwindow.MONITOR_AREA_WIDTH = 400 positionbar.BAR_WIDTH = 100 if editorpersistance.prefs.double_track_hights == True: appconsts.TRACK_HEIGHT_NORMAL = 100 # track height in canvas and column appconsts.TRACK_HEIGHT_SMALL = 50 # track height in canvas and column appconsts.TRACK_HEIGHT_SMALLEST = 50 # maybe remove as it is no longer meaningful appconsts.TLINE_HEIGHT = 520 sequence.TRACK_HEIGHT_NORMAL = appconsts.TRACK_HEIGHT_NORMAL # track height in canvas and column sequence.TRACK_HEIGHT_SMALL = appconsts.TRACK_HEIGHT_SMALL # track height in canvas and column tlinewidgets.set_tracks_double_height_consts()
def get_clip_effects_editor_panel(group_combo_box, effects_list_view): """ Use components created at clipeffectseditor.py. """ create_widgets() ad_buttons_box = Gtk.HBox(True,1) ad_buttons_box.pack_start(widgets.add_effect_b, True, True, 0) ad_buttons_box.pack_start(widgets.del_effect_b, True, True, 0) stack_buttons_box = Gtk.HBox(False,1) stack_buttons_box.pack_start(ad_buttons_box, True, True, 0) stack_buttons_box.pack_start(widgets.toggle_all, False, False, 0) effect_stack = widgets.effect_stack_view for group in mltfilters.groups: group_name, filters_array = group group_combo_box.append_text(group_name) group_combo_box.set_active(0) # Same callback function works for filter select window too group_combo_box.connect("changed", lambda w,e: _group_selection_changed(w,effects_list_view), None) widgets.group_combo = group_combo_box widgets.effect_list_view = effects_list_view set_enabled(False) exit_button_vbox = Gtk.VBox(False, 2) exit_button_vbox.pack_start(widgets.exit_button, False, False, 0) exit_button_vbox.pack_start(Gtk.Label(), True, True, 0) info_row = Gtk.HBox(False, 2) info_row.pack_start(widgets.clip_info, False, False, 0) info_row.pack_start(exit_button_vbox, True, True, 0) combo_row = Gtk.HBox(False, 2) combo_row.pack_start(group_combo_box, True, True, 0) combo_row.pack_start(guiutils.get_pad_label(8, 2), False, False, 0) group_name, filters_array = mltfilters.groups[0] effects_list_view.fill_data_model(filters_array) effects_list_view.treeview.get_selection().select_path("0") effects_vbox = Gtk.VBox(False, 2) effects_vbox.pack_start(info_row, False, False, 0) if editorstate.screen_size_small_height() == False: effects_vbox.pack_start(guiutils.get_pad_label(2, 2), False, False, 0) effects_vbox.pack_start(stack_buttons_box, False, False, 0) effects_vbox.pack_start(effect_stack, True, True, 0) effects_vbox.pack_start(combo_row, False, False, 0) effects_vbox.pack_start(effects_list_view, True, True, 0) widgets.group_combo.set_tooltip_text(_("Select Filter Group")) widgets.effect_list_view.set_tooltip_text(_("Current group Filters")) return effects_vbox
def get_clip_effects_editor_panel(group_combo_box, effects_list_view): """ Use components created at clipeffectseditor.py. """ create_widgets() ad_buttons_box = Gtk.HBox(True, 1) ad_buttons_box.pack_start(widgets.add_effect_b, True, True, 0) ad_buttons_box.pack_start(widgets.del_effect_b, True, True, 0) stack_buttons_box = Gtk.HBox(False, 1) stack_buttons_box.pack_start(ad_buttons_box, True, True, 0) stack_buttons_box.pack_start(widgets.toggle_all, False, False, 0) effect_stack = widgets.effect_stack_view for group in mltfilters.groups: group_name, filters_array = group group_combo_box.append_text(group_name) group_combo_box.set_active(0) # Same callback function works for filter select window too group_combo_box.connect( "changed", lambda w, e: _group_selection_changed(w, effects_list_view), None) widgets.group_combo = group_combo_box widgets.effect_list_view = effects_list_view set_enabled(False) exit_button_vbox = Gtk.VBox(False, 2) exit_button_vbox.pack_start(widgets.exit_button, False, False, 0) exit_button_vbox.pack_start(Gtk.Label(), True, True, 0) info_row = Gtk.HBox(False, 2) info_row.pack_start(widgets.clip_info, False, False, 0) info_row.pack_start(exit_button_vbox, True, True, 0) combo_row = Gtk.HBox(False, 2) combo_row.pack_start(group_combo_box, True, True, 0) combo_row.pack_start(guiutils.get_pad_label(8, 2), False, False, 0) group_name, filters_array = mltfilters.groups[0] effects_list_view.fill_data_model(filters_array) effects_list_view.treeview.get_selection().select_path("0") effects_vbox = Gtk.VBox(False, 2) effects_vbox.pack_start(info_row, False, False, 0) if editorstate.screen_size_small_height() == False: effects_vbox.pack_start(guiutils.get_pad_label(2, 2), False, False, 0) effects_vbox.pack_start(stack_buttons_box, False, False, 0) effects_vbox.pack_start(effect_stack, True, True, 0) effects_vbox.pack_start(combo_row, False, False, 0) effects_vbox.pack_start(effects_list_view, True, True, 0) widgets.group_combo.set_tooltip_text(_("Select Filter Group")) widgets.effect_list_view.set_tooltip_text(_("Current group Filters")) return effects_vbox
def _set_draw_params(): if editorstate.screen_size_small_width() == True: appconsts.NOTEBOOK_WIDTH = 450 editorwindow.MONITOR_AREA_WIDTH = 450 editorwindow.MEDIA_MANAGER_WIDTH = 220 if editorstate.screen_size_small_height() == True: appconsts.TOP_ROW_HEIGHT = 10
def _set_draw_params(): if editorstate.screen_size_small_width() == True: appconsts.NOTEBOOK_WIDTH = 450 editorwindow.MONITOR_AREA_WIDTH = 450 editorwindow.MEDIA_MANAGER_WIDTH = 220 if editorstate.screen_size_small_height() == True: appconsts.TOP_ROW_HEIGHT = 10
def get_render_panel_right(render_widgets, render_clicked_cb, to_queue_clicked_cb): small_height = editorstate.screen_size_small_height() if small_height: encoding_panel = guiutils.get_named_frame(_("Encoding Format"), render_widgets.encoding_panel.vbox, 4) render_type_panel = guiutils.get_named_frame(_("Render Type"), render_widgets.render_type_panel.vbox, 4) opts_panel = guiutils.get_named_frame(_("Render Args"), render_widgets.args_panel.vbox, 4) bin_row = Gtk.HBox() bin_row.pack_start(guiutils.get_pad_label(10, 8), False, False, 0) bin_row.pack_start(Gtk.Label(label=_("Open File in Bin:")), False, False, 0) bin_row.pack_start(guiutils.get_pad_label(10, 2), False, False, 0) bin_row.pack_start(render_widgets.args_panel.open_in_bin, False, False, 0) bin_row.pack_start(Gtk.Label(), True, True, 0) range_row = Gtk.HBox() range_row.pack_start(guiutils.get_pad_label(10, 8), False, False, 0) range_row.pack_start(Gtk.Label(label=_("Render Range:")), False, False, 0) range_row.pack_start(guiutils.get_pad_label(10, 2), False, False, 0) range_row.pack_start(render_widgets.range_cb, True, True, 0) buttons_panel = Gtk.HBox() buttons_panel.pack_start(guiutils.get_pad_label(10, 8), False, False, 0) buttons_panel.pack_start(render_widgets.reset_button, False, False, 0) buttons_panel.pack_start(Gtk.Label(), True, True, 0) buttons_panel.pack_start(render_widgets.queue_button, False, False, 0) buttons_panel.pack_start(Gtk.Label(), True, True, 0) buttons_panel.pack_start(render_widgets.render_button, False, False, 0) render_widgets.queue_button.connect("clicked", to_queue_clicked_cb, None) render_widgets.render_button.connect("clicked", render_clicked_cb, None) render_panel = Gtk.VBox() if small_height: render_panel.pack_start(render_type_panel, False, False, 0) render_panel.pack_start(encoding_panel, False, False, 0) render_panel.pack_start(Gtk.Label(), True, True, 0) else: render_panel.pack_start(opts_panel, True, True, 0) if small_height == False: render_panel.pack_start(guiutils.get_pad_label(10, 22), False, False, 0) render_panel.pack_start(bin_row, False, False, 0) render_panel.pack_start(range_row, False, False, 0) if small_height == False: render_panel.pack_start(guiutils.get_pad_label(10, 12), False, False, 0) render_panel.pack_start(buttons_panel, False, False, 0) return render_panel
def get_render_panel_right(render_widgets, render_clicked_cb, to_queue_clicked_cb): small_height = editorstate.screen_size_small_height() if small_height: encoding_panel = guiutils.get_named_frame(_("Encoding Format"), render_widgets.encoding_panel.vbox, 4) render_type_panel = guiutils.get_named_frame(_("Render Type"), render_widgets.render_type_panel.vbox, 4) opts_panel = guiutils.get_named_frame(_("Render Args"), render_widgets.args_panel.vbox, 4) bin_row = Gtk.HBox() bin_row.pack_start(guiutils.get_pad_label(10, 8), False, False, 0) bin_row.pack_start(Gtk.Label(label=_("Open File in Bin:")), False, False, 0) bin_row.pack_start(guiutils.get_pad_label(10, 2), False, False, 0) bin_row.pack_start(render_widgets.args_panel.open_in_bin, False, False, 0) bin_row.pack_start(Gtk.Label(), True, True, 0) range_row = Gtk.HBox() range_row.pack_start(guiutils.get_pad_label(10, 8), False, False, 0) range_row.pack_start(Gtk.Label(label=_("Render Range:")), False, False, 0) range_row.pack_start(guiutils.get_pad_label(10, 2), False, False, 0) range_row.pack_start(render_widgets.range_cb, True, True, 0) buttons_panel = Gtk.HBox() buttons_panel.pack_start(guiutils.get_pad_label(10, 8), False, False, 0) buttons_panel.pack_start(render_widgets.reset_button, False, False, 0) buttons_panel.pack_start(Gtk.Label(), True, True, 0) buttons_panel.pack_start(render_widgets.queue_button, False, False, 0) buttons_panel.pack_start(Gtk.Label(), True, True, 0) buttons_panel.pack_start(render_widgets.render_button, False, False, 0) render_widgets.queue_button.connect("clicked", to_queue_clicked_cb, None) render_widgets.render_button.connect("clicked", render_clicked_cb, None) render_panel = Gtk.VBox() if small_height: render_panel.pack_start(render_type_panel, False, False, 0) render_panel.pack_start(encoding_panel, False, False, 0) render_panel.pack_start(Gtk.Label(), True, True, 0) else: render_panel.pack_start(opts_panel, True, True, 0) if small_height == False: render_panel.pack_start(guiutils.get_pad_label(10, 22), False, False, 0) render_panel.pack_start(bin_row, False, False, 0) render_panel.pack_start(range_row, False, False, 0) if small_height == False: render_panel.pack_start(guiutils.get_pad_label(10, 12), False, False, 0) render_panel.pack_start(buttons_panel, False, False, 0) return render_panel
def _update_top_row(self, show_all=False): if editorpersistance.prefs.show_vu_meter and editorstate.screen_size_small_height() == False: if len(self.top_row_hbox) == 1: self.top_row_hbox.pack_end(audiomonitoring.get_master_meter(), False, False, 0) else: if len(self.top_row_hbox) == 2: meter = self.top_row_hbox.get_children()[1] self.top_row_hbox.remove(meter) audiomonitoring.close_master_meter() if show_all: self.window.show_all()
def _update_top_row(self, show_all=False): if editorpersistance.prefs.show_vu_meter and editorstate.screen_size_small_height() == False: if len(self.top_row_hbox) == 1: self.top_row_hbox.pack_end(audiomonitoring.get_master_meter(), False, False, 0) else: if len(self.top_row_hbox) == 2: meter = self.top_row_hbox.get_children()[1] self.top_row_hbox.remove(meter) audiomonitoring.close_master_meter() if show_all: self.window.show_all()
def _set_draw_params(): if editorstate.screen_size_small_width() == True: appconsts.NOTEBOOK_WIDTH = 450 editorwindow.MONITOR_AREA_WIDTH = 450 editorwindow.MEDIA_MANAGER_WIDTH = 220 if editorstate.screen_size_small_height() == True: appconsts.TOP_ROW_HEIGHT = 10 projectinfogui.PROJECT_INFO_PANEL_HEIGHT = 140 if editorstate.SCREEN_WIDTH < 1153 and editorstate.SCREEN_HEIGHT < 865: editorwindow.MONITOR_AREA_WIDTH = 400 positionbar.BAR_WIDTH = 100
def _render_type_changed(): if widgets.render_type_panel.type_combo.get_active() == 0: # User Defined enable_user_rendering(True) set_default_values_for_widgets() widgets.render_type_panel.presets_selector.widget.set_sensitive(False) _preset_selection_changed() widgets.encoding_panel.encoding_selector.encoding_selection_changed() else: # Preset Encodings enable_user_rendering(False) widgets.render_type_panel.presets_selector.widget.set_sensitive(True) _preset_selection_changed() if editorstate.screen_size_small_height() == False: widgets.args_panel.opts_view.set_sensitive(False) widgets.args_panel.opts_view.get_buffer().set_text("")
def _render_type_changed(): if widgets.render_type_panel.type_combo.get_active() == 0: # User Defined enable_user_rendering(True) set_default_values_for_widgets() widgets.render_type_panel.presets_selector.widget.set_sensitive(False) _preset_selection_changed() widgets.encoding_panel.encoding_selector.encoding_selection_changed() else: # Preset Encodings enable_user_rendering(False) widgets.render_type_panel.presets_selector.widget.set_sensitive(True) _preset_selection_changed() widgets.args_panel.opts_save_button.set_sensitive(False) widgets.args_panel.opts_load_button.set_sensitive(False) if editorstate.screen_size_small_height() == False: widgets.args_panel.load_selection_button.set_sensitive(False) widgets.args_panel.opts_view.set_sensitive(False) widgets.args_panel.opts_view.get_buffer().set_text("")
def get_render_panel_left(render_widgets): small_height = editorstate.screen_size_small_height() file_opts_panel = guiutils.get_named_frame(_("File"), render_widgets.file_panel.vbox, 4) profile_panel = guiutils.get_named_frame(_("Render Profile"), render_widgets.profile_panel.vbox, 4) if small_height == False: encoding_panel = guiutils.get_named_frame(_("Encoding Format"), render_widgets.encoding_panel.vbox, 4) render_type_panel = guiutils.get_named_frame(_("Render Type"), render_widgets.render_type_panel.vbox, 4) render_panel = Gtk.VBox() render_panel.pack_start(file_opts_panel, False, False, 0) if small_height == False: render_panel.pack_start(render_type_panel, False, False, 0) render_panel.pack_start(profile_panel, False, False, 0) if small_height == False: render_panel.pack_start(encoding_panel, False, False, 0) render_panel.pack_start(Gtk.Label(), True, True, 0) return render_panel
def init(profile): audio_level_filter = mlt.Filter(profile, "audiolevel") global MONITORING_AVAILABLE if audio_level_filter != None: MONITORING_AVAILABLE = True editorstate.audio_monitoring_available = True else: MONITORING_AVAILABLE = False editorstate.audio_monitoring_available = False global CONTROL_SLOT_H, METER_SLOT_H if editorstate.screen_size_small_height() == True: METER_SLOT_H = 400 CONTROL_SLOT_H = 220 # We want this to be always present when closing app or we'll need to handle it being missing. global _update_ticker _update_ticker = utils.Ticker(_audio_monitor_update, 0.04) _update_ticker.start_ticker() _update_ticker.stop_ticker()
def init(profile): audio_level_filter = mlt.Filter(profile, "audiolevel") global MONITORING_AVAILABLE if audio_level_filter != None: MONITORING_AVAILABLE = True editorstate.audio_monitoring_available = True else: MONITORING_AVAILABLE = False editorstate.audio_monitoring_available = False global CONTROL_SLOT_H, METER_SLOT_H if editorstate.screen_size_small_height() == True: METER_SLOT_H = 400 CONTROL_SLOT_H = 220 # We want this to be always present when closing app or we'll need to handle it being missing. global _update_ticker _update_ticker = utils.Ticker(_audio_monitor_update, 0.04) _update_ticker.start_ticker() _update_ticker.stop_ticker()
def _set_screen_size_data(): monitor_data = utils.get_display_monitors_size_data() monitor_data_index = editorpersistance.prefs.layout_display_index display = Gdk.Display.get_default() num_monitors = display.get_n_monitors() # Get number of monitors. if monitor_data_index == 0: scr_w = Gdk.Screen.width() scr_h = Gdk.Screen.height() print("Using Full Screen size for layout:", scr_w, "x", scr_h) elif monitor_data_index > num_monitors: print("Specified layout monitor not present.") scr_w = Gdk.Screen.width() scr_h = Gdk.Screen.height() print("Using Full Screen size for layout:", scr_w, "x", scr_h) editorpersistance.prefs.layout_display_index = 0 else: scr_w, scr_h = monitor_data[monitor_data_index] if scr_w < 1151 or scr_h < 767: print("Selected layout monitor too small.") scr_w = Gdk.Screen.width() scr_h = Gdk.Screen.height() print("Using Full Screen size for layout:", scr_w, "x", scr_h) editorpersistance.prefs.layout_display_index = 0 else: # Selected monitor data is available and monitor is usable as layout monitor. print("Using monitor " + str(monitor_data_index) + " for layout: " + str(scr_w) + " x " + str(scr_h)) editorstate.SCREEN_WIDTH = scr_w editorstate.SCREEN_HEIGHT = scr_h print("Small height:", editorstate.screen_size_small_height()) print("Small width:", editorstate.screen_size_small_width()) return (scr_w, scr_h)
def __init__(self, kf_editor, property_editor_widgets_create_func, value_labels): # kf_editor is keyframeeditor.RotoMaskKeyFrameEditor GObject.GObject.__init__(self) self.set_modal(True) self.set_transient_for(gui.editor_window.window) self.set_title(_("RotoMaskEditor")) self.connect("delete-event", lambda w, e:close_rotomask()) if editorstate.screen_size_small_height() == True: global TEXT_LAYER_LIST_HEIGHT, TEXT_VIEW_HEIGHT, VIEW_EDITOR_HEIGHT TEXT_LAYER_LIST_HEIGHT = 150 TEXT_VIEW_HEIGHT = 180 VIEW_EDITOR_HEIGHT = 450 if editorstate.screen_size_small_height() == True: global VIEW_EDITOR_WIDTH VIEW_EDITOR_WIDTH = 680 editor_widgets = property_editor_widgets_create_func() self.block_updates = False self.kf_editor = kf_editor self.kf_editor.set_parent_editor(self) self.value_labels = value_labels self.view_editor = vieweditor.ViewEditor(PLAYER().profile, VIEW_EDITOR_WIDTH, VIEW_EDITOR_HEIGHT) self.view_editor.draw_safe_area = False self.tc_display = guicomponents.MonitorTCDisplay() self.tc_display.use_internal_frame = True self.tc_display.widget.set_valign(Gtk.Align.CENTER) kf_mode_img = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "roto_kf_edit_mode.png") move_mode_img = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "roto_move_mode.png") self.kf_mode_button = Gtk.ToggleButton() self.kf_mode_button.set_image(kf_mode_img) self.kf_mode_button.set_active(True) # we start with vieweditorlayer.ROTO_POINT_MODE edit mode self.kf_mode_button.connect("clicked", self._kf_mode_clicked) self.move_mode_button = Gtk.ToggleButton() self.move_mode_button.set_image(move_mode_img) self.move_mode_button.connect("clicked", self._move_mode_clicked) self.scale_selector = vieweditor.ScaleSelector(self) self.view_editor.scale_select = self.scale_selector timeline_box = Gtk.HBox() timeline_box.pack_start(self.tc_display.widget, False, False, 0) timeline_box.pack_start(Gtk.Label(), True, True, 0) timeline_box.pack_start(self.kf_mode_button, False, False, 0) timeline_box.pack_start(self.move_mode_button, False, False, 0) timeline_box.pack_start(Gtk.Label(), True, True, 0) timeline_box.pack_start(self.scale_selector, False, False, 0) timeline_box.set_margin_top(6) timeline_box.set_margin_bottom(6) mask_type_label = Gtk.Label(_("Mask Type:")) mask_type_combo_box = Gtk.ComboBoxText() mask_type_combo_box.append_text(_("Curve Mask")) mask_type_combo_box.append_text(_("Line Mask")) mask_type_combo_box.set_active(0) mask_type_combo_box.connect("changed", self.mask_type_selection_changed) allow_adding_check = Gtk.CheckButton() allow_adding_check.set_active(False) # This shows value of self.roto_mask_layer.allow_adding_points, False is default allow_adding_check.connect("toggled", self.allow_adding_toggled) allow_adding_label = Gtk.Label(_("Allow to add points to closed masks")) save_rotodata_b = guiutils.get_sized_button(_("Close Tool"), 150, 32) save_rotodata_b.connect("clicked", lambda w:self._save_rotodata_pressed()) prop_editor_row1 = Gtk.HBox() prop_editor_row1.pack_start(Gtk.Label(), True, True, 0) prop_editor_row1.pack_start(mask_type_label, False, False, 0) prop_editor_row1.pack_start(guiutils.pad_label(4, 4), False, False, 0) prop_editor_row1.pack_start(mask_type_combo_box, False, False, 0) prop_editor_row1.pack_start(guiutils.pad_label(24, 20), False, False, 0) prop_editor_row1.pack_start(editor_widgets[0], False, False, 0) prop_editor_row1.pack_start(guiutils.pad_label(24, 20), False, False, 0) prop_editor_row1.pack_start(editor_widgets[3], False, False, 0) prop_editor_row1.pack_start(guiutils.pad_label(24, 20), False, False, 0) prop_editor_row1.pack_start(editor_widgets[4], False, False, 0) prop_editor_row1.pack_start(Gtk.Label(), True, True, 0) prop_editor_row2 = Gtk.HBox() prop_editor_row2.pack_start(Gtk.Label(), True, True, 0) prop_editor_row2.pack_start(editor_widgets[1], False, False, 0) prop_editor_row2.pack_start(guiutils.pad_label(24, 20), False, False, 0) prop_editor_row2.pack_start(editor_widgets[2], False, False, 0) prop_editor_row2.pack_start(Gtk.Label(), True, True, 0) editor_buttons_row = Gtk.HBox() editor_buttons_row.pack_start(allow_adding_check, False, False, 0) editor_buttons_row.pack_start(guiutils.pad_label(4, 2), False, False, 0) editor_buttons_row.pack_start(allow_adding_label, False, False, 0) editor_buttons_row.pack_start(Gtk.Label(), True, True, 0) editor_buttons_row.pack_start(save_rotodata_b, False, False, 0) editor_panel = Gtk.VBox() editor_panel.pack_start(self.view_editor, True, True, 0) editor_panel.pack_start(timeline_box, False, False, 0) editor_panel.pack_start(kf_editor, False, False, 0) editor_panel.pack_start(guiutils.pad_label(2, 12), False, False, 0) editor_panel.pack_start(prop_editor_row1, False, False, 0) editor_panel.pack_start(guiutils.pad_label(2, 12), False, False, 0) editor_panel.pack_start(prop_editor_row2, False, False, 0) editor_panel.pack_start(guiutils.pad_label(2, 12), False, False, 0) editor_panel.pack_start(editor_buttons_row, False, False, 0) editor_row = Gtk.HBox() editor_row.pack_start(editor_panel, True, True, 0) alignment = guiutils.set_margins(editor_row, 8,8,8,8) self.add(alignment) self.view_editor.clear_layers() # NOTE: we start with vieweditorlayer.ROTO_POINT_MODE edit mode, see __init()__ self.roto_mask_layer = vieweditorlayer.RotoMaskEditLayer(self.view_editor, self.kf_editor.clip_editor, kf_editor.editable_property, self) self.view_editor.add_layer(self.roto_mask_layer) self.view_editor.activate_layer(0) self.show_all() self.kf_editor.active_keyframe_changed() self.connect("size-allocate", lambda w, e:self.window_resized()) self.connect("window-state-event", lambda w, e:self.window_resized()) self.connect("key-press-event", self.key_down) self.window_resized()
def main(root_path): """ Called at application start. Initializes application with a default project. """ # DEBUG: Direct output to log file if log file set if _log_file != None: log_print_output_to_file() print "Application version: " + editorstate.appversion # Print OS, Python version and GTK+ version try: os_release_file = open("/etc/os-release","r") os_text = os_release_file.read() s_index = os_text.find("PRETTY_NAME=") e_index = os_text.find("\n", s_index) print "OS: " + os_text[s_index + 13:e_index - 1] except: pass print "Python", sys.version gtk_version = "%s.%s.%s" % (Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version()) print "GTK+ version:", gtk_version editorstate.gtk_version = gtk_version try: editorstate.mlt_version = mlt.LIBMLT_VERSION except: editorstate.mlt_version = "0.0.99" # magic string for "not found" #print "SDL version:", str(editorstate.get_sdl_version()) # passing -xdg as a flag will change the user_dir location with XDG_CONFIG_HOME # For full xdg-app support all the launch processes need to add this too, currently not impl. for arg in sys.argv: if arg.lower() == "-xdg": editorstate.use_xdg = True # Create hidden folders if not present user_dir = utils.get_hidden_user_dir_path() print "User dir:",user_dir if not os.path.exists(user_dir): os.mkdir(user_dir) if not os.path.exists(user_dir + mltprofiles.USER_PROFILES_DIR): os.mkdir(user_dir + mltprofiles.USER_PROFILES_DIR) if not os.path.exists(user_dir + AUTOSAVE_DIR): os.mkdir(user_dir + AUTOSAVE_DIR) if not os.path.exists(user_dir + BATCH_DIR): os.mkdir(user_dir + BATCH_DIR) if not os.path.exists(user_dir + appconsts.AUDIO_LEVELS_DIR): os.mkdir(user_dir + appconsts.AUDIO_LEVELS_DIR) if not os.path.exists(utils.get_hidden_screenshot_dir_path()): os.mkdir(utils.get_hidden_screenshot_dir_path()) if not os.path.exists(user_dir + appconsts.GMIC_DIR): os.mkdir(user_dir + appconsts.GMIC_DIR) if not os.path.exists(user_dir + appconsts.MATCH_FRAME_DIR): os.mkdir(user_dir + appconsts.MATCH_FRAME_DIR) if not os.path.exists(user_dir + appconsts.TRIM_VIEW_DIR): os.mkdir(user_dir + appconsts.TRIM_VIEW_DIR) if not os.path.exists(user_dir + appconsts.NATRON_DIR): os.mkdir(user_dir + appconsts.NATRON_DIR) # Set paths. respaths.set_paths(root_path) # Load editor prefs and list of recent projects editorpersistance.load() if editorpersistance.prefs.theme != appconsts.LIGHT_THEME: respaths.apply_dark_theme() if editorpersistance.prefs.display_all_audio_levels == False: editorstate.display_all_audio_levels = False editorpersistance.create_thumbs_folder_if_needed(user_dir) editorpersistance.create_rendered_clips_folder_if_needed(user_dir) editorpersistance.save() # Init translations module with translations data translations.init_languages() translations.load_filters_translations() mlttransitions.init_module() # Apr-2017 - SvdB - Keyboard shortcuts shortcuts.load_shortcut_files() shortcuts.load_shortcuts() # We respaths and translations data available so we need to init in a function. workflow.init_data() # RHEL7/CentOS compatibility fix if gtk_version == "3.8.8": GObject.threads_init() # Init gtk threads Gdk.threads_init() Gdk.threads_enter() # Themes if editorpersistance.prefs.theme == appconsts.FLOWBLADE_THEME: success = gui.apply_gtk_css() if not success: editorpersistance.prefs.theme = appconsts.LIGHT_THEME editorpersistance.save() if editorpersistance.prefs.theme != appconsts.LIGHT_THEME: Gtk.Settings.get_default().set_property("gtk-application-prefer-dark-theme", True) # Load drag'n'drop images dnd.init() # Adjust gui parameters for smaller screens scr_w = Gdk.Screen.width() scr_h = Gdk.Screen.height() editorstate.SCREEN_WIDTH = scr_w editorstate.SCREEN_HEIGHT = scr_h print "Screen size:", scr_w, "x", scr_h print "Small height:", editorstate.screen_size_small_height() print "Small width:", editorstate.screen_size_small_width() _set_draw_params() # Refuse to run on too small screen. if scr_w < 1151 or scr_h < 767: _too_small_screen_exit() return # Splash screen if editorpersistance.prefs.display_splash_screen == True: show_splash_screen() # Init MLT framework repo = mlt.Factory().init() processutils.prepare_mlt_repo(repo) # Set numeric locale to use "." as radix, MLT initilizes this to OS locale and this causes bugs. locale.setlocale(locale.LC_NUMERIC, 'C') # Check for codecs and formats on the system. mltenv.check_available_features(repo) renderconsumer.load_render_profiles() # Load filter and compositor descriptions from xml files. mltfilters.load_filters_xml(mltenv.services) mlttransitions.load_compositors_xml(mltenv.transitions) # Replace some services if better replacements available. mltfilters.replace_services(mltenv.services) # Create list of available mlt profiles. mltprofiles.load_profile_list() # Save assoc file path if found in arguments. global assoc_file_path assoc_file_path = get_assoc_file_path() # There is always a project open, so at startup we create a default project. # Set default project as the project being edited. editorstate.project = projectdata.get_default_project() check_crash = True # Audiomonitoring being available needs to be known before GUI creation. audiomonitoring.init(editorstate.project.profile) # Set trim view mode to current default value. editorstate.show_trim_view = editorpersistance.prefs.trim_view_default # Check for tools and init tools integration. gmic.test_availablity() toolnatron.init() toolsintegration.init() #toolsintegration.test() # Create player object. create_player() # Create main window and set widget handles in gui.py for more convenient reference. create_gui() # Inits widgets with project data. init_project_gui() # Inits widgets with current sequence data. init_sequence_gui() # Launch player now that data and gui exist launch_player() # Editor and modules need some more initializing. init_editor_state() # Tracks need to be recentered if window is resized. # Connect listener for this now that the tline panel size allocation is sure to be available. global window_resize_id, window_state_id window_resize_id = gui.editor_window.window.connect("size-allocate", lambda w, e:updater.window_resized()) window_state_id = gui.editor_window.window.connect("window-state-event", lambda w, e:updater.window_resized()) # Get existing autosave files autosave_files = get_autosave_files() # Show splash if ((editorpersistance.prefs.display_splash_screen == True) and len(autosave_files) == 0) and not editorstate.runtime_version_greater_then_test_version(editorpersistance.prefs.workflow_dialog_last_version_shown, editorstate.appversion): global splash_timeout_id splash_timeout_id = GLib.timeout_add(2600, destroy_splash_screen) splash_screen.show_all() appconsts.SAVEFILE_VERSION = projectdata.SAVEFILE_VERSION # THIS IS A QUESTIONABLE IDEA TO SIMPLIFY IMPORTS, NOT DRY. WHEN DOING TOOLS THAT RUN IN ANOTHER PROCESSES AND SAVE PROJECTS, THIS LINE NEEDS TO BE THERE ALSO. # Every running instance has unique autosave file which is deleted at exit set_instance_autosave_id() # Existance of autosave file hints that program was exited abnormally. if check_crash == True and len(autosave_files) > 0: if len(autosave_files) == 1: GObject.timeout_add(10, autosave_recovery_dialog) else: GObject.timeout_add(10, autosaves_many_recovery_dialog) else: start_autosave() # We prefer to monkeypatch some callbacks into some modules, usually to # maintain a simpler and/or non-circular import structure. monkeypatch_callbacks() # File in assoc_file_path is opened after very short delay. if not(check_crash == True and len(autosave_files) > 0): if assoc_file_path != None: print "Launch assoc file:", assoc_file_path global assoc_timeout_id assoc_timeout_id = GObject.timeout_add(10, open_assoc_file) if editorpersistance.prefs.theme == appconsts.FLOWBLADE_THEME: gui.apply_flowblade_theme_fixes() # SDL 2 consumer needs to created after Gtk.main() has run enough for window to be visble #if editorstate.get_sdl_version() == editorstate.SDL_2: # needs more state considerion still # print "SDL2 timeout launch" # global sdl2_timeout_id # sdl2_timeout_id = GObject.timeout_add(1500, create_sdl_2_consumer) # In PositionNumericalEntries we are using Gtk.Entry objects in a way that works for us nicely, but is somehow "error" for Gtk, so we just kill this. Gtk.Settings.get_default().set_property("gtk-error-bell", False) # Show first run worflow info dialog if not shown for this version of application. if editorstate.runtime_version_greater_then_test_version(editorpersistance.prefs.workflow_dialog_last_version_shown, editorstate.appversion): GObject.timeout_add(500, show_worflow_info_dialog) # Launch gtk+ main loop Gtk.main() Gdk.threads_leave()
def main(root_path): """ Called at application start. Initializes application with a default project. """ # Print OS, Python version and GTK+ version try: os_release_file = open("/etc/os-release", "r") os_text = os_release_file.read() s_index = os_text.find("PRETTY_NAME=") e_index = os_text.find("\n", s_index) print "OS: " + os_text[s_index + 13:e_index - 1] except: pass print "Python", sys.version gtk_version = "%s.%s.%s" % (Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version()) print "GTK+ version:", gtk_version editorstate.gtk_version = gtk_version try: editorstate.mlt_version = mlt.LIBMLT_VERSION except: editorstate.mlt_version = "0.0.99" # magic string for "not found" # Create hidden folders if not present user_dir = utils.get_hidden_user_dir_path() if not os.path.exists(user_dir): os.mkdir(user_dir) if not os.path.exists(user_dir + mltprofiles.USER_PROFILES_DIR): os.mkdir(user_dir + mltprofiles.USER_PROFILES_DIR) if not os.path.exists(user_dir + AUTOSAVE_DIR): os.mkdir(user_dir + AUTOSAVE_DIR) if not os.path.exists(user_dir + BATCH_DIR): os.mkdir(user_dir + BATCH_DIR) if not os.path.exists(user_dir + appconsts.AUDIO_LEVELS_DIR): os.mkdir(user_dir + appconsts.AUDIO_LEVELS_DIR) if not os.path.exists(utils.get_hidden_screenshot_dir_path()): os.mkdir(utils.get_hidden_screenshot_dir_path()) # Set paths. respaths.set_paths(root_path) # Load editor prefs and list of recent projects editorpersistance.load() if editorpersistance.prefs.dark_theme == True: respaths.apply_dark_theme() editorpersistance.create_thumbs_folder_if_needed(user_dir) editorpersistance.create_rendered_clips_folder_if_needed(user_dir) editorpersistance.save() # Init translations module with translations data translations.init_languages() translations.load_filters_translations() mlttransitions.init_module() # Init gtk threads Gdk.threads_init() Gdk.threads_enter() # Request dark them if so desired if editorpersistance.prefs.dark_theme == True: Gtk.Settings.get_default().set_property( "gtk-application-prefer-dark-theme", True) # Load drag'n'drop images dnd.init() # Adjust gui parameters for smaller screens scr_w = Gdk.Screen.width() scr_h = Gdk.Screen.height() editorstate.SCREEN_WIDTH = scr_w editorstate.SCREEN_HEIGHT = scr_h print "Small height:", editorstate.screen_size_small_height() print "Small width:", editorstate.screen_size_small_width() _set_draw_params() # Refuse to run on too small screen. if scr_w < 1151 or scr_h < 767: _too_small_screen_exit() return # Splash screen if editorpersistance.prefs.display_splash_screen == True: show_splash_screen() # Init MLT framework repo = mlt.Factory().init() # Set numeric locale to use "." as radix, MLT initilizes this to OS locale and this causes bugs locale.setlocale(locale.LC_NUMERIC, 'C') # Check for codecs and formats on the system mltenv.check_available_features(repo) renderconsumer.load_render_profiles() # Load filter and compositor descriptions from xml files. mltfilters.load_filters_xml(mltenv.services) mlttransitions.load_compositors_xml(mltenv.transitions) # Replace some services if better replacements available mltfilters.replace_services(mltenv.services) # Create list of available mlt profiles mltprofiles.load_profile_list() # Launch association file if found in arguments launch_file_path = get_assoc_file_path() if launch_file_path != None: try: print "Launching assoc file:" + launch_file_path persistance.show_messages = False editorstate.project = persistance.load_project(launch_file_path) persistance.show_messages = True check_crash = False except: editorstate.project = projectdata.get_default_project() persistance.show_messages = True check_crash = True else: # There is always a project open, so at startup we create a default project. # Set default project as the project being edited. editorstate.project = projectdata.get_default_project() check_crash = True # Audiomonitoring being available needs to be known before GUI creation audiomonitoring.init(editorstate.project.profile) # Create player object create_player() # Create main window and set widget handles in gui.py for more convenient reference. create_gui() # Inits widgets with project data init_project_gui() # Inits widgets with current sequence data init_sequence_gui() # Launch player now that data and gui exist launch_player() # Editor and modules need some more initializing init_editor_state() # Tracks need to be recentered if window is resized. # Connect listener for this now that the tline panel size allocation is sure to be available. gui.editor_window.window.connect("size-allocate", lambda w, e: updater.window_resized()) gui.editor_window.window.connect("window-state-event", lambda w, e: updater.window_resized()) # Get existing autosave files autosave_files = get_autosave_files() # Show splash if ((editorpersistance.prefs.display_splash_screen == True) and len(autosave_files) == 0): global splash_timeout_id splash_timeout_id = GLib.timeout_add(2600, destroy_splash_screen) splash_screen.show_all() appconsts.SAVEFILE_VERSION = projectdata.SAVEFILE_VERSION # THIS IS A QUESTIONABLE IDEA TO SIMPLIFY IMPORTS, NOT DRY. WHEN DOING TOOLS THAT RUN IN ANOTHER PROCESSES AND SAVE PROJECTS, THIS LINE NEEDS TO BE THERE ALSO. # Every running instance has unique autosave file which is deleted at exit set_instance_autosave_id() # Existance of autosave file hints that program was exited abnormally if check_crash == True and len(autosave_files) > 0: if len(autosave_files) == 1: GObject.timeout_add(10, autosave_recovery_dialog) else: GObject.timeout_add(10, autosaves_many_recovery_dialog) else: start_autosave() # We prefer to monkeypatch some callbacks into some modules, usually to # maintain a simpler and non-circular import structure monkeypatch_callbacks() # Launch gtk+ main loop Gtk.main() Gdk.threads_leave()
def _init_view_menu(self, menu_item): menu = menu_item.get_submenu() # Full Screen -tem is already in menu, we need separator here sep = Gtk.SeparatorMenuItem() menu.append(sep) mb_menu_item = Gtk.MenuItem(_("Middlebar Layout").encode('utf-8')) mb_menu = Gtk.Menu() tc_left = Gtk.RadioMenuItem() tc_left.set_label(_("Timecode Left").encode('utf-8')) tc_left.set_active(True) tc_left.connect("activate", lambda w: middlebar._show_buttons_TC_LEFT_layout(w)) mb_menu.append(tc_left) tc_middle = Gtk.RadioMenuItem.new_with_label([tc_left], _("Timecode Center").encode('utf-8')) tc_middle.connect("activate", lambda w: middlebar._show_buttons_TC_MIDDLE_layout(w)) mb_menu.append(tc_middle) if editorpersistance.prefs.midbar_tc_left == True: tc_left.set_active(True) else: tc_middle.set_active(True) mb_menu_item.set_submenu(mb_menu) menu.append(mb_menu_item) tabs_menu_item = Gtk.MenuItem(_("Tabs Position").encode('utf-8')) tabs_menu = Gtk.Menu() tabs_up = Gtk.RadioMenuItem() tabs_up.set_label( _("Up").encode('utf-8')) tabs_up.connect("activate", lambda w: self._show_tabs_up(w)) tabs_menu.append(tabs_up) tabs_down = Gtk.RadioMenuItem.new_with_label([tabs_up], _("Down").encode('utf-8')) tabs_down.connect("activate", lambda w: self._show_tabs_down(w)) if editorpersistance.prefs.tabs_on_top == True: tabs_up.set_active(True) else: tabs_down.set_active(True) tabs_menu.append(tabs_down) tabs_menu_item.set_submenu(tabs_menu) menu.append(tabs_menu_item) sep = Gtk.SeparatorMenuItem() menu.append(sep) if not (editorstate.screen_size_small_height() == True or editorstate.screen_size_small_height() == True): show_monitor_info_item = Gtk.CheckMenuItem(_("Show Monitor Sequence Profile").encode('utf-8')) show_monitor_info_item.set_active(editorpersistance.prefs.show_sequence_profile) show_monitor_info_item.connect("toggled", lambda w: middlebar._show_monitor_info_toggled(w)) menu.append(show_monitor_info_item) show_vu_item = Gtk.CheckMenuItem(_("Show Master Volume Meter").encode('utf-8')) show_vu_item.set_active(editorpersistance.prefs.show_vu_meter) show_vu_item.connect("toggled", lambda w: self._show_vu_meter(w)) menu.append(show_vu_item) sep = Gtk.SeparatorMenuItem() menu.append(sep) interp_menu_item = Gtk.MenuItem(_("Monitor Playback Interpolation").encode('utf-8')) interp_menu = Gtk.Menu() interp_nearest = Gtk.RadioMenuItem() interp_nearest.set_label(_("Nearest Neighbour (fast)").encode('utf-8')) interp_nearest.connect("activate", lambda w: monitorevent.set_monitor_playback_interpolation("nearest")) interp_menu.append(interp_nearest) interp_bilinear = Gtk.RadioMenuItem.new_with_label([interp_nearest], _("Bilinear (good)").encode('utf-8')) interp_bilinear.connect("activate", lambda w: monitorevent.set_monitor_playback_interpolation("bilinear")) interp_menu.append(interp_bilinear) interp_bicubic = Gtk.RadioMenuItem.new_with_label([interp_nearest], _("Bicubic (better)").encode('utf-8')) interp_bicubic.set_active(True) interp_bicubic.connect("activate", lambda w: monitorevent.set_monitor_playback_interpolation("bicubic")) interp_menu.append(interp_bicubic) interp_hyper = Gtk.RadioMenuItem.new_with_label([interp_nearest], _("Hyper/Lanczos (best)").encode('utf-8')) interp_hyper.connect("activate", lambda w: monitorevent.set_monitor_playback_interpolation("hyper")) interp_menu.append(interp_hyper) interp_menu_item.set_submenu(interp_menu) menu.append(interp_menu_item) sep = Gtk.SeparatorMenuItem() menu.append(sep) zoom_in_menu_item = Gtk.MenuItem(_("Zoom In").encode('utf-8')) zoom_in_menu_item.connect("activate", lambda w: updater.zoom_in()) menu.append(zoom_in_menu_item) zoom_out_menu_item = Gtk.MenuItem(_("Zoom Out").encode('utf-8')) zoom_out_menu_item.connect("activate", lambda w: updater.zoom_out()) menu.append(zoom_out_menu_item) zoom_fit_menu_item = Gtk.MenuItem(_("Zoom Fit").encode('utf-8')) zoom_fit_menu_item.connect("activate", lambda w: updater.zoom_project_length()) menu.append(zoom_fit_menu_item)
def __init__(self): GObject.GObject.__init__(self) self.set_title(_("Titler")) self.connect("delete-event", lambda w, e:close_titler()) if editorstate.screen_size_small_height() == True: global TEXT_LAYER_LIST_HEIGHT, TEXT_VIEW_HEIGHT, VIEW_EDITOR_HEIGHT TEXT_LAYER_LIST_HEIGHT = 150 TEXT_VIEW_HEIGHT = 180 VIEW_EDITOR_HEIGHT = 450 if editorstate.screen_size_small_height() == True: global VIEW_EDITOR_WIDTH VIEW_EDITOR_WIDTH = 680 self.block_updates = False self.view_editor = vieweditor.ViewEditor(PLAYER().profile, VIEW_EDITOR_WIDTH, VIEW_EDITOR_HEIGHT) self.view_editor.active_layer_changed_listener = self.active_layer_changed self.guides_toggle = vieweditor.GuidesViewToggle(self.view_editor) add_b = Gtk.Button(_("Add")) del_b = Gtk.Button(_("Delete")) add_b.connect("clicked", lambda w:self._add_layer_pressed()) del_b.connect("clicked", lambda w:self._del_layer_pressed()) add_del_box = Gtk.HBox() add_del_box = Gtk.HBox(True,1) add_del_box.pack_start(add_b, True, True, 0) add_del_box.pack_start(del_b, True, True, 0) center_h_icon = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "center_horizontal.png") center_v_icon = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "center_vertical.png") center_h = Gtk.Button() center_h.set_image(center_h_icon) center_h.connect("clicked", lambda w:self._center_h_pressed()) center_v = Gtk.Button() center_v.set_image(center_v_icon) center_v.connect("clicked", lambda w:self._center_v_pressed()) self.layer_list = TextLayerListView(self._layer_selection_changed, self._layer_visibility_toggled) self.layer_list.set_size_request(TEXT_LAYER_LIST_WIDTH, TEXT_LAYER_LIST_HEIGHT) self.text_view = Gtk.TextView() self.text_view.set_pixels_above_lines(2) self.text_view.set_left_margin(2) self.text_view.get_buffer().connect("changed", self._text_changed) self.sw = Gtk.ScrolledWindow() self.sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.ALWAYS) self.sw.add(self.text_view) self.sw.set_size_request(TEXT_VIEW_WIDTH, TEXT_VIEW_HEIGHT) scroll_frame = Gtk.Frame() scroll_frame.add(self.sw) self.tc_display = guicomponents.MonitorTCDisplay() self.tc_display.use_internal_frame = True self.tc_display.widget.set_valign(Gtk.Align.CENTER) self.pos_bar = positionbar.PositionBar() self.pos_bar.set_listener(self.position_listener) self.pos_bar.update_display_from_producer(PLAYER().producer) self.pos_bar.mouse_release_listener = self.pos_bar_mouse_released pos_bar_frame = Gtk.Frame() pos_bar_frame.add(self.pos_bar.widget) pos_bar_frame.set_shadow_type(Gtk.ShadowType.ETCHED_IN) pos_bar_frame.set_valign(Gtk.Align.CENTER) font_map = PangoCairo.font_map_get_default() unsorted_families = font_map.list_families() if len(unsorted_families) == 0: print "No font families found in system! Titler will not work." self.font_families = sorted(unsorted_families, key=lambda family: family.get_name()) self.font_family_indexes_for_name = {} combo = Gtk.ComboBoxText() indx = 0 for family in self.font_families: combo.append_text(family.get_name()) self.font_family_indexes_for_name[family.get_name()] = indx indx += 1 combo.set_active(0) self.font_select = combo self.font_select.connect("changed", self._edit_value_changed) adj = Gtk.Adjustment(float(DEFAULT_FONT_SIZE), float(1), float(300), float(1)) self.size_spin = Gtk.SpinButton() self.size_spin.set_adjustment(adj) self.size_spin.connect("changed", self._edit_value_changed) self.size_spin.connect("key-press-event", self._key_pressed_on_widget) font_main_row = Gtk.HBox() font_main_row.pack_start(self.font_select, True, True, 0) font_main_row.pack_start(guiutils.pad_label(5, 5), False, False, 0) font_main_row.pack_start(self.size_spin, False, False, 0) self.bold_font = Gtk.ToggleButton() self.italic_font = Gtk.ToggleButton() bold_icon = Gtk.Image.new_from_stock(Gtk.STOCK_BOLD, Gtk.IconSize.BUTTON) italic_icon = Gtk.Image.new_from_stock(Gtk.STOCK_ITALIC, Gtk.IconSize.BUTTON) self.bold_font.set_image(bold_icon) self.italic_font.set_image(italic_icon) self.bold_font.connect("clicked", self._edit_value_changed) self.italic_font.connect("clicked", self._edit_value_changed) self.left_align = Gtk.RadioButton(None) self.center_align = Gtk.RadioButton.new_from_widget(self.left_align) self.right_align = Gtk.RadioButton.new_from_widget(self.left_align) left_icon = Gtk.Image.new_from_stock(Gtk.STOCK_JUSTIFY_LEFT, Gtk.IconSize.BUTTON) center_icon = Gtk.Image.new_from_stock(Gtk.STOCK_JUSTIFY_CENTER, Gtk.IconSize.BUTTON) right_icon = Gtk.Image.new_from_stock(Gtk.STOCK_JUSTIFY_RIGHT, Gtk.IconSize.BUTTON) self.left_align.set_image(left_icon) self.center_align.set_image(center_icon) self.right_align.set_image(right_icon) self.left_align.set_mode(False) self.center_align.set_mode(False) self.right_align.set_mode(False) self.left_align.connect("clicked", self._edit_value_changed) self.center_align.connect("clicked", self._edit_value_changed) self.right_align.connect("clicked", self._edit_value_changed) self.color_button = Gtk.ColorButton.new_with_rgba(Gdk.RGBA(red=1.0, green=1.0, blue=1.0, alpha=1.0)) self.color_button.connect("color-set", self._edit_value_changed) buttons_box = Gtk.HBox() buttons_box.pack_start(Gtk.Label(), True, True, 0) buttons_box.pack_start(self.bold_font, False, False, 0) buttons_box.pack_start(self.italic_font, False, False, 0) buttons_box.pack_start(guiutils.pad_label(5, 5), False, False, 0) buttons_box.pack_start(self.left_align, False, False, 0) buttons_box.pack_start(self.center_align, False, False, 0) buttons_box.pack_start(self.right_align, False, False, 0) buttons_box.pack_start(guiutils.pad_label(5, 5), False, False, 0) buttons_box.pack_start(self.color_button, False, False, 0) buttons_box.pack_start(Gtk.Label(), True, True, 0) load_layers = Gtk.Button(_("Load Layers")) load_layers.connect("clicked", lambda w:self._load_layers_pressed()) save_layers = Gtk.Button(_("Save Layers")) save_layers.connect("clicked", lambda w:self._save_layers_pressed()) clear_layers = Gtk.Button(_("Clear All")) clear_layers.connect("clicked", lambda w:self._clear_layers_pressed()) layers_save_buttons_row = Gtk.HBox() layers_save_buttons_row.pack_start(save_layers, False, False, 0) layers_save_buttons_row.pack_start(load_layers, False, False, 0) layers_save_buttons_row.pack_start(Gtk.Label(), True, True, 0) adj = Gtk.Adjustment(float(0), float(0), float(3000), float(1)) self.x_pos_spin = Gtk.SpinButton() self.x_pos_spin.set_adjustment(adj) self.x_pos_spin.connect("changed", self._position_value_changed) self.x_pos_spin.connect("key-press-event", self._key_pressed_on_widget) adj = Gtk.Adjustment(float(0), float(0), float(3000), float(1)) self.y_pos_spin = Gtk.SpinButton() self.y_pos_spin.set_adjustment(adj) self.y_pos_spin.connect("changed", self._position_value_changed) self.y_pos_spin.connect("key-press-event", self._key_pressed_on_widget) adj = Gtk.Adjustment(float(0), float(0), float(3000), float(1)) self.rotation_spin = Gtk.SpinButton() self.rotation_spin.set_adjustment(adj) self.rotation_spin.connect("changed", self._position_value_changed) self.rotation_spin.connect("key-press-event", self._key_pressed_on_widget) undo_pos = Gtk.Button() undo_icon = Gtk.Image.new_from_stock(Gtk.STOCK_UNDO, Gtk.IconSize.BUTTON) undo_pos.set_image(undo_icon) next_icon = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "next_frame_s.png") prev_icon = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "prev_frame_s.png") prev_frame = Gtk.Button() prev_frame.set_image(prev_icon) prev_frame.connect("clicked", lambda w:self._prev_frame_pressed()) next_frame = Gtk.Button() next_frame.set_image(next_icon) next_frame.connect("clicked", lambda w:self._next_frame_pressed()) self.scale_selector = vieweditor.ScaleSelector(self) timeline_box = Gtk.HBox() timeline_box.pack_start(self.tc_display.widget, False, False, 0) timeline_box.pack_start(guiutils.pad_label(12, 12), False, False, 0) timeline_box.pack_start(pos_bar_frame, True, True, 0) timeline_box.pack_start(guiutils.pad_label(12, 12), False, False, 0) timeline_box.pack_start(prev_frame, False, False, 0) timeline_box.pack_start(next_frame, False, False, 0) timeline_box.pack_start(self.guides_toggle, False, False, 0) timeline_box.pack_start(self.scale_selector, False, False, 0) timeline_box.set_margin_top(6) timeline_box.set_margin_bottom(6) positions_box = Gtk.HBox() positions_box.pack_start(Gtk.Label(), True, True, 0) positions_box.pack_start(Gtk.Label(label="X:"), False, False, 0) positions_box.pack_start(self.x_pos_spin, False, False, 0) positions_box.pack_start(guiutils.pad_label(40, 5), False, False, 0) positions_box.pack_start(Gtk.Label(label="Y:"), False, False, 0) positions_box.pack_start(self.y_pos_spin, False, False, 0) #positions_box.pack_start(Gtk.Label(label=_("Angle")), False, False, 0) #positions_box.pack_start(self.rotation_spin, False, False, 0) positions_box.pack_start(guiutils.pad_label(40, 5), False, False, 0) positions_box.pack_start(center_h, False, False, 0) positions_box.pack_start(center_v, False, False, 0) positions_box.pack_start(Gtk.Label(), True, True, 0) controls_panel_1 = Gtk.VBox() controls_panel_1.pack_start(add_del_box, False, False, 0) controls_panel_1.pack_start(self.layer_list, False, False, 0) controls_panel_1.pack_start(layers_save_buttons_row, False, False, 0) controls_panel_2 = Gtk.VBox() controls_panel_2.pack_start(scroll_frame, True, True, 0) controls_panel_2.pack_start(font_main_row, False, False, 0) controls_panel_2.pack_start(buttons_box, False, False, 0) controls_panel = Gtk.VBox() controls_panel.pack_start(guiutils.get_named_frame(_("Active Layer"),controls_panel_2), True, True, 0) controls_panel.pack_start(guiutils.get_named_frame(_("Layers"),controls_panel_1), False, False, 0) view_editor_editor_buttons_row = Gtk.HBox() view_editor_editor_buttons_row.pack_start(positions_box, False, False, 0) view_editor_editor_buttons_row.pack_start(Gtk.Label(), True, True, 0) keep_label = Gtk.Label(label=_("Keep Layers When Closed")) self.keep_layers_check = Gtk.CheckButton() self.keep_layers_check.set_active(_keep_titler_data) self.keep_layers_check.connect("toggled", self._keep_layers_toggled) open_label = Gtk.Label(label=_("Open Saved Title In Bin")) self.open_in_current_check = Gtk.CheckButton() self.open_in_current_check.set_active(_open_saved_in_bin) self.open_in_current_check.connect("toggled", self._open_saved_in_bin) exit_b = guiutils.get_sized_button(_("Close"), 150, 32) exit_b.connect("clicked", lambda w:close_titler()) save_titles_b = guiutils.get_sized_button(_("Save Title Graphic"), 150, 32) save_titles_b.connect("clicked", lambda w:self._save_title_pressed()) editor_buttons_row = Gtk.HBox() editor_buttons_row.pack_start(Gtk.Label(), True, True, 0) editor_buttons_row.pack_start(keep_label, False, False, 0) editor_buttons_row.pack_start(self.keep_layers_check, False, False, 0) editor_buttons_row.pack_start(guiutils.pad_label(24, 2), False, False, 0) editor_buttons_row.pack_start(open_label, False, False, 0) editor_buttons_row.pack_start(self.open_in_current_check, False, False, 0) editor_buttons_row.pack_start(guiutils.pad_label(24, 2), False, False, 0) editor_buttons_row.pack_start(exit_b, False, False, 0) editor_buttons_row.pack_start(save_titles_b, False, False, 0) editor_panel = Gtk.VBox() editor_panel.pack_start(self.view_editor, True, True, 0) editor_panel.pack_start(timeline_box, False, False, 0) editor_panel.pack_start(guiutils.get_in_centering_alignment(view_editor_editor_buttons_row), False, False, 0) editor_panel.pack_start(guiutils.pad_label(2, 24), True, True, 0) editor_panel.pack_start(editor_buttons_row, False, False, 0) editor_row = Gtk.HBox() editor_row.pack_start(controls_panel, False, False, 0) editor_row.pack_start(editor_panel, True, True, 0) alignment = guiutils.set_margins(editor_row, 8,8,8,8) self.add(alignment) self.layer_list.fill_data_model() self._update_gui_with_active_layer_data() self.show_all() self.connect("size-allocate", lambda w, e:self.window_resized()) self.connect("window-state-event", lambda w, e:self.window_resized())
def __init__(self, kf_editor, property_editor_widgets_create_func, value_labels ): # kf_editor is keyframeeditor.RotoMaskKeyFrameEditor GObject.GObject.__init__(self) self.set_modal(True) self.set_transient_for(gui.editor_window.window) self.set_title(_("RotoMaskEditor")) self.connect("delete-event", lambda w, e: close_rotomask()) if editorstate.screen_size_small_height() == True: global TEXT_LAYER_LIST_HEIGHT, TEXT_VIEW_HEIGHT, VIEW_EDITOR_HEIGHT TEXT_LAYER_LIST_HEIGHT = 150 TEXT_VIEW_HEIGHT = 180 VIEW_EDITOR_HEIGHT = 450 if editorstate.screen_size_small_height() == True: global VIEW_EDITOR_WIDTH VIEW_EDITOR_WIDTH = 680 editor_widgets = property_editor_widgets_create_func() self.block_updates = False self.mask_create_freeze = False # We are not allowing user to change acrive kf when creating mask self.kf_editor = kf_editor self.kf_editor.set_parent_editor(self) # mask type param was added later, we need handle it not existing. if self.get_mask_type() == -1: self.set_mask_type(vieweditorshape.LINE_MASK) self.set_mask_type_on_init = False # but we don't want to destroy user's curve masks. THis is not complety back wards compatible stuff can get destroyed on second load. else: self.set_mask_type_on_init = True self.value_labels = value_labels self.view_editor = vieweditor.ViewEditor(PLAYER().profile, VIEW_EDITOR_WIDTH, VIEW_EDITOR_HEIGHT) self.view_editor.draw_safe_area = False self.tc_display = guicomponents.MonitorTCDisplay() self.tc_display.use_internal_frame = True self.tc_display.widget.set_valign(Gtk.Align.CENTER) kf_mode_img = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "roto_kf_edit_mode.png") move_mode_img = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "roto_move_mode.png") self.kf_mode_button = Gtk.ToggleButton() self.kf_mode_button.set_image(kf_mode_img) self.kf_mode_button.set_active( True) # we start with vieweditorlayer.ROTO_POINT_MODE edit mode self.kf_mode_button.connect("clicked", self._kf_mode_clicked) self.move_mode_button = Gtk.ToggleButton() self.move_mode_button.set_image(move_mode_img) self.move_mode_button.connect("clicked", self._move_mode_clicked) self.scale_selector = vieweditor.ScaleSelector(self) self.view_editor.scale_select = self.scale_selector timeline_box = Gtk.HBox() timeline_box.pack_start(self.tc_display.widget, False, False, 0) timeline_box.pack_start(Gtk.Label(), True, True, 0) timeline_box.pack_start(self.kf_mode_button, False, False, 0) timeline_box.pack_start(self.move_mode_button, False, False, 0) timeline_box.pack_start(Gtk.Label(), True, True, 0) timeline_box.pack_start(self.scale_selector, False, False, 0) timeline_box.set_margin_top(6) timeline_box.set_margin_bottom(6) mask_type_label = Gtk.Label(_("Mask Type:")) mask_type_combo_box = Gtk.ComboBoxText() mask_type_combo_box.append_text(_("Curve Mask")) mask_type_combo_box.append_text(_("Line Mask")) mask_type_combo_box.set_active(0) mask_type_combo_box.connect("changed", self.mask_type_selection_changed) self.mask_type_combo_box = mask_type_combo_box allow_adding_check = Gtk.CheckButton() allow_adding_check.set_active( False ) # This shows value of self.roto_mask_layer.allow_adding_points, False is default allow_adding_check.connect("toggled", self.allow_adding_toggled) allow_adding_label = Gtk.Label( _("Allow to add / delete points in closed masks")) save_rotodata_b = guiutils.get_sized_button(_("Close Tool"), 150, 32) save_rotodata_b.connect("clicked", lambda w: self._save_rotodata_pressed()) prop_editor_row1 = Gtk.HBox() prop_editor_row1.pack_start(Gtk.Label(), True, True, 0) prop_editor_row1.pack_start(mask_type_label, False, False, 0) prop_editor_row1.pack_start(guiutils.pad_label(4, 4), False, False, 0) prop_editor_row1.pack_start(mask_type_combo_box, False, False, 0) prop_editor_row1.pack_start(guiutils.pad_label(24, 20), False, False, 0) prop_editor_row1.pack_start(editor_widgets[0], False, False, 0) prop_editor_row1.pack_start(guiutils.pad_label(24, 20), False, False, 0) prop_editor_row1.pack_start(editor_widgets[3], False, False, 0) prop_editor_row1.pack_start(guiutils.pad_label(24, 20), False, False, 0) prop_editor_row1.pack_start(editor_widgets[4], False, False, 0) prop_editor_row1.pack_start(Gtk.Label(), True, True, 0) prop_editor_row2 = Gtk.HBox() prop_editor_row2.pack_start(Gtk.Label(), True, True, 0) prop_editor_row2.pack_start(editor_widgets[1], False, False, 0) prop_editor_row2.pack_start(guiutils.pad_label(24, 20), False, False, 0) prop_editor_row2.pack_start(editor_widgets[2], False, False, 0) prop_editor_row2.pack_start(Gtk.Label(), True, True, 0) editor_buttons_row = Gtk.HBox() editor_buttons_row.pack_start(allow_adding_check, False, False, 0) editor_buttons_row.pack_start(guiutils.pad_label(4, 2), False, False, 0) editor_buttons_row.pack_start(allow_adding_label, False, False, 0) editor_buttons_row.pack_start(Gtk.Label(), True, True, 0) editor_buttons_row.pack_start(save_rotodata_b, False, False, 0) editor_panel = Gtk.VBox() editor_panel.pack_start(self.view_editor, True, True, 0) editor_panel.pack_start(timeline_box, False, False, 0) editor_panel.pack_start(kf_editor, False, False, 0) editor_panel.pack_start(guiutils.pad_label(2, 12), False, False, 0) editor_panel.pack_start(prop_editor_row1, False, False, 0) editor_panel.pack_start(guiutils.pad_label(2, 12), False, False, 0) editor_panel.pack_start(prop_editor_row2, False, False, 0) editor_panel.pack_start(guiutils.pad_label(2, 12), False, False, 0) editor_panel.pack_start(editor_buttons_row, False, False, 0) editor_row = Gtk.HBox() editor_row.pack_start(editor_panel, True, True, 0) alignment = guiutils.set_margins(editor_row, 8, 8, 8, 8) self.add(alignment) self.view_editor.clear_layers() # NOTE: we start with vieweditorlayer.ROTO_POINT_MODE edit mode, see __init()__ self.roto_mask_layer = vieweditorlayer.RotoMaskEditLayer( self.view_editor, self.kf_editor.clip_editor, kf_editor.editable_property, self) self.view_editor.add_layer(self.roto_mask_layer) self.view_editor.activate_layer(0) self.show_all() self.kf_editor.active_keyframe_changed() self.connect("size-allocate", lambda w, e: self.window_resized()) self.connect("window-state-event", lambda w, e: self.window_resized()) self.connect("key-press-event", self.key_down) self.window_resized() self.kf_editor.clip_editor.maybe_set_first_kf_in_clip_area_active() self.update_mask_create_freeze_gui()
def __init__(self): GObject.GObject.__init__(self) self.set_title(_("Titler")) self.connect("delete-event", lambda w, e: close_titler()) if editorstate.screen_size_small_height() == True: global TEXT_LAYER_LIST_HEIGHT, TEXT_VIEW_HEIGHT, VIEW_EDITOR_HEIGHT TEXT_LAYER_LIST_HEIGHT = 150 TEXT_VIEW_HEIGHT = 180 VIEW_EDITOR_HEIGHT = 450 if editorstate.screen_size_small_height() == True: global VIEW_EDITOR_WIDTH VIEW_EDITOR_WIDTH = 680 self.block_updates = False self.view_editor = vieweditor.ViewEditor(PLAYER().profile, VIEW_EDITOR_WIDTH, VIEW_EDITOR_HEIGHT) self.view_editor.active_layer_changed_listener = self.active_layer_changed self.guides_toggle = vieweditor.GuidesViewToggle(self.view_editor) add_b = Gtk.Button(_("Add")) del_b = Gtk.Button(_("Delete")) add_b.connect("clicked", lambda w: self._add_layer_pressed()) del_b.connect("clicked", lambda w: self._del_layer_pressed()) add_del_box = Gtk.HBox() add_del_box = Gtk.HBox(True, 1) add_del_box.pack_start(add_b, True, True, 0) add_del_box.pack_start(del_b, True, True, 0) center_h_icon = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "center_horizontal.png") center_v_icon = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "center_vertical.png") center_h = Gtk.Button() center_h.set_image(center_h_icon) center_h.connect("clicked", lambda w: self._center_h_pressed()) center_v = Gtk.Button() center_v.set_image(center_v_icon) center_v.connect("clicked", lambda w: self._center_v_pressed()) self.layer_list = TextLayerListView(self._layer_selection_changed, self._layer_visibility_toggled) self.layer_list.set_size_request(TEXT_LAYER_LIST_WIDTH, TEXT_LAYER_LIST_HEIGHT) self.text_view = Gtk.TextView() self.text_view.set_pixels_above_lines(2) self.text_view.set_left_margin(2) self.text_view.get_buffer().connect("changed", self._text_changed) self.sw = Gtk.ScrolledWindow() self.sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.ALWAYS) self.sw.add(self.text_view) self.sw.set_size_request(TEXT_VIEW_WIDTH, TEXT_VIEW_HEIGHT) scroll_frame = Gtk.Frame() scroll_frame.add(self.sw) self.tc_display = guicomponents.MonitorTCDisplay() self.tc_display.use_internal_frame = True self.tc_display.widget.set_valign(Gtk.Align.CENTER) self.pos_bar = positionbar.PositionBar() self.pos_bar.set_listener(self.position_listener) self.pos_bar.update_display_from_producer(PLAYER().producer) self.pos_bar.mouse_release_listener = self.pos_bar_mouse_released pos_bar_frame = Gtk.Frame() pos_bar_frame.add(self.pos_bar.widget) pos_bar_frame.set_shadow_type(Gtk.ShadowType.ETCHED_IN) pos_bar_frame.set_valign(Gtk.Align.CENTER) font_map = PangoCairo.font_map_get_default() unsorted_families = font_map.list_families() if len(unsorted_families) == 0: print "No font families found in system! Titler will not work." self.font_families = sorted(unsorted_families, key=lambda family: family.get_name()) self.font_family_indexes_for_name = {} combo = Gtk.ComboBoxText() indx = 0 for family in self.font_families: combo.append_text(family.get_name()) self.font_family_indexes_for_name[family.get_name()] = indx indx += 1 combo.set_active(0) self.font_select = combo self.font_select.connect("changed", self._edit_value_changed) adj = Gtk.Adjustment(float(DEFAULT_FONT_SIZE), float(1), float(300), float(1)) self.size_spin = Gtk.SpinButton() self.size_spin.set_adjustment(adj) self.size_spin.connect("changed", self._edit_value_changed) self.size_spin.connect("key-press-event", self._key_pressed_on_widget) font_main_row = Gtk.HBox() font_main_row.pack_start(self.font_select, True, True, 0) font_main_row.pack_start(guiutils.pad_label(5, 5), False, False, 0) font_main_row.pack_start(self.size_spin, False, False, 0) self.bold_font = Gtk.ToggleButton() self.italic_font = Gtk.ToggleButton() bold_icon = Gtk.Image.new_from_stock(Gtk.STOCK_BOLD, Gtk.IconSize.BUTTON) italic_icon = Gtk.Image.new_from_stock(Gtk.STOCK_ITALIC, Gtk.IconSize.BUTTON) self.bold_font.set_image(bold_icon) self.italic_font.set_image(italic_icon) self.bold_font.connect("clicked", self._edit_value_changed) self.italic_font.connect("clicked", self._edit_value_changed) self.left_align = Gtk.RadioButton(None) self.center_align = Gtk.RadioButton.new_from_widget(self.left_align) self.right_align = Gtk.RadioButton.new_from_widget(self.left_align) left_icon = Gtk.Image.new_from_stock(Gtk.STOCK_JUSTIFY_LEFT, Gtk.IconSize.BUTTON) center_icon = Gtk.Image.new_from_stock(Gtk.STOCK_JUSTIFY_CENTER, Gtk.IconSize.BUTTON) right_icon = Gtk.Image.new_from_stock(Gtk.STOCK_JUSTIFY_RIGHT, Gtk.IconSize.BUTTON) self.left_align.set_image(left_icon) self.center_align.set_image(center_icon) self.right_align.set_image(right_icon) self.left_align.set_mode(False) self.center_align.set_mode(False) self.right_align.set_mode(False) self.left_align.connect("clicked", self._edit_value_changed) self.center_align.connect("clicked", self._edit_value_changed) self.right_align.connect("clicked", self._edit_value_changed) self.color_button = Gtk.ColorButton.new_with_rgba( Gdk.RGBA(red=1.0, green=1.0, blue=1.0, alpha=1.0)) self.color_button.connect("color-set", self._edit_value_changed) buttons_box = Gtk.HBox() buttons_box.pack_start(Gtk.Label(), True, True, 0) buttons_box.pack_start(self.bold_font, False, False, 0) buttons_box.pack_start(self.italic_font, False, False, 0) buttons_box.pack_start(guiutils.pad_label(5, 5), False, False, 0) buttons_box.pack_start(self.left_align, False, False, 0) buttons_box.pack_start(self.center_align, False, False, 0) buttons_box.pack_start(self.right_align, False, False, 0) buttons_box.pack_start(guiutils.pad_label(5, 5), False, False, 0) buttons_box.pack_start(self.color_button, False, False, 0) buttons_box.pack_start(Gtk.Label(), True, True, 0) load_layers = Gtk.Button(_("Load Layers")) load_layers.connect("clicked", lambda w: self._load_layers_pressed()) save_layers = Gtk.Button(_("Save Layers")) save_layers.connect("clicked", lambda w: self._save_layers_pressed()) clear_layers = Gtk.Button(_("Clear All")) clear_layers.connect("clicked", lambda w: self._clear_layers_pressed()) layers_save_buttons_row = Gtk.HBox() layers_save_buttons_row.pack_start(save_layers, False, False, 0) layers_save_buttons_row.pack_start(load_layers, False, False, 0) layers_save_buttons_row.pack_start(Gtk.Label(), True, True, 0) adj = Gtk.Adjustment(float(0), float(0), float(3000), float(1)) self.x_pos_spin = Gtk.SpinButton() self.x_pos_spin.set_adjustment(adj) self.x_pos_spin.connect("changed", self._position_value_changed) self.x_pos_spin.connect("key-press-event", self._key_pressed_on_widget) adj = Gtk.Adjustment(float(0), float(0), float(3000), float(1)) self.y_pos_spin = Gtk.SpinButton() self.y_pos_spin.set_adjustment(adj) self.y_pos_spin.connect("changed", self._position_value_changed) self.y_pos_spin.connect("key-press-event", self._key_pressed_on_widget) adj = Gtk.Adjustment(float(0), float(0), float(3000), float(1)) self.rotation_spin = Gtk.SpinButton() self.rotation_spin.set_adjustment(adj) self.rotation_spin.connect("changed", self._position_value_changed) self.rotation_spin.connect("key-press-event", self._key_pressed_on_widget) undo_pos = Gtk.Button() undo_icon = Gtk.Image.new_from_stock(Gtk.STOCK_UNDO, Gtk.IconSize.BUTTON) undo_pos.set_image(undo_icon) next_icon = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "next_frame_s.png") prev_icon = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "prev_frame_s.png") prev_frame = Gtk.Button() prev_frame.set_image(prev_icon) prev_frame.connect("clicked", lambda w: self._prev_frame_pressed()) next_frame = Gtk.Button() next_frame.set_image(next_icon) next_frame.connect("clicked", lambda w: self._next_frame_pressed()) self.scale_selector = vieweditor.ScaleSelector(self) timeline_box = Gtk.HBox() timeline_box.pack_start(self.tc_display.widget, False, False, 0) timeline_box.pack_start(guiutils.pad_label(12, 12), False, False, 0) timeline_box.pack_start(pos_bar_frame, True, True, 0) timeline_box.pack_start(guiutils.pad_label(12, 12), False, False, 0) timeline_box.pack_start(prev_frame, False, False, 0) timeline_box.pack_start(next_frame, False, False, 0) timeline_box.pack_start(self.guides_toggle, False, False, 0) timeline_box.pack_start(self.scale_selector, False, False, 0) timeline_box.set_margin_top(6) timeline_box.set_margin_bottom(6) positions_box = Gtk.HBox() positions_box.pack_start(Gtk.Label(), True, True, 0) positions_box.pack_start(Gtk.Label(label="X:"), False, False, 0) positions_box.pack_start(self.x_pos_spin, False, False, 0) positions_box.pack_start(guiutils.pad_label(40, 5), False, False, 0) positions_box.pack_start(Gtk.Label(label="Y:"), False, False, 0) positions_box.pack_start(self.y_pos_spin, False, False, 0) #positions_box.pack_start(Gtk.Label(label=_("Angle")), False, False, 0) #positions_box.pack_start(self.rotation_spin, False, False, 0) positions_box.pack_start(guiutils.pad_label(40, 5), False, False, 0) positions_box.pack_start(center_h, False, False, 0) positions_box.pack_start(center_v, False, False, 0) positions_box.pack_start(Gtk.Label(), True, True, 0) controls_panel_1 = Gtk.VBox() controls_panel_1.pack_start(add_del_box, False, False, 0) controls_panel_1.pack_start(self.layer_list, False, False, 0) controls_panel_1.pack_start(layers_save_buttons_row, False, False, 0) controls_panel_2 = Gtk.VBox() controls_panel_2.pack_start(scroll_frame, True, True, 0) controls_panel_2.pack_start(font_main_row, False, False, 0) controls_panel_2.pack_start(buttons_box, False, False, 0) controls_panel = Gtk.VBox() controls_panel.pack_start( guiutils.get_named_frame(_("Active Layer"), controls_panel_2), True, True, 0) controls_panel.pack_start( guiutils.get_named_frame(_("Layers"), controls_panel_1), False, False, 0) view_editor_editor_buttons_row = Gtk.HBox() view_editor_editor_buttons_row.pack_start(positions_box, False, False, 0) view_editor_editor_buttons_row.pack_start(Gtk.Label(), True, True, 0) keep_label = Gtk.Label(label=_("Keep Layers When Closed")) self.keep_layers_check = Gtk.CheckButton() self.keep_layers_check.set_active(_keep_titler_data) self.keep_layers_check.connect("toggled", self._keep_layers_toggled) open_label = Gtk.Label(label=_("Open Saved Title In Bin")) self.open_in_current_check = Gtk.CheckButton() self.open_in_current_check.set_active(_open_saved_in_bin) self.open_in_current_check.connect("toggled", self._open_saved_in_bin) exit_b = guiutils.get_sized_button(_("Close"), 150, 32) exit_b.connect("clicked", lambda w: close_titler()) save_titles_b = guiutils.get_sized_button(_("Save Title Graphic"), 150, 32) save_titles_b.connect("clicked", lambda w: self._save_title_pressed()) editor_buttons_row = Gtk.HBox() editor_buttons_row.pack_start(Gtk.Label(), True, True, 0) editor_buttons_row.pack_start(keep_label, False, False, 0) editor_buttons_row.pack_start(self.keep_layers_check, False, False, 0) editor_buttons_row.pack_start(guiutils.pad_label(24, 2), False, False, 0) editor_buttons_row.pack_start(open_label, False, False, 0) editor_buttons_row.pack_start(self.open_in_current_check, False, False, 0) editor_buttons_row.pack_start(guiutils.pad_label(24, 2), False, False, 0) editor_buttons_row.pack_start(exit_b, False, False, 0) editor_buttons_row.pack_start(save_titles_b, False, False, 0) editor_panel = Gtk.VBox() editor_panel.pack_start(self.view_editor, True, True, 0) editor_panel.pack_start(timeline_box, False, False, 0) editor_panel.pack_start( guiutils.get_in_centering_alignment( view_editor_editor_buttons_row), False, False, 0) editor_panel.pack_start(guiutils.pad_label(2, 24), True, True, 0) editor_panel.pack_start(editor_buttons_row, False, False, 0) editor_row = Gtk.HBox() editor_row.pack_start(controls_panel, False, False, 0) editor_row.pack_start(editor_panel, True, True, 0) alignment = guiutils.set_margins(editor_row, 8, 8, 8, 8) self.add(alignment) self.layer_list.fill_data_model() self._update_gui_with_active_layer_data() self.show_all() self.connect("size-allocate", lambda w, e: self.window_resized()) self.connect("window-state-event", lambda w, e: self.window_resized())
def _init_view_menu(self, menu_item): menu_item.set_submenu(None) menu = Gtk.Menu() mb_menu_item = Gtk.MenuItem(_("Middlebar Layout").encode('utf-8')) mb_menu = Gtk.Menu() tc_left = Gtk.RadioMenuItem() tc_left.set_label(_("Timecode Left").encode('utf-8')) tc_left.set_active(True) tc_left.connect("activate", lambda w: middlebar._show_buttons_TC_LEFT_layout(w)) mb_menu.append(tc_left) tc_middle = Gtk.RadioMenuItem.new_with_label([tc_left], _("Timecode Center").encode('utf-8')) tc_middle.connect("activate", lambda w: middlebar._show_buttons_TC_MIDDLE_layout(w)) mb_menu.append(tc_middle) if editorpersistance.prefs.midbar_tc_left == True: tc_left.set_active(True) else: tc_middle.set_active(True) mb_menu_item.set_submenu(mb_menu) menu.append(mb_menu_item) tabs_menu_item = Gtk.MenuItem(_("Tabs Position").encode('utf-8')) tabs_menu = Gtk.Menu() tabs_up = Gtk.RadioMenuItem() tabs_up.set_label( _("Up").encode('utf-8')) tabs_up.connect("activate", lambda w: self._show_tabs_up(w)) tabs_menu.append(tabs_up) tabs_down = Gtk.RadioMenuItem.new_with_label([tabs_up], _("Down").encode('utf-8')) tabs_down.connect("activate", lambda w: self._show_tabs_down(w)) if editorpersistance.prefs.tabs_on_top == True: tabs_up.set_active(True) else: tabs_down.set_active(True) tabs_menu.append(tabs_down) tabs_menu_item.set_submenu(tabs_menu) menu.append(tabs_menu_item) sep = Gtk.SeparatorMenuItem() menu.append(sep) if not (editorstate.screen_size_small_height() == True or editorstate.screen_size_small_height() == True): show_monitor_info_item = Gtk.CheckMenuItem(_("Show Monitor Sequence Profile").encode('utf-8')) show_monitor_info_item.set_active(editorpersistance.prefs.show_sequence_profile) show_monitor_info_item.connect("toggled", lambda w: middlebar._show_monitor_info_toggled(w)) menu.append(show_monitor_info_item) show_vu_item = Gtk.CheckMenuItem(_("Show Master Volume Meter").encode('utf-8')) show_vu_item.set_active(editorpersistance.prefs.show_vu_meter) show_vu_item.connect("toggled", lambda w: self._show_vu_meter(w)) menu.append(show_vu_item) sep = Gtk.SeparatorMenuItem() menu.append(sep) interp_menu_item = Gtk.MenuItem(_("Monitor Playback Interpolation").encode('utf-8')) interp_menu = Gtk.Menu() interp_nearest = Gtk.RadioMenuItem() interp_nearest.set_label(_("Nearest Neighbour (fast)").encode('utf-8')) interp_nearest.connect("activate", lambda w: monitorevent.set_monitor_playback_interpolation("nearest")) interp_menu.append(interp_nearest) interp_bilinear = Gtk.RadioMenuItem.new_with_label([interp_nearest], _("Bilinear (good)").encode('utf-8')) interp_bilinear.connect("activate", lambda w: monitorevent.set_monitor_playback_interpolation("bilinear")) interp_menu.append(interp_bilinear) interp_bicubic = Gtk.RadioMenuItem.new_with_label([interp_nearest], _("Bicubic (better)").encode('utf-8')) interp_bicubic.set_active(True) interp_bicubic.connect("activate", lambda w: monitorevent.set_monitor_playback_interpolation("bicubic")) interp_menu.append(interp_bicubic) interp_hyper = Gtk.RadioMenuItem.new_with_label([interp_nearest], _("Hyper/Lanczos (best)").encode('utf-8')) interp_hyper.connect("activate", lambda w: monitorevent.set_monitor_playback_interpolation("hyper")) interp_menu.append(interp_hyper) interp_menu_item.set_submenu(interp_menu) menu.append(interp_menu_item) sep = Gtk.SeparatorMenuItem() menu.append(sep) zoom_in_menu_item = Gtk.MenuItem(_("Zoom In").encode('utf-8')) zoom_in_menu_item.connect("activate", lambda w: updater.zoom_in()) menu.append(zoom_in_menu_item) zoom_out_menu_item = Gtk.MenuItem(_("Zoom Out").encode('utf-8')) zoom_out_menu_item.connect("activate", lambda w: updater.zoom_out()) menu.append(zoom_out_menu_item) zoom_fit_menu_item = Gtk.MenuItem(_("Zoom Fit").encode('utf-8')) zoom_fit_menu_item.connect("activate", lambda w: updater.zoom_project_length()) menu.append(zoom_fit_menu_item) menu_item.set_submenu(menu)
def main(root_path): """ Called at application start. Initializes application with a default project. """ # Print OS, Python version and GTK+ version try: os_release_file = open("/etc/os-release","r") os_text = os_release_file.read() s_index = os_text.find("PRETTY_NAME=") e_index = os_text.find("\n", s_index) print "OS: " + os_text[s_index + 13:e_index - 1] except: pass print "Python", sys.version gtk_version = "%s.%s.%s" % (Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version()) print "GTK+ version:", gtk_version editorstate.gtk_version = gtk_version try: editorstate.mlt_version = mlt.LIBMLT_VERSION except: editorstate.mlt_version = "0.0.99" # magic string for "not found" # passing -xdg as a flag will change the user_dir location with XDG_CONFIG_HOME # For full xdg-app support all the launch processes need to add this too, currently not impl. for arg in sys.argv: if arg.lower() == "-xdg": editorstate.use_xdg = True # Create hidden folders if not present user_dir = utils.get_hidden_user_dir_path() print "User dir:",user_dir if not os.path.exists(user_dir): os.mkdir(user_dir) if not os.path.exists(user_dir + mltprofiles.USER_PROFILES_DIR): os.mkdir(user_dir + mltprofiles.USER_PROFILES_DIR) if not os.path.exists(user_dir + AUTOSAVE_DIR): os.mkdir(user_dir + AUTOSAVE_DIR) if not os.path.exists(user_dir + BATCH_DIR): os.mkdir(user_dir + BATCH_DIR) if not os.path.exists(user_dir + appconsts.AUDIO_LEVELS_DIR): os.mkdir(user_dir + appconsts.AUDIO_LEVELS_DIR) if not os.path.exists(utils.get_hidden_screenshot_dir_path()): os.mkdir(utils.get_hidden_screenshot_dir_path()) if not os.path.exists(user_dir + appconsts.GMIC_DIR): os.mkdir(user_dir + appconsts.GMIC_DIR) # Set paths. respaths.set_paths(root_path) # Load editor prefs and list of recent projects editorpersistance.load() if editorpersistance.prefs.dark_theme == True: respaths.apply_dark_theme() if editorpersistance.prefs.display_all_audio_levels == False: editorstate.display_all_audio_levels = False editorpersistance.create_thumbs_folder_if_needed(user_dir) editorpersistance.create_rendered_clips_folder_if_needed(user_dir) editorpersistance.save() # Init translations module with translations data translations.init_languages() translations.load_filters_translations() mlttransitions.init_module() # RHEL7/CentOS compatibility fix if gtk_version == "3.8.8": GObject.threads_init() # Init gtk threads Gdk.threads_init() Gdk.threads_enter() # Request dark them if so desired if editorpersistance.prefs.dark_theme == True: Gtk.Settings.get_default().set_property("gtk-application-prefer-dark-theme", True) # Load drag'n'drop images dnd.init() # Adjust gui parameters for smaller screens scr_w = Gdk.Screen.width() scr_h = Gdk.Screen.height() editorstate.SCREEN_WIDTH = scr_w editorstate.SCREEN_HEIGHT = scr_h print "Small height:", editorstate.screen_size_small_height() print "Small width:", editorstate.screen_size_small_width() _set_draw_params() # Refuse to run on too small screen. if scr_w < 1151 or scr_h < 767: _too_small_screen_exit() return # Splash screen if editorpersistance.prefs.display_splash_screen == True: show_splash_screen() # Init MLT framework repo = mlt.Factory().init() # Set numeric locale to use "." as radix, MLT initilizes this to OS locale and this causes bugs locale.setlocale(locale.LC_NUMERIC, 'C') # Check for codecs and formats on the system mltenv.check_available_features(repo) renderconsumer.load_render_profiles() # Load filter and compositor descriptions from xml files. mltfilters.load_filters_xml(mltenv.services) mlttransitions.load_compositors_xml(mltenv.transitions) # Replace some services if better replacements available mltfilters.replace_services(mltenv.services) # Create list of available mlt profiles mltprofiles.load_profile_list() # Launch association file if found in arguments launch_file_path = get_assoc_file_path() if launch_file_path != None: try: print "Launching assoc file:" + launch_file_path persistance.show_messages = False editorstate.project = persistance.load_project(launch_file_path) persistance.show_messages = True check_crash = False except: editorstate.project = projectdata.get_default_project() persistance.show_messages = True check_crash = True else: # There is always a project open, so at startup we create a default project. # Set default project as the project being edited. editorstate.project = projectdata.get_default_project() check_crash = True # Audiomonitoring being available needs to be known before GUI creation audiomonitoring.init(editorstate.project.profile) # Create player object create_player() # Create main window and set widget handles in gui.py for more convenient reference. create_gui() # Inits widgets with project data init_project_gui() # Inits widgets with current sequence data init_sequence_gui() # Launch player now that data and gui exist launch_player() # Editor and modules need some more initializing init_editor_state() # Tracks need to be recentered if window is resized. # Connect listener for this now that the tline panel size allocation is sure to be available. global window_resize_id, window_state_id window_resize_id = gui.editor_window.window.connect("size-allocate", lambda w, e:updater.window_resized()) window_state_id = gui.editor_window.window.connect("window-state-event", lambda w, e:updater.window_resized()) # Get existing autosave files autosave_files = get_autosave_files() # Show splash if ((editorpersistance.prefs.display_splash_screen == True) and len(autosave_files) == 0): global splash_timeout_id splash_timeout_id = GLib.timeout_add(2600, destroy_splash_screen) splash_screen.show_all() appconsts.SAVEFILE_VERSION = projectdata.SAVEFILE_VERSION # THIS IS A QUESTIONABLE IDEA TO SIMPLIFY IMPORTS, NOT DRY. WHEN DOING TOOLS THAT RUN IN ANOTHER PROCESSES AND SAVE PROJECTS, THIS LINE NEEDS TO BE THERE ALSO. # Every running instance has unique autosave file which is deleted at exit set_instance_autosave_id() # Existance of autosave file hints that program was exited abnormally if check_crash == True and len(autosave_files) > 0: if len(autosave_files) == 1: GObject.timeout_add(10, autosave_recovery_dialog) else: GObject.timeout_add(10, autosaves_many_recovery_dialog) else: start_autosave() # We prefer to monkeypatch some callbacks into some modules, usually to # maintain a simpler and/or non-circular import structure monkeypatch_callbacks() # Launch gtk+ main loop Gtk.main() Gdk.threads_leave()
def __init__(self, callback, clip, container_action, script_data_object): GObject.GObject.__init__(self) self.connect("delete-event", lambda w, e: self.cancel()) self.callback = callback self.clip = clip self.container_action = container_action self.script_data_object = copy.deepcopy(script_data_object) self.preview_frame = -1 # -1 used as flag that no preview renders ongoing and new one can be started # Create panels for objects self.editor_widgets = [] editors_list = self.script_data_object["editors_list"] for editor_data in editors_list: name, type, value = editor_data editor_type = int(type) self.editor_widgets.append( _get_editor(editor_type, name, name, value, "")) editors_v_panel = Gtk.VBox(True, 2) for w in self.editor_widgets: editors_v_panel.pack_start(w, False, False, 0) pane = Gtk.VBox(False, 2) if len(self.editor_widgets) != 0: pane.pack_start(editors_v_panel, False, False, 0) else: pane.pack_start(Gtk.Label(_("No Editors for this script")), False, False, 0) # Put in scrollpane if too many editors for screensize. n_editors = len(self.editor_widgets) add_scroll = False if editorstate.screen_size_small_height() == True and n_editors > 4: add_scroll = True h = 500 elif editorstate.screen_size_small_height( ) == True and editorstate.screen_size_large_height( ) == False and n_editors > 5: add_scroll = True h = 600 elif editorstate.screen_size_large_height() == True and n_editors > 6: add_scroll = True h = 700 if add_scroll == True: sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) sw.add(pane) sw.set_size_request(400, h) if add_scroll == True: editors_panel = sw else: editors_panel = pane cancel_b = guiutils.get_sized_button(_("Cancel"), 150, 32) cancel_b.connect("clicked", lambda w: self.cancel()) save_b = guiutils.get_sized_button(_("Save Changes"), 150, 32) save_b.connect("clicked", lambda w: self.save()) buttons_box = Gtk.HBox(False, 2) buttons_box.pack_start(Gtk.Label(), True, True, 0) buttons_box.pack_start(cancel_b, False, False, 0) buttons_box.pack_start(save_b, False, False, 0) self.preview_panel = PreviewPanel(self, clip) preview_box = Gtk.VBox(False, 2) preview_box.pack_start(self.preview_panel, True, True, 0) preview_box.pack_start(guiutils.pad_label(2, 24), False, False, 0) preview_box.pack_start(buttons_box, False, False, 0) main_box = Gtk.HBox(False, 2) main_box.pack_start( guiutils.get_named_frame(_("Editors"), editors_panel), False, False, 0) main_box.pack_start( guiutils.get_named_frame(_("Preview"), preview_box), False, False, 0) alignment = guiutils.set_margins( main_box, 8, 8, 8, 8) #dialogutils.get_default_alignment(main_box) self.set_modal(True) self.set_transient_for(gui.editor_window.window) self.set_position(Gtk.WindowPosition.CENTER) self.set_title( _("Media Plugin Values Edit - ") + self.container_action.container_data.get_program_name()) self.set_resizable(False) self.add(alignment) self.show_all()
def __init__(self, callback, clip, container_action, program_info_json): GObject.GObject.__init__(self) self.connect("delete-event", lambda w, e: self.cancel()) self.callback = callback self.clip = clip self.container_action = container_action self.orig_program_info_json = copy.deepcopy( program_info_json ) # We need to sabvre this for 'Cancel'because doing a preview updates edited values # in containeractions.BlenderContainerActions.render_blender_preview(). self.preview_frame = -1 # -1 used as flag that no preview renders ongoing and new one can be started # Create panels for objects editors = [] blender_objects = program_info_json["objects"] materials = program_info_json["materials"] curves = program_info_json["curves"] self.editors = editors objs_panel = _get_panel_and_create_editors(blender_objects, _("Objects"), editors) materials_panel = _get_panel_and_create_editors( materials, _("Materials"), editors) curves_panel = _get_panel_and_create_editors(curves, _("Curves"), editors) pane = Gtk.VBox(False, 2) if objs_panel != None: pane.pack_start(objs_panel, False, False, 0) if materials_panel != None: pane.pack_start(materials_panel, False, False, 0) if curves_panel != None: pane.pack_start(curves_panel, False, False, 0) # Put in scrollpane if too many editors for screensize. n_editors = len(editors) add_scroll = False if editorstate.screen_size_small_height() == True and n_editors > 4: add_scroll = True h = 500 elif editorstate.screen_size_small_height( ) == True and editorstate.screen_size_large_height( ) == False and n_editors > 5: add_scroll = True h = 600 elif editorstate.screen_size_large_height() == True and n_editors > 6: add_scroll = True h = 700 if add_scroll == True: sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) sw.add(pane) sw.set_size_request(400, h) if add_scroll == True: editors_panel = sw else: editors_panel = pane cancel_b = guiutils.get_sized_button(_("Cancel"), 150, 32) cancel_b.connect("clicked", lambda w: self.cancel()) save_b = guiutils.get_sized_button(_("Save Changes"), 150, 32) save_b.connect("clicked", lambda w: self.save()) buttons_box = Gtk.HBox(False, 2) buttons_box.pack_start(Gtk.Label(), True, True, 0) buttons_box.pack_start(cancel_b, False, False, 0) buttons_box.pack_start(save_b, False, False, 0) self.preview_panel = PreviewPanel(self, clip) preview_box = Gtk.VBox(False, 2) preview_box.pack_start(self.preview_panel, True, True, 0) preview_box.pack_start(guiutils.pad_label(2, 24), False, False, 0) preview_box.pack_start(buttons_box, False, False, 0) main_box = Gtk.HBox(False, 2) main_box.pack_start( guiutils.get_named_frame(_("Editors"), editors_panel), False, False, 0) main_box.pack_start( guiutils.get_named_frame(_("Preview"), preview_box), False, False, 0) alignment = guiutils.set_margins( main_box, 8, 8, 8, 8) #dialogutils.get_default_alignment(main_box) self.set_modal(True) self.set_transient_for(gui.editor_window.window) self.set_position(Gtk.WindowPosition.CENTER) self.set_title( _("Blender Project Edit - ") + self.container_action.container_data.get_program_name() + ".blend") self.set_resizable(False) self.add(alignment) self.show_all()
def show_blender_container_clip_program_editor(callback, program_info_json): # Create panels for objects editors = [] blender_objects = program_info_json["objects"] materials = program_info_json["materials"] curves = program_info_json["curves"] objs_panel = _get_panel_and_create_editors(blender_objects, _("Objects"), editors) materials_panel = _get_panel_and_create_editors(materials, _("Materials"), editors) curves_panel = _get_panel_and_create_editors(curves, _("Curves"), editors) pane = Gtk.VBox(False, 2) if objs_panel != None: pane.pack_start(objs_panel, False, False, 0) if materials_panel != None: pane.pack_start(materials_panel, False, False, 0) if curves_panel != None: pane.pack_start(curves_panel, False, False, 0) # Put in scrollpane if too many editors for screensize. n_editors = len(blender_objects) + len(materials) + len(curves) add_scroll = False if editorstate.screen_size_small_height() == True and n_editors > 4: add_scroll = True h = 500 elif editorstate.screen_size_small_height( ) == True and editorste.screen_size_large_height( ) == False and n_editors > 5: add_scroll = True h = 600 elif editorstate.screen_size_large_height() == True and n_editors > 6: add_scroll = True h = 700 if add_scroll == True: sw = Gtk.ScrolledWindow() sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) sw.add(pane) sw.set_size_request(400, h) # Create and show dialog dialog = Gtk.Dialog( _("Blender Project Edit"), gui.editor_window.window, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (_("Cancel"), Gtk.ResponseType.REJECT, _("Save Changes"), Gtk.ResponseType.ACCEPT)) if add_scroll == True: alignment = dialogutils.get_default_alignment(sw) else: alignment = dialogutils.get_default_alignment(pane) dialogutils.set_outer_margins(dialog.vbox) dialog.vbox.pack_start(alignment, True, True, 0) dialog.set_default_response(Gtk.ResponseType.REJECT) dialog.set_resizable(False) dialog.connect('response', callback, editors) dialog.show_all()
def main(root_path): """ Called at application start. Initializes application with a default project. """ # DEBUG: Direct output to log file if log file set if _log_file != None: log_print_output_to_file() print "Application version: " + editorstate.appversion # Print OS, Python version and GTK+ version try: os_release_file = open("/etc/os-release","r") os_text = os_release_file.read() s_index = os_text.find("PRETTY_NAME=") e_index = os_text.find("\n", s_index) print "OS: " + os_text[s_index + 13:e_index - 1] except: pass print "Python", sys.version gtk_version = "%s.%s.%s" % (Gtk.get_major_version(), Gtk.get_minor_version(), Gtk.get_micro_version()) print "GTK+ version:", gtk_version editorstate.gtk_version = gtk_version try: editorstate.mlt_version = mlt.LIBMLT_VERSION except: editorstate.mlt_version = "0.0.99" # magic string for "not found" # Create user folders if need and determine if were using xdg or dotfile userf folders. userfolders.init() # Set paths. respaths.set_paths(root_path) # Load editor prefs and list of recent projects editorpersistance.load() if editorpersistance.prefs.theme != appconsts.LIGHT_THEME: respaths.apply_dark_theme() if editorpersistance.prefs.display_all_audio_levels == False: editorstate.display_all_audio_levels = False editorpersistance.save() # Init translations module with translations data translations.init_languages() translations.load_filters_translations() mlttransitions.init_module() # Apr-2017 - SvdB - Keyboard shortcuts shortcuts.load_shortcut_files() shortcuts.load_shortcuts() # We respaths and translations data available so we need to init in a function. workflow.init_data() # RHEL7/CentOS compatibility fix if gtk_version == "3.8.8": GObject.threads_init() # Init gtk threads Gdk.threads_init() Gdk.threads_enter() # Themes if editorpersistance.prefs.theme == appconsts.FLOWBLADE_THEME: success = gui.apply_gtk_css() if not success: editorpersistance.prefs.theme = appconsts.LIGHT_THEME editorpersistance.save() if editorpersistance.prefs.theme != appconsts.LIGHT_THEME: Gtk.Settings.get_default().set_property("gtk-application-prefer-dark-theme", True) # Load drag'n'drop images dnd.init() # Adjust gui parameters for smaller screens scr_w = Gdk.Screen.width() scr_h = Gdk.Screen.height() editorstate.SCREEN_WIDTH = scr_w editorstate.SCREEN_HEIGHT = scr_h print "Screen size:", scr_w, "x", scr_h print "Small height:", editorstate.screen_size_small_height() print "Small width:", editorstate.screen_size_small_width() _set_draw_params() # Refuse to run on too small screen. if scr_w < 1151 or scr_h < 767: _too_small_screen_exit() return # Splash screen if editorpersistance.prefs.display_splash_screen == True: show_splash_screen() # Init MLT framework repo = mlt.Factory().init() processutils.prepare_mlt_repo(repo) # Set numeric locale to use "." as radix, MLT initilizes this to OS locale and this causes bugs. locale.setlocale(locale.LC_NUMERIC, 'C') # Check for codecs and formats on the system. mltenv.check_available_features(repo) renderconsumer.load_render_profiles() # Load filter and compositor descriptions from xml files. mltfilters.load_filters_xml(mltenv.services) mlttransitions.load_compositors_xml(mltenv.transitions) # Replace some services if better replacements available. mltfilters.replace_services(mltenv.services) # Create list of available mlt profiles. mltprofiles.load_profile_list() # Save assoc file path if found in arguments. global assoc_file_path assoc_file_path = get_assoc_file_path() # There is always a project open, so at startup we create a default project. # Set default project as the project being edited. editorstate.project = projectdata.get_default_project() check_crash = True # Audiomonitoring being available needs to be known before GUI creation. audiomonitoring.init(editorstate.project.profile) # Set trim view mode to current default value. editorstate.show_trim_view = editorpersistance.prefs.trim_view_default # Check for tools and init tools integration. gmic.test_availablity() toolsintegration.init() # Create player object. create_player() # Create main window and set widget handles in gui.py for more convenient reference. create_gui() # Inits widgets with project data. init_project_gui() # Inits widgets with current sequence data. init_sequence_gui() # Launch player now that data and gui exist launch_player() # Editor and modules need some more initializing. init_editor_state() # Tracks need to be recentered if window is resized. # Connect listener for this now that the tline panel size allocation is sure to be available. global window_resize_id, window_state_id window_resize_id = gui.editor_window.window.connect("size-allocate", lambda w, e:updater.window_resized()) window_state_id = gui.editor_window.window.connect("window-state-event", lambda w, e:updater.window_resized()) # Get existing autosave files autosave_files = get_autosave_files() # Show splash if ((editorpersistance.prefs.display_splash_screen == True) and len(autosave_files) == 0) and not editorstate.runtime_version_greater_then_test_version(editorpersistance.prefs.workflow_dialog_last_version_shown, editorstate.appversion): global splash_timeout_id splash_timeout_id = GLib.timeout_add(2600, destroy_splash_screen) splash_screen.show_all() appconsts.SAVEFILE_VERSION = projectdata.SAVEFILE_VERSION # THIS IS A QUESTIONABLE IDEA TO SIMPLIFY IMPORTS, NOT DRY. WHEN DOING TOOLS THAT RUN IN ANOTHER PROCESSES AND SAVE PROJECTS, THIS LINE NEEDS TO BE THERE ALSO. # Every running instance has unique autosave file which is deleted at exit set_instance_autosave_id() # Existance of autosave file hints that program was exited abnormally. if check_crash == True and len(autosave_files) > 0: if len(autosave_files) == 1: GObject.timeout_add(10, autosave_recovery_dialog) else: GObject.timeout_add(10, autosaves_many_recovery_dialog) else: start_autosave() # We prefer to monkeypatch some callbacks into some modules, usually to # maintain a simpler and/or non-circular import structure. monkeypatch_callbacks() # File in assoc_file_path is opened after very short delay. if not(check_crash == True and len(autosave_files) > 0): if assoc_file_path != None: print "Launch assoc file:", assoc_file_path global assoc_timeout_id assoc_timeout_id = GObject.timeout_add(10, open_assoc_file) if editorpersistance.prefs.theme == appconsts.FLOWBLADE_THEME: gui.apply_flowblade_theme_fixes() # SDL 2 consumer needs to created after Gtk.main() has run enough for window to be visble #if editorstate.get_sdl_version() == editorstate.SDL_2: # needs more state considerion still # print "SDL2 timeout launch" # global sdl2_timeout_id # sdl2_timeout_id = GObject.timeout_add(1500, create_sdl_2_consumer) # In PositionNumericalEntries we are using Gtk.Entry objects in a way that works for us nicely, but is somehow "error" for Gtk, so we just kill this. Gtk.Settings.get_default().set_property("gtk-error-bell", False) # Show first run worflow info dialog if not shown for this version of application. if editorstate.runtime_version_greater_then_test_version(editorpersistance.prefs.workflow_dialog_last_version_shown, editorstate.appversion): GObject.timeout_add(500, show_worflow_info_dialog) # Handle userfolders init error and data copy. if userfolders.get_init_error() != None: GObject.timeout_add(500, show_user_folders_init_error_dialog, userfolders.get_init_error()) elif userfolders.data_copy_needed(): GObject.timeout_add(500, show_user_folders_copy_dialog) else: print "No user folders actions needed." # Launch gtk+ main loop Gtk.main() Gdk.threads_leave()
def __init__(self, kf_editor, editor_widgets, value_labels ): # kf_editor is keyframeeditor.RotoMaskKeyFrameEditor GObject.GObject.__init__(self) self.set_title(_("RotoMaskEditor")) self.connect("delete-event", lambda w, e: close_rotomask()) if editorstate.screen_size_small_height() == True: global TEXT_LAYER_LIST_HEIGHT, TEXT_VIEW_HEIGHT, VIEW_EDITOR_HEIGHT TEXT_LAYER_LIST_HEIGHT = 150 TEXT_VIEW_HEIGHT = 180 VIEW_EDITOR_HEIGHT = 450 if editorstate.screen_size_small_height() == True: global VIEW_EDITOR_WIDTH VIEW_EDITOR_WIDTH = 680 self.block_updates = False self.kf_editor = kf_editor self.kf_editor.set_parent_editor(self) self.value_labels = value_labels self.view_editor = vieweditor.ViewEditor(PLAYER().profile, VIEW_EDITOR_WIDTH, VIEW_EDITOR_HEIGHT) self.guides_toggle = vieweditor.GuidesViewToggle(self.view_editor) """ add_b = Gtk.Button(_("Add")) del_b = Gtk.Button(_("Delete")) add_b.connect("clicked", lambda w:self._add_layer_pressed()) del_b.connect("clicked", lambda w:self._del_layer_pressed()) add_del_box = Gtk.HBox() add_del_box = Gtk.HBox(True,1) add_del_box.pack_start(add_b, True, True, 0) add_del_box.pack_start(del_b, True, True, 0) """ self.tc_display = guicomponents.MonitorTCDisplay() self.tc_display.use_internal_frame = True self.tc_display.widget.set_valign(Gtk.Align.CENTER) kf_mode_img = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "roto_kf_edit_mode.png") move_mode_img = Gtk.Image.new_from_file(respaths.IMAGE_PATH + "roto_move_mode.png") self.kf_mode_button = Gtk.ToggleButton() self.kf_mode_button.set_image(kf_mode_img) self.kf_mode_button.set_active( True) # we start with vieweditorlayer.ROTO_POINT_MODE edit mode self.kf_mode_button.connect("clicked", self._kf_mode_clicked) self.move_mode_button = Gtk.ToggleButton() self.move_mode_button.set_image(move_mode_img) self.move_mode_button.connect("clicked", self._move_mode_clicked) self.scale_selector = vieweditor.ScaleSelector(self) self.view_editor.scale_select = self.scale_selector timeline_box = Gtk.HBox() timeline_box.pack_start(self.tc_display.widget, False, False, 0) timeline_box.pack_start(Gtk.Label(), True, True, 0) timeline_box.pack_start(self.kf_mode_button, False, False, 0) timeline_box.pack_start(self.move_mode_button, False, False, 0) timeline_box.pack_start(Gtk.Label(), True, True, 0) timeline_box.pack_start(self.scale_selector, False, False, 0) timeline_box.set_margin_top(6) timeline_box.set_margin_bottom(6) mask_type_label = Gtk.Label(_("Mask Type:")) mask_type_combo_box = Gtk.ComboBoxText() mask_type_combo_box.append_text(_("Curve Mask")) mask_type_combo_box.append_text(_("Line Mask")) mask_type_combo_box.set_active(0) mask_type_combo_box.connect("changed", self.mask_type_selection_changed) #exit_b = guiutils.get_sized_button(_("Cancel Edit"), 150, 32) #exit_b.connect("clicked", lambda w:close_rotomask()) save_rotodata_b = guiutils.get_sized_button(_("Close Tool"), 150, 32) save_rotodata_b.connect("clicked", lambda w: self._save_rotodata_pressed()) prop_editor_row1 = Gtk.HBox() prop_editor_row1.pack_start(Gtk.Label(), True, True, 0) prop_editor_row1.pack_start(mask_type_label, False, False, 0) prop_editor_row1.pack_start(guiutils.pad_label(4, 4), False, False, 0) prop_editor_row1.pack_start(mask_type_combo_box, False, False, 0) prop_editor_row1.pack_start(guiutils.pad_label(24, 20), False, False, 0) prop_editor_row1.pack_start(editor_widgets[0], False, False, 0) prop_editor_row1.pack_start(guiutils.pad_label(24, 20), False, False, 0) prop_editor_row1.pack_start(editor_widgets[3], False, False, 0) prop_editor_row1.pack_start(guiutils.pad_label(24, 20), False, False, 0) prop_editor_row1.pack_start(editor_widgets[4], False, False, 0) prop_editor_row1.pack_start(Gtk.Label(), True, True, 0) prop_editor_row2 = Gtk.HBox() prop_editor_row2.pack_start(Gtk.Label(), True, True, 0) prop_editor_row2.pack_start(editor_widgets[1], False, False, 0) prop_editor_row2.pack_start(guiutils.pad_label(24, 20), False, False, 0) prop_editor_row2.pack_start(editor_widgets[2], False, False, 0) prop_editor_row2.pack_start(Gtk.Label(), True, True, 0) editor_buttons_row = Gtk.HBox() editor_buttons_row.pack_start(Gtk.Label(), True, True, 0) editor_buttons_row.pack_start(guiutils.pad_label(24, 2), False, False, 0) editor_buttons_row.pack_start(guiutils.pad_label(24, 2), False, False, 0) #editor_buttons_row.pack_start(exit_b, False, False, 0) editor_buttons_row.pack_start(save_rotodata_b, False, False, 0) editor_panel = Gtk.VBox() editor_panel.pack_start(self.view_editor, True, True, 0) editor_panel.pack_start(timeline_box, False, False, 0) editor_panel.pack_start(kf_editor, False, False, 0) editor_panel.pack_start(guiutils.pad_label(2, 12), False, False, 0) editor_panel.pack_start(prop_editor_row1, False, False, 0) editor_panel.pack_start(guiutils.pad_label(2, 12), False, False, 0) editor_panel.pack_start(prop_editor_row2, False, False, 0) editor_panel.pack_start(guiutils.pad_label(2, 12), False, False, 0) editor_panel.pack_start(editor_buttons_row, False, False, 0) editor_row = Gtk.HBox() editor_row.pack_start(editor_panel, True, True, 0) alignment = guiutils.set_margins(editor_row, 8, 8, 8, 8) self.add(alignment) self.view_editor.clear_layers() # NOTE: we start with vieweditorlayer.ROTO_POINT_MODE edit mode, see __init()__ self.roto_mask_layer = vieweditorlayer.RotoMaskEditLayer( self.view_editor, self.kf_editor.clip_editor, kf_editor.editable_property, self) self.view_editor.add_layer(self.roto_mask_layer) self.view_editor.activate_layer(0) self.show_all() self.kf_editor.active_keyframe_changed() #self.connect("size-allocate", lambda w, e:self.window_resized()) self.connect("window-state-event", lambda w, e: self.window_resized()) self.connect("key-press-event", self.key_down) self.window_resized()