def get_render_panel_right(render_widgets, render_clicked_cb, to_queue_clicked_cb): small_height = (editorstate.SCREEN_HEIGHT < 898) if small_height: encoding_panel = guiutils.get_named_frame(_("Encoding Format"), render_widgets.encoding_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) if not editorstate.screen_size_small_width(): 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) if not editorstate.screen_size_small_width(): 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(encoding_panel, False, False, 0) render_panel.pack_start(opts_panel, True, True, 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) else: render_panel.pack_start(Gtk.Label(), True, True, 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) else: render_panel.pack_start(guiutils.get_pad_label(10, 4), False, False, 0) render_panel.pack_start(buttons_panel, False, False, 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 _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 fill_with_TC_MIDDLE_pattern(buttons_row, window): if editorpersistance.prefs.force_small_midbar == False: buttons_row.set_homogeneous(True) global w w = window left_panel = Gtk.HBox(False, 0) left_panel.pack_start(_get_undo_buttons_panel(), False, True, 0) left_panel.pack_start( guiutils.get_pad_label(10, MIDDLE_ROW_HEIGHT), False, True, 0) #### NOTE!!!!!! THIS DETERMINES THE HEIGHT OF MIDDLE ROW left_panel.pack_start(_get_zoom_buttons_panel(), False, True, 0) if editorpersistance.prefs.force_small_midbar == False: if editorstate.SCREEN_WIDTH > NORMAL_WIDTH: left_panel.pack_start(guiutils.get_pad_label(10, 10), False, True, 0) left_panel.pack_start(_get_tools_buttons(), False, True, 0) left_panel.pack_start( guiutils.get_pad_label(50, 10), False, True, 10) # to left and right panel same size for centering else: left_panel.pack_start( guiutils.get_pad_label(60, 10), False, True, 10) # to left and right panel same size for centering else: left_panel.pack_start(guiutils.get_pad_label(10, 10), False, True, 0) left_panel.pack_start(_get_edit_buttons_panel(), False, True, 0) left_panel.pack_start(Gtk.Label(), True, True, 0) middle_panel = Gtk.HBox(False, 0) middle_panel.pack_start(w.worflow_launch.widget, False, True, 0) middle_panel.pack_start(guiutils.get_pad_label(7, MIDDLE_ROW_HEIGHT), False, True, 0) middle_panel.pack_start(w.big_TC, False, True, 0) middle_panel.pack_start(guiutils.get_pad_label(10, 10), False, True, 0) if editorpersistance.prefs.tools_selection == appconsts.TOOL_SELECTOR_IS_MENU: middle_panel.pack_start(w.tool_selector.widget, False, True, 0) right_panel = Gtk.HBox(False, 0) right_panel.pack_start(Gtk.Label(), True, True, 0) if editorpersistance.prefs.force_small_midbar == False: right_panel.pack_start(_get_edit_buttons_panel(), False, True, 0) right_panel.pack_start(guiutils.get_pad_label(10, 10), False, True, 0) right_panel.pack_start(_get_edit_buttons_3_panel(), False, True, 0) right_panel.pack_start(guiutils.get_pad_label(10, 10), False, True, 0) if editorpersistance.prefs.force_small_midbar == False: if editorstate.screen_size_small_width() == False: right_panel.pack_start(_get_edit_buttons_2_panel(), False, True, 0) right_panel.pack_start(guiutils.get_pad_label(10, 10), False, True, 0) right_panel.pack_start(_get_monitor_insert_buttons(), False, True, 0) buttons_row.pack_start(left_panel, True, True, 0) buttons_row.pack_start(middle_panel, False, False, 0) buttons_row.pack_start(right_panel, True, True, 0)
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 fill_with_COMPONENTS_CENTERED_pattern(buttons_row, window): buttons_row.set_homogeneous(False) global w w = window buttons_row.pack_start(Gtk.Label(), True, True, 0) buttons_row.pack_start(w.worflow_launch.widget, False, True, 0) buttons_row.pack_start(guiutils.get_pad_label(7, MIDDLE_ROW_HEIGHT), False, True, 0) buttons_row.pack_start(w.big_TC, False, True, 0) buttons_row.pack_start( guiutils.get_pad_label(7, MIDDLE_ROW_HEIGHT), False, True, 0) #### NOTE!!!!!! THIS DETERMINES THE HEIGHT OF MIDDLE ROW if editorpersistance.prefs.tools_selection == appconsts.TOOL_SELECTOR_IS_MENU: buttons_row.pack_start(w.tool_selector.widget, False, True, 0) if editorpersistance.prefs.force_small_midbar == False: if editorstate.SCREEN_WIDTH > NORMAL_WIDTH: buttons_row.pack_start(guiutils.get_pad_label(10, 10), False, True, 0) buttons_row.pack_start(_get_tools_buttons(), False, True, 0) #buttons_row.pack_start(guiutils.get_pad_label(120, 10), False, True, 0) buttons_row.pack_start(guiutils.get_pad_label(20, 10), False, True, 0) else: buttons_row.pack_start(guiutils.get_pad_label(20, 10), False, True, 0) buttons_row.pack_start(_get_undo_buttons_panel(), False, True, 0) buttons_row.pack_start(guiutils.get_pad_label(20, 10), False, True, 0) buttons_row.pack_start(_get_zoom_buttons_panel(), False, True, 0) buttons_row.pack_start(guiutils.get_pad_label(20, 10), False, True, 0) buttons_row.pack_start(_get_edit_buttons_panel(), False, True, 0) buttons_row.pack_start(guiutils.get_pad_label(20, 10), False, True, 0) if editorpersistance.prefs.force_small_midbar == False: if editorstate.screen_size_small_width() == False: buttons_row.pack_start(_get_edit_buttons_2_panel(), False, True, 0) buttons_row.pack_start(guiutils.get_pad_label(20, 10), False, True, 0) buttons_row.pack_start(_get_edit_buttons_3_panel(), False, True, 0) buttons_row.pack_start(guiutils.get_pad_label(20, 10), False, True, 0) buttons_row.pack_start(_get_monitor_insert_buttons(), False, True, 0) buttons_row.pack_start(Gtk.Label(), True, True, 0)
def _get_marks_range_info_text(mark_in, mark_out): if editorstate.screen_size_small_width() == False: if mark_in != -1: range_info = "] " + utils.get_tc_string(mark_in) else: range_info = "] --:--:--:--" if mark_out != -1: range_info = range_info + " [ " + utils.get_tc_string(mark_out) + " " else: range_info = range_info + " [ --:--:--:--" + " " else: range_info = "" range_len = mark_out - mark_in + 1 # +1, out incl. if mark_in != -1 and mark_out != -1: range_info = range_info + "][ " + utils.get_tc_string(range_len) else: range_info = range_info + "][ --:--:--:--" return range_info
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 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 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 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()