def _save_as_dialog_callback(dialog, response_id): if response_id == Gtk.ResponseType.ACCEPT: filenames = dialog.get_filenames() dialog.destroy() target_project.last_save_path = filenames[0] target_project.name = os.path.basename(filenames[0]) # Test that saving is not IOError try: filehandle = open( target_project.last_save_path, 'w' ) filehandle.close() except IOError as ioe: primary_txt = "I/O error({0})".format(ioe.errno) secondary_txt = ioe.strerror + "." dialogutils.warning_message(primary_txt, secondary_txt, linker_window, is_info=False) return # Relink and save _relink_project_media_paths() persistance.save_project(target_project, target_project.last_save_path) dialogutils.info_message(_("Relinked version of the Project saved!"), _("To test the project, close this tool and open the relinked version in Flowblade."), linker_window) else: dialog.destroy()
def _shutdown_dialog_callback(dialog, response_id): dialog.destroy() if response_id == Gtk.ResponseType.CLOSE:# "Don't Save" pass elif response_id == Gtk.ResponseType.YES:# "Save" if editorstate.PROJECT().last_save_path != None: persistance.save_project(editorstate.PROJECT(), editorstate.PROJECT().last_save_path) else: dialogutils.warning_message(_("Project has not been saved previously"), _("Save project with File -> Save As before closing."), gui.editor_window.window) return else: # "Cancel" return # --- APP SHUT DOWN --- # print "Exiting app..." # No more auto saving stop_autosave() # Save window dimensions on exit alloc = gui.editor_window.window.get_allocation() x, y, w, h = alloc.x, alloc.y, alloc.width, alloc.height editorpersistance.prefs.exit_allocation = (w, h) editorpersistance.prefs.app_v_paned_position = gui.editor_window.app_v_paned.get_position() editorpersistance.prefs.top_paned_position = gui.editor_window.top_paned.get_position() editorpersistance.prefs.mm_paned_position = gui.editor_window.mm_paned.get_position() editorpersistance.save() # Block reconnecting consumer before setting window not visible updater.player_refresh_enabled = False gui.editor_window.window.set_visible(False) # Close and destroy app when gtk finds time to do it after hiding window GLib.idle_add(_app_destroy)
def _auto_renconvert_after_proxy_render_in_proxy_mode(): # Save to temp to convert to using original media project = editorstate.PROJECT() project.proxy_data.proxy_mode = appconsts.CONVERTING_TO_USE_ORIGINAL_MEDIA conv_temp_project_path = utils.get_hidden_user_dir_path() + "proxy_conv.flb" persistance.save_project(editorstate.PROJECT(), conv_temp_project_path) project.proxy_data.proxy_mode = appconsts.USE_ORIGINAL_MEDIA # Load saved temp original media project persistance.show_messages = False project = persistance.load_project(conv_temp_project_path) # Save to temp to convert back to using proxy media project.proxy_data.proxy_mode = appconsts.CONVERTING_TO_USE_PROXY_MEDIA persistance.save_project(project, conv_temp_project_path) project.proxy_data.proxy_mode = appconsts.USE_PROXY_MEDIA # Load saved temp proxy project project = persistance.load_project(conv_temp_project_path) # Open saved temp project app.stop_autosave() gtk.gdk.threads_enter() app.open_project(project) gtk.gdk.threads_leave() app.start_autosave() editorstate.update_current_proxy_paths() persistance.show_messages = True
def add_render_item(flowblade_project, render_path, args_vals_list, mark_in, mark_out, render_data): init_dirs_if_needed() timestamp = datetime.datetime.now() # Create item data file project_name = flowblade_project.name sequence_name = flowblade_project.c_seq.name sequence_index = flowblade_project.sequences.index(flowblade_project.c_seq) length = flowblade_project.c_seq.get_length() render_item = BatchRenderItemData(project_name, sequence_name, render_path, \ sequence_index, args_vals_list, timestamp, length, \ mark_in, mark_out, render_data) # Get identifier identifier = render_item.generate_identifier() # Write project project_path = get_projects_dir() + identifier + ".flb" persistance.save_project(flowblade_project, project_path) # Write render item file render_item.save() bus = dbus.SessionBus() if bus.name_has_owner('flowblade.movie.editor.batchrender'): obj = bus.get_object('flowblade.movie.editor.batchrender', '/flowblade/movie/editor/batchrender') iface = dbus.Interface(obj, 'flowblade.movie.editor.batchrender') iface.render_item_added() else: launch_batch_rendering() print "Render queue item for rendering file into " + render_path + " with identifier " + identifier + " added."
def _save_project_in_last_saved_path(): updater.set_info_icon(Gtk.STOCK_SAVE) try: persistance.save_project(PROJECT(), PROJECT().last_save_path) #<----- HERE except IOError as ioe: updater.set_info_icon(None) primary_txt = "I/O error({0})".format(ioe.errno) secondary_txt = ioe.strerror + "." dialogutils.warning_message(primary_txt, secondary_txt, gui.editor_window.window, is_info=False) return PROJECT().events.append( projectdata.ProjectEvent(projectdata.EVENT_SAVED, PROJECT().last_save_path)) global save_icon_remove_event_id save_icon_remove_event_id = GObject.timeout_add(500, remove_save_icon) global save_time save_time = time.clock() projectinfogui.update_project_info()
def _auto_renconvert_after_proxy_render_in_proxy_mode(): # Save to temp to convert to using original media project = editorstate.PROJECT() project.proxy_data.proxy_mode = appconsts.CONVERTING_TO_USE_ORIGINAL_MEDIA conv_temp_project_path = utils.get_hidden_user_dir_path( ) + "proxy_conv.flb" persistance.save_project(editorstate.PROJECT(), conv_temp_project_path) project.proxy_data.proxy_mode = appconsts.USE_ORIGINAL_MEDIA # Load saved temp original media project persistance.show_messages = False project = persistance.load_project(conv_temp_project_path) # Save to temp to convert back to using proxy media project.proxy_data.proxy_mode = appconsts.CONVERTING_TO_USE_PROXY_MEDIA persistance.save_project(project, conv_temp_project_path) project.proxy_data.proxy_mode = appconsts.USE_PROXY_MEDIA # Load saved temp proxy project project = persistance.load_project(conv_temp_project_path) # Open saved temp project app.stop_autosave() Gdk.threads_enter() app.open_project(project) Gdk.threads_leave() app.start_autosave() editorstate.update_current_proxy_paths() persistance.show_messages = True
def _save_as_dialog_callback(dialog, response_id): if response_id == Gtk.ResponseType.ACCEPT: filenames = dialog.get_filenames() dialog.destroy() target_project.last_save_path = filenames[0] target_project.name = os.path.basename(filenames[0]) # Test that saving is not IOError try: filehandle = open(target_project.last_save_path, 'w') filehandle.close() except IOError as ioe: primary_txt = "I/O error({0})".format(ioe.errno) secondary_txt = ioe.strerror + "." dialogutils.warning_message(primary_txt, secondary_txt, linker_window, is_info=False) return # Relink and save _relink_project_media_paths() persistance.save_project(target_project, target_project.last_save_path) dialogutils.info_message( _("Relinked version of the Project saved!"), _("To test the project, close this tool and open the relinked version in Flowblade." ), linker_window) else: dialog.destroy()
def save_project(self): persistance.show_messages = False if PROJECT().last_save_path != None: save_path = PROJECT().last_save_path else: save_path = userfolders.get_cache_dir() + self.autosave_file # if user didn't save before exit, save in autosave file to preserve render work somehow. persistance.save_project(PROJECT(), save_path)
def start_autosave(): global autosave_timeout_id time_min = 1 # hard coded, probably no need to make configurable autosave_delay_millis = time_min * 60 * 1000 print "Autosave started..." autosave_timeout_id = GObject.timeout_add(autosave_delay_millis, do_autosave) autosave_file = utils.get_hidden_user_dir_path() + get_instance_autosave_file() persistance.save_project(editorstate.PROJECT(), autosave_file)
def _convert_to_original_media_project(): editorstate.PROJECT().proxy_data.proxy_mode = appconsts.CONVERTING_TO_USE_ORIGINAL_MEDIA conv_temp_project_path = utils.get_hidden_user_dir_path() + "proxy_conv.flb" manager_window.convert_progress_bar.set_text(_("Converting to Use Original Media")) persistance.save_project(editorstate.PROJECT(), conv_temp_project_path) global load_thread load_thread = ProxyProjectLoadThread(conv_temp_project_path, manager_window.convert_progress_bar) load_thread.start()
def _shutdown_dialog_callback(dialog, response_id): dialog.destroy() if response_id == Gtk.ResponseType.CLOSE:# "Don't Save" pass elif response_id == Gtk.ResponseType.YES:# "Save" if editorstate.PROJECT().last_save_path != None: persistance.save_project(editorstate.PROJECT(), editorstate.PROJECT().last_save_path) else: dialogutils.warning_message(_("Project has not been saved previously"), _("Save project with File -> Save As before closing."), gui.editor_window.window) return else: # "Cancel" return # --- APP SHUT DOWN --- # print "Exiting app..." # Sep-2018 - SvdB - Stop wave form threads for thread_termination in threading.enumerate(): # We only terminate threads with a 'process', as these are launched # by the audiowaveformrenderer try: thread_termination.process.terminate() except: None # No more auto saving stop_autosave() # Save window dimensions on exit alloc = gui.editor_window.window.get_allocation() x, y, w, h = alloc.x, alloc.y, alloc.width, alloc.height editorpersistance.prefs.exit_allocation = (w, h) if gui.editor_window.window2 != None: alloc = gui.editor_window.window2.get_allocation() pos_x, pos_y = gui.editor_window.window2.get_position() editorpersistance.prefs.exit_allocation_window_2 = (alloc.width, alloc.height, pos_x, pos_y) editorpersistance.prefs.app_v_paned_position = gui.editor_window.app_v_paned.get_position() editorpersistance.prefs.top_paned_position = gui.editor_window.top_paned.get_position() try: # This fails if preference for top row layout changed, we just ignore saving these values then. if editorwindow.top_level_project_panel() == True: editorpersistance.prefs.mm_paned_position = 200 # This is not used until user sets preference to not have top level project panel else: editorpersistance.prefs.mm_paned_position = gui.editor_window.mm_paned.get_position() except: pass editorpersistance.save() # Block reconnecting consumer before setting window not visible updater.player_refresh_enabled = False gui.editor_window.window.set_visible(False) if gui.editor_window.window2 != None: gui.editor_window.window2.set_visible(False) # Close and destroy app when gtk finds time to do it after hiding window GLib.idle_add(_app_destroy)
def _convert_to_original_media_project(): editorstate.PROJECT().proxy_data.proxy_mode = appconsts.CONVERTING_TO_USE_ORIGINAL_MEDIA conv_temp_project_path = userfolders.get_cache_dir() + "proxy_conv.flb" manager_window.convert_progress_bar.set_text(_("Converting to Use Original Media")) mark_in = editorstate.PROJECT().c_seq.tractor.mark_in mark_out = editorstate.PROJECT().c_seq.tractor.mark_out persistance.save_project(editorstate.PROJECT(), conv_temp_project_path) global load_thread load_thread = ProxyProjectLoadThread(conv_temp_project_path, manager_window.convert_progress_bar, mark_in, mark_out) load_thread.start()
def _convert_to_proxy_project(): editorstate.PROJECT().proxy_data.proxy_mode = appconsts.CONVERTING_TO_USE_PROXY_MEDIA conv_temp_project_path = utils.get_hidden_user_dir_path() + "proxy_conv.flb" manager_window.convert_progress_bar.set_text(_("Converting Project to Use Proxy Media")) mark_in = editorstate.PROJECT().c_seq.tractor.mark_in mark_out = editorstate.PROJECT().c_seq.tractor.mark_out persistance.save_project(editorstate.PROJECT(), conv_temp_project_path) global load_thread load_thread = ProxyProjectLoadThread(conv_temp_project_path, manager_window.convert_progress_bar, mark_in, mark_out) load_thread.start()
def _change_project_profile_to_match_media_callback(dialog, response_id, match_profile_index, out_folder, project_name_entry): if response_id == Gtk.ResponseType.ACCEPT: folder = "/" + out_folder.get_uri().lstrip("file:/") name = project_name_entry.get_text() profile = mltprofiles.get_profile_for_index(match_profile_index) path = folder + "/" + name persistance.save_project(PROJECT(), path, profile.description()) #<----- HERE dialog.destroy() else: dialog.destroy()
def _not_matching_media_info_callback(dialog, response_id, media_file): dialog.destroy() if response_id == Gtk.ResponseType.ACCEPT: # Save in hidden and open match_profile_index = mltprofiles.get_closest_matching_profile_index(media_file.info) profile = mltprofiles.get_profile_for_index(match_profile_index) path = utils.get_hidden_user_dir_path() + "/" + PROJECT().name persistance.save_project(PROJECT(), path, profile.description()) #<----- HERE actually_load_project(path)
def _convert_to_original_media_project(): editorstate.PROJECT( ).proxy_data.proxy_mode = appconsts.CONVERTING_TO_USE_ORIGINAL_MEDIA conv_temp_project_path = utils.get_hidden_user_dir_path( ) + "proxy_conv.flb" manager_window.convert_progress_bar.set_text( _("Converting to Use Original Media")) persistance.save_project(editorstate.PROJECT(), conv_temp_project_path) global load_thread load_thread = ProxyProjectLoadThread(conv_temp_project_path, manager_window.convert_progress_bar) load_thread.start()
def _change_project_profile_callback(dialog, response_id, profile_combo, out_folder, project_name_entry): if response_id == Gtk.ResponseType.ACCEPT: folder = "/" + out_folder.get_uri().lstrip("file:/") name = project_name_entry.get_text() profile = mltprofiles.get_profile_for_index(profile_combo.get_active()) path = folder + "/" + name persistance.save_project(PROJECT(), path, profile.description()) #<----- HERE dialog.destroy() else: dialog.destroy()
def _save_project_in_last_saved_path(): updater.set_info_icon(Gtk.STOCK_SAVE) PROJECT().events.append(projectdata.ProjectEvent(projectdata.EVENT_SAVED, PROJECT().last_save_path)) persistance.save_project(PROJECT(), PROJECT().last_save_path) #<----- HERE global save_icon_remove_event_id save_icon_remove_event_id = GObject.timeout_add(500, remove_save_icon) global save_time save_time = time.clock() projectinfogui.update_project_info()
def _save_as_dialog_callback(dialog, response_id): if response_id == gtk.RESPONSE_ACCEPT: filenames = dialog.get_filenames() PROJECT().last_save_path = filenames[0] PROJECT().name = os.path.basename(filenames[0]) updater.set_info_icon(gtk.STOCK_SAVE) if len( PROJECT().events ) == 0: # Save as... with 0 project events is considered Project creation p_event = projectdata.ProjectEvent( projectdata.EVENT_CREATED_BY_SAVING, PROJECT().last_save_path) PROJECT().events.append(p_event) else: p_event = projectdata.ProjectEvent( projectdata.EVENT_SAVED_AS, (PROJECT().name, PROJECT().last_save_path)) PROJECT().events.append(p_event) persistance.save_project(PROJECT(), PROJECT().last_save_path) #<----- HERE app.stop_autosave() app.start_autosave() global save_icon_remove_event_id save_icon_remove_event_id = gobject.timeout_add(500, remove_save_icon) global save_time save_time = time.clock() gui.editor_window.window.set_title(PROJECT().name + " - Flowblade") gui.editor_window.uimanager.get_widget( "/MenuBar/FileMenu/Save").set_sensitive(False) gui.editor_window.uimanager.get_widget( "/MenuBar/EditMenu/Undo").set_sensitive(False) gui.editor_window.uimanager.get_widget( "/MenuBar/EditMenu/Redo").set_sensitive(False) editorpersistance.add_recent_project_path(PROJECT().last_save_path) editorpersistance.fill_recents_menu_widget( gui.editor_window.uimanager.get_widget( '/MenuBar/FileMenu/OpenRecent'), open_recent_project) projectinfogui.update_project_info() dialog.destroy() else: dialog.destroy()
def _shutdown_dialog_callback(dialog, response_id): dialog.destroy() if response_id == Gtk.ResponseType.CLOSE: # "Don't Save" pass elif response_id == Gtk.ResponseType.YES: # "Save" if editorstate.PROJECT().last_save_path != None: persistance.save_project(editorstate.PROJECT(), editorstate.PROJECT().last_save_path) else: dialogutils.warning_message( _("Project has not been saved previously"), _("Save project with File -> Save As before closing."), gui.editor_window.window) return else: # "Cancel" return # --- APP SHUT DOWN --- # print "Exiting app..." # No more auto saving stop_autosave() # Save window dimensions on exit alloc = gui.editor_window.window.get_allocation() x, y, w, h = alloc.x, alloc.y, alloc.width, alloc.height editorpersistance.prefs.exit_allocation = (w, h) if gui.editor_window.window2 != None: alloc = gui.editor_window.window2.get_allocation() pos_x, pos_y = gui.editor_window.window2.get_position() editorpersistance.prefs.exit_allocation_window_2 = (alloc.width, alloc.height, pos_x, pos_y) editorpersistance.prefs.app_v_paned_position = gui.editor_window.app_v_paned.get_position( ) editorpersistance.prefs.top_paned_position = gui.editor_window.top_paned.get_position( ) editorpersistance.prefs.mm_paned_position = gui.editor_window.mm_paned.get_position( ) editorpersistance.save() # Block reconnecting consumer before setting window not visible updater.player_refresh_enabled = False gui.editor_window.window.set_visible(False) if gui.editor_window.window2 != None: gui.editor_window.window2.set_visible(False) # Close and destroy app when gtk finds time to do it after hiding window GLib.idle_add(_app_destroy)
def _not_matching_media_info_callback(dialog, response_id, media_file): dialog.destroy() if response_id == Gtk.ResponseType.ACCEPT: # Save in hidden and open match_profile_index = mltprofiles.get_closest_matching_profile_index( media_file.info) profile = mltprofiles.get_profile_for_index(match_profile_index) path = utils.get_hidden_user_dir_path() + "/" + PROJECT().name persistance.save_project(PROJECT(), path, profile.description()) #<----- HERE actually_load_project(path)
def _save_as_dialog_callback(dialog, response_id): if response_id == Gtk.ResponseType.ACCEPT: filenames = dialog.get_filenames() PROJECT().last_save_path = filenames[0] PROJECT().name = unicode(os.path.basename(filenames[0]), "utf-8") updater.set_info_icon(Gtk.STOCK_SAVE) try: persistance.save_project(PROJECT(), PROJECT().last_save_path) #<----- HERE except IOError as ioe: dialog.destroy() updater.set_info_icon(None) primary_txt = "I/O error({0})".format(ioe.errno) secondary_txt = ioe.strerror + "." dialogutils.warning_message(primary_txt, secondary_txt, gui.editor_window.window, is_info=False) return if len(PROJECT().events) == 0: # Save as... with 0 project events is considered Project creation p_event = projectdata.ProjectEvent(projectdata.EVENT_CREATED_BY_SAVING, PROJECT().last_save_path) PROJECT().events.append(p_event) else: p_event = projectdata.ProjectEvent(projectdata.EVENT_SAVED_AS, (PROJECT().name, PROJECT().last_save_path)) PROJECT().events.append(p_event) app.stop_autosave() app.start_autosave() global save_icon_remove_event_id save_icon_remove_event_id = GObject.timeout_add(500, remove_save_icon) global save_time save_time = time.clock() gui.editor_window.window.set_title(PROJECT().name + " - Flowblade") gui.editor_window.uimanager.get_widget("/MenuBar/FileMenu/Save").set_sensitive(False) gui.editor_window.uimanager.get_widget("/MenuBar/EditMenu/Undo").set_sensitive(False) gui.editor_window.uimanager.get_widget("/MenuBar/EditMenu/Redo").set_sensitive(False) editorpersistance.add_recent_project_path(PROJECT().last_save_path) editorpersistance.fill_recents_menu_widget(gui.editor_window.uimanager.get_widget('/MenuBar/FileMenu/OpenRecent'), open_recent_project) projectinfogui.update_project_info() dialog.destroy() else: dialog.destroy()
def _save_as_dialog_callback(dialog, response_id): if response_id == Gtk.ResponseType.ACCEPT: filenames = dialog.get_filenames() dialog.destroy() target_project.last_save_path = filenames[0] target_project.name = os.path.basename(filenames[0]) _relink_project_media_paths() persistance.save_project(target_project, target_project.last_save_path) dialogutils.info_message(_("Relinked version of the Project saved!"), _("To test the project, close this tool and open the relinked version in Flowblade."), linker_window) else: dialog.destroy()
def _save_as_dialog_callback(dialog, response_id): if response_id == gtk.RESPONSE_ACCEPT: filenames = dialog.get_filenames() dialog.destroy() target_project.last_save_path = filenames[0] target_project.name = os.path.basename(filenames[0]) _relink_project_media_paths() persistance.save_project(target_project, target_project.last_save_path) dialogutils.info_message(_("Relinked version of the Project saved!"), _("To test the project, close this tool and open the relinked version in Flowblade."), linker_window) else: dialog.destroy()
def start_autosave(): global autosave_timeout_id # Aug-2019 - SvdB - AS - Made changes to use the value stored in prefs, with Default=1 minute, rather than hardcoding try: time_min, desc = editorpersistance.prefs.AUTO_SAVE_OPTS[editorpersistance.prefs.auto_save_delay_value_index] except: time_min = 1 autosave_delay_millis = time_min * 60 * 1000 # Aug-2019 - SvdB - AS - put in code to stop or not start autosave depending on user selection if autosave_delay_millis > 0: print("Autosave started...") autosave_timeout_id = GObject.timeout_add(autosave_delay_millis, do_autosave) autosave_file = userfolders.get_cache_dir() + get_instance_autosave_file() persistance.save_project(editorstate.PROJECT(), autosave_file) else: print("Autosave disabled...") stop_autosave()
def add_single_render_item(flowblade_project, render_path, args_vals_list, mark_in, mark_out, render_data): hidden_dir = utils.get_hidden_user_dir_path() timestamp = datetime.datetime.now() # Create item data file project_name = flowblade_project.name sequence_name = flowblade_project.c_seq.name sequence_index = flowblade_project.sequences.index(flowblade_project.c_seq) length = flowblade_project.c_seq.get_length() render_item = BatchRenderItemData(project_name, sequence_name, render_path, \ sequence_index, args_vals_list, timestamp, length, \ mark_in, mark_out, render_data) # Write project project_path = hidden_dir + CURRENT_RENDER_PROJECT_FILE persistance.save_project(flowblade_project, project_path) # Write render item file render_item.save_as_single_render_item(hidden_dir + CURRENT_RENDER_RENDER_ITEM)
def _close_dialog_callback(dialog, response_id): dialog.destroy() if response_id == Gtk.ResponseType.CLOSE:# "Don't Save" pass elif response_id == Gtk.ResponseType.YES:# "Save" if editorstate.PROJECT().last_save_path != None: persistance.save_project(editorstate.PROJECT(), editorstate.PROJECT().last_save_path) else: dialogutils.warning_message(_("Project has not been saved previously"), _("Save project with File -> Save As before closing."), gui.editor_window.window) return else: # "Cancel" return # This is the same as opening default project sequence.AUDIO_TRACKS_COUNT = 4 sequence.VIDEO_TRACKS_COUNT = 5 new_project = projectdata.get_default_project() app.open_project(new_project)
def _save_as_dialog_callback(dialog, response_id): if response_id == gtk.RESPONSE_ACCEPT: filenames = dialog.get_filenames() PROJECT().last_save_path = filenames[0] PROJECT().name = os.path.basename(filenames[0]) updater.set_info_icon(gtk.STOCK_SAVE) if len(PROJECT().events) == 0: # Save as... with 0 project events is considered Project creation p_event = projectdata.ProjectEvent(projectdata.EVENT_CREATED_BY_SAVING, PROJECT().last_save_path) PROJECT().events.append(p_event) else: p_event = projectdata.ProjectEvent(projectdata.EVENT_SAVED_AS, (PROJECT().name, PROJECT().last_save_path)) PROJECT().events.append(p_event) persistance.save_project(PROJECT(), PROJECT().last_save_path) #<----- HERE app.stop_autosave() app.start_autosave() global save_icon_remove_event_id save_icon_remove_event_id = gobject.timeout_add(500, remove_save_icon) global save_time save_time = time.clock() gui.editor_window.window.set_title(PROJECT().name + " - Flowblade") gui.editor_window.uimanager.get_widget("/MenuBar/FileMenu/Save").set_sensitive(False) gui.editor_window.uimanager.get_widget("/MenuBar/EditMenu/Undo").set_sensitive(False) gui.editor_window.uimanager.get_widget("/MenuBar/EditMenu/Redo").set_sensitive(False) editorpersistance.add_recent_project_path(PROJECT().last_save_path) editorpersistance.fill_recents_menu_widget(gui.editor_window.uimanager.get_widget('/MenuBar/FileMenu/OpenRecent'), open_recent_project) projectinfogui.update_project_info() dialog.destroy() else: dialog.destroy()
def _save_project_in_last_saved_path(): updater.set_info_icon(Gtk.STOCK_SAVE) try: persistance.save_project(PROJECT(), PROJECT().last_save_path) #<----- HERE except IOError as ioe: updater.set_info_icon(None) primary_txt = "I/O error({0})".format(ioe.errno) secondary_txt = ioe.strerror + "." dialogutils.warning_message(primary_txt, secondary_txt, gui.editor_window.window, is_info=False) return PROJECT().events.append(projectdata.ProjectEvent(projectdata.EVENT_SAVED, PROJECT().last_save_path)) global save_icon_remove_event_id save_icon_remove_event_id = GObject.timeout_add(500, remove_save_icon) global save_time save_time = time.clock() projectinfogui.update_project_info()
def run(self): copy_txt = _("Copying project media assets") project_txt = _("Saving project file") Gdk.threads_enter() dialog = dialogs.save_snaphot_progess(copy_txt, project_txt) Gdk.threads_leave() media_folder = self.root_folder_path + "media/" d = os.path.dirname(media_folder) os.mkdir(d) asset_paths = {} # Copy media files for idkey, media_file in PROJECT().media_files.items(): if media_file.type == appconsts.PATTERN_PRODUCER: continue # Copy asset file and fix path directory, file_name = os.path.split(media_file.path) # Message Gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + "... " + file_name) Gdk.threads_leave() # Other media types than image sequences if media_file.type != appconsts.IMAGE_SEQUENCE: media_file_copy = media_folder + file_name if media_file_copy in asset_paths: # Create different filename for files # that have same filename but different path file_name = get_snapshot_unique_name(media_file.path, file_name) media_file_copy = media_folder + file_name shutil.copyfile(media_file.path, media_file_copy) asset_paths[media_file.path] = media_file_copy else: # Image Sequences asset_folder, asset_file_name = os.path.split(media_file.path) lookup_filename = utils.get_img_seq_glob_lookup_name(asset_file_name) lookup_path = asset_folder + "/" + lookup_filename copyfolder = media_folder.rstrip("/") + asset_folder + "/" os.makedirs(copyfolder) listing = glob.glob(lookup_path) for orig_path in listing: orig_folder, orig_file_name = os.path.split(orig_path) shutil.copyfile(orig_path, copyfolder + orig_file_name) # Copy clip producers paths. This is needed just for rendered files as clips # from media file objects should be covered as media files can't be destroyed # if a clip made from them exists...I think for seq in PROJECT().sequences: for track in seq.tracks: for i in range(0, len(track.clips)): clip = track.clips[i] # Image sequence files can't be rendered files if clip.is_blanck_clip == False and clip.media_type == appconsts.IMAGE_SEQUENCE: continue # Only producer clips are affected if (clip.is_blanck_clip == False and (clip.media_type != appconsts.PATTERN_PRODUCER)): directory, file_name = os.path.split(clip.path) clip_file_copy = media_folder + file_name if not os.path.isfile(clip_file_copy): directory, file_name = os.path.split(clip.path) Gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + "... " + file_name) Gdk.threads_leave() shutil.copyfile(clip.path, clip_file_copy) # only rendered files are copied here asset_paths[clip.path] = clip_file_copy # This stuff is already md5 hashed, so no duplicate problems here for compositor in seq.compositors: if compositor.type_id == "##wipe": # Wipe may have user luma and needs to be looked up relatively copy_comp_resourse_file(compositor, "resource", media_folder) if compositor.type_id == "##region": # Wipe may have user luma and needs to be looked up relatively copy_comp_resourse_file(compositor, "composite.luma", media_folder) Gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + " " + u"\u2713") Gdk.threads_leave() save_path = self.root_folder_path + self.project_name persistance.snapshot_paths = asset_paths persistance.save_project(PROJECT(), save_path) persistance.snapshot_paths = None Gdk.threads_enter() dialog.saving_project_info.set_text(project_txt + " " + u"\u2713") Gdk.threads_leave() time.sleep(2) Gdk.threads_enter() dialog.destroy() Gdk.threads_leave() project_event = projectdata.ProjectEvent(projectdata.EVENT_SAVED_SNAPSHOT, self.root_folder_path) PROJECT().events.append(project_event) Gdk.threads_enter() projectinfogui.update_project_info() Gdk.threads_leave()
def do_autosave(): autosave_file = userfolders.get_cache_dir() + get_instance_autosave_file() persistance.save_project(editorstate.PROJECT(), autosave_file) return True
def do_autosave(): autosave_file = utils.get_hidden_user_dir_path() + get_instance_autosave_file() persistance.save_project(editorstate.PROJECT(), autosave_file) return True
def run(self): copy_txt = _("Copying project media assets") project_txt = _("Saving project file") gtk.gdk.threads_enter() dialog = dialogs.save_snaphot_progess(copy_txt, project_txt) gtk.gdk.threads_leave() media_folder = self.root_folder_path + "media/" d = os.path.dirname(media_folder) os.mkdir(d) asset_paths = {} # Copy media files for idkey, media_file in PROJECT().media_files.items(): if media_file.type == appconsts.PATTERN_PRODUCER: continue # Copy asset file and fix path directory, file_name = os.path.split(media_file.path) gtk.gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + "... " + file_name) gtk.gdk.threads_leave() media_file_copy = media_folder + file_name if media_file_copy in asset_paths: # Create different filename for files # that have same filename but different path file_name = get_snapshot_unique_name(media_file.path, file_name) media_file_copy = media_folder + file_name shutil.copyfile(media_file.path, media_file_copy) asset_paths[media_file.path] = media_file_copy # Copy clip producers paths for seq in PROJECT().sequences: for track in seq.tracks: for i in range(0, len(track.clips)): clip = track.clips[i] # Only producer clips are affected if (clip.is_blanck_clip == False and (clip.media_type != appconsts.PATTERN_PRODUCER)): directory, file_name = os.path.split(clip.path) clip_file_copy = media_folder + file_name if not os.path.isfile(clip_file_copy): directory, file_name = os.path.split(clip.path) gtk.gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + "... " + file_name) gtk.gdk.threads_leave() shutil.copyfile(clip.path, clip_file_copy) # only rendered files are copied here asset_paths[clip.path] = clip_file_copy # This stuff is already md5 hashed, so no duplicate problems here for compositor in seq.compositors: if compositor.type_id == "##wipe": # Wipe may have user luma and needs to be looked up relatively copy_comp_resourse_file(compositor, "resource", media_folder) if compositor.type_id == "##region": # Wipe may have user luma and needs to be looked up relatively copy_comp_resourse_file(compositor, "composite.luma", media_folder) gtk.gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + " " + u"\u2713") gtk.gdk.threads_leave() save_path = self.root_folder_path + self.project_name persistance.snapshot_paths = asset_paths persistance.save_project(PROJECT(), save_path) persistance.snapshot_paths = None gtk.gdk.threads_enter() dialog.saving_project_info.set_text(project_txt + " " + u"\u2713") gtk.gdk.threads_leave() time.sleep(2) gtk.gdk.threads_enter() dialog.destroy() gtk.gdk.threads_leave() project_event = projectdata.ProjectEvent(projectdata.EVENT_SAVED_SNAPSHOT, self.root_folder_path) PROJECT().events.append(project_event) gtk.gdk.threads_enter() projectinfogui.update_project_info() gtk.gdk.threads_leave()
def _save_as_dialog_callback(dialog, response_id): if response_id == Gtk.ResponseType.ACCEPT: filenames = dialog.get_filenames() PROJECT().last_save_path = filenames[0] PROJECT().name = unicode(os.path.basename(filenames[0]), "utf-8") updater.set_info_icon(Gtk.STOCK_SAVE) try: persistance.save_project(PROJECT(), PROJECT().last_save_path) #<----- HERE except IOError as ioe: dialog.destroy() updater.set_info_icon(None) primary_txt = "I/O error({0})".format(ioe.errno) secondary_txt = ioe.strerror + "." dialogutils.warning_message(primary_txt, secondary_txt, gui.editor_window.window, is_info=False) return if len( PROJECT().events ) == 0: # Save as... with 0 project events is considered Project creation p_event = projectdata.ProjectEvent( projectdata.EVENT_CREATED_BY_SAVING, PROJECT().last_save_path) PROJECT().events.append(p_event) else: p_event = projectdata.ProjectEvent( projectdata.EVENT_SAVED_AS, (PROJECT().name, PROJECT().last_save_path)) PROJECT().events.append(p_event) app.stop_autosave() app.start_autosave() global save_icon_remove_event_id save_icon_remove_event_id = GObject.timeout_add(500, remove_save_icon) global save_time save_time = time.clock() gui.editor_window.window.set_title(PROJECT().name + " - Flowblade") gui.editor_window.uimanager.get_widget( "/MenuBar/FileMenu/Save").set_sensitive(False) gui.editor_window.uimanager.get_widget( "/MenuBar/EditMenu/Undo").set_sensitive(False) gui.editor_window.uimanager.get_widget( "/MenuBar/EditMenu/Redo").set_sensitive(False) editorpersistance.add_recent_project_path(PROJECT().last_save_path) editorpersistance.fill_recents_menu_widget( gui.editor_window.uimanager.get_widget( '/MenuBar/FileMenu/OpenRecent'), open_recent_project) projectinfogui.update_project_info() dialog.destroy() else: dialog.destroy()
def do_autosave(): autosave_file = utils.get_hidden_user_dir_path( ) + get_instance_autosave_file() persistance.save_project(editorstate.PROJECT(), autosave_file) return True
def run(self): copy_txt = _("Copying project media assets") project_txt = _("Saving project file") gtk.gdk.threads_enter() dialog = dialogs.save_snaphot_progess(copy_txt, project_txt) gtk.gdk.threads_leave() media_folder = self.root_folder_path + "media/" d = os.path.dirname(media_folder) os.mkdir(d) asset_paths = {} # Copy media files for idkey, media_file in PROJECT().media_files.items(): if media_file.type == appconsts.PATTERN_PRODUCER: continue # Copy asset file and fix path directory, file_name = os.path.split(media_file.path) gtk.gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + "... " + file_name) gtk.gdk.threads_leave() media_file_copy = media_folder + file_name if media_file_copy in asset_paths: # Create different filename for files # that have same filename but different path file_name = get_snapshot_unique_name(media_file.path, file_name) media_file_copy = media_folder + file_name shutil.copyfile(media_file.path, media_file_copy) asset_paths[media_file.path] = media_file_copy # Copy clip producers paths for seq in PROJECT().sequences: for track in seq.tracks: for i in range(0, len(track.clips)): clip = track.clips[i] # Only producer clips are affected if (clip.is_blanck_clip == False and (clip.media_type != appconsts.PATTERN_PRODUCER)): directory, file_name = os.path.split(clip.path) clip_file_copy = media_folder + file_name if not os.path.isfile(clip_file_copy): directory, file_name = os.path.split(clip.path) gtk.gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + "... " + file_name) gtk.gdk.threads_leave() shutil.copyfile( clip.path, clip_file_copy ) # only rendered files are copied here asset_paths[ clip. path] = clip_file_copy # This stuff is already md5 hashed, so no duplicate problems here for compositor in seq.compositors: if compositor.type_id == "##wipe": # Wipe may have user luma and needs to be looked up relatively copy_comp_resourse_file(compositor, "resource", media_folder) if compositor.type_id == "##region": # Wipe may have user luma and needs to be looked up relatively copy_comp_resourse_file(compositor, "composite.luma", media_folder) gtk.gdk.threads_enter() dialog.media_copy_info.set_text(copy_txt + " " + u"\u2713") gtk.gdk.threads_leave() save_path = self.root_folder_path + self.project_name persistance.snapshot_paths = asset_paths persistance.save_project(PROJECT(), save_path) persistance.snapshot_paths = None gtk.gdk.threads_enter() dialog.saving_project_info.set_text(project_txt + " " + u"\u2713") gtk.gdk.threads_leave() time.sleep(2) gtk.gdk.threads_enter() dialog.destroy() gtk.gdk.threads_leave() project_event = projectdata.ProjectEvent( projectdata.EVENT_SAVED_SNAPSHOT, self.root_folder_path) PROJECT().events.append(project_event) gtk.gdk.threads_enter() projectinfogui.update_project_info() gtk.gdk.threads_leave()