Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
app = get_app()
_ = app._tr
# Get settings
self.s = settings.get_settings()
# Track metrics
track_metric_screen("file-properties-screen")
# Add buttons to interface
self.update_button = QPushButton(_('Update'))
self.buttonBox.addButton(self.update_button, QDialogButtonBox.AcceptRole)
self.buttonBox.addButton(QPushButton(_('Cancel')), QDialogButtonBox.RejectRole)
# Dynamically load tabs from settings data
self.settings_data = settings.get_settings().get_all_settings()
# Get file properties
path, filename = os.path.split(self.file.data["path"])
baseFilename, ext = os.path.splitext(filename)
fps_float = float(self.file.data["fps"]["num"]) / float(self.file.data["fps"]["den"])
tags = ""
if "tags" in self.file.data.keys():
tags = self.file.data["tags"]
name = filename
if "name" in self.file.data.keys():
name = self.file.data["name"]
# Populate fields
self.txtFileName.setText(name)
self.txtTags.setText(tags)
if ".png" not in framePath:
framePath = "%s.png" % framePath
else:
# No path specified (save frame cancelled)
self.statusBar.showMessage(_("Save Frame cancelled..."), 5000)
return
get_app().updates.update(["export_path"], os.path.dirname(framePath))
log.info(_("Saving frame to %s" % framePath ))
# Pause playback (to prevent crash since we are fixing to change the timeline's max size)
get_app().window.actionPlay_trigger(None, force="pause")
# Save current cache object and create a new CacheMemory object (ignore quality and scale prefs)
old_cache_object = self.cache_object
new_cache_object = openshot.CacheMemory(settings.get_settings().get("cache-limit-mb") * 1024 * 1024)
self.timeline_sync.timeline.SetCache(new_cache_object)
# Set MaxSize to full project resolution and clear preview cache so we get a full resolution frame
self.timeline_sync.timeline.SetMaxSize(get_app().project.get("width"), get_app().project.get("height"))
self.cache_object.Clear()
# Check if file exists, if it does, get the lastModified time
if os.path.exists(framePath):
framePathTime = QFileInfo(framePath).lastModified()
else:
framePathTime = QDateTime()
# Get and Save the frame (return is void, so we cannot check for success/fail here - must use file modification timestamp)
openshot.Timeline.GetFrame(self.timeline_sync.timeline,self.preview_thread.current_frame).Save(framePath, 1.0)
# Show message to user
def save_project(self, file_path):
""" Save a project to a file path, and refresh the screen """
app = get_app()
_ = app._tr # Get translation function
try:
# Update history in project data
s = settings.get_settings()
app.updates.save_history(app.project, s.get("history-limit"))
# Save project to file
app.project.save(file_path)
# Set Window title
self.SetWindowTitle()
# Load recent projects again
self.load_recent_menu()
log.info("Saved project {}".format(file_path))
except Exception as ex:
log.error("Couldn't save project %s. %s" % (file_path, str(ex)))
QMessageBox.warning(self, _("Error Saving Project"), str(ex))
for k, v in self.get_project_params(is_preview).items():
if type(v) == int or type(v) == float or type(v) == list or type(v) == bool:
user_params += "params['{}'] = {}\n".format(k, v)
if type(v) == str:
user_params += "params['{}'] = u'{}'\n".format(k, v.replace("'", r"\'").replace("\\", "\\\\"))
user_params += "#END INJECTING PARAMS\n"
# Force the Frame to 1 frame (for previewing)
if frame:
user_params += "\n#ONLY RENDER 1 FRAME FOR PREVIEW\n"
user_params += "params['{}'] = {}\n".format("start_frame", frame)
user_params += "params['{}'] = {}\n".format("end_frame", frame)
user_params += "#END ONLY RENDER 1 FRAME FOR PREVIEW\n"
# If GPU rendering is selected, see if GPU enable code is available
s = settings.get_settings()
gpu_code_body = None
if s.get("blender_gpu_enabled"):
gpu_enable_py = os.path.join(info.PATH, "blender", "scripts", "gpu_enable.py")
try:
f = open(gpu_enable_py, 'r')
gpu_code_body = f.read()
except IOError as e:
log.error("Could not load GPU enable code! {}".format(e))
if gpu_code_body:
log.info("Injecting GPU enable code from {}".format(gpu_enable_py))
user_params += "\n#ENABLE GPU RENDERING\n"
user_params += gpu_code_body
user_params += "\n#END ENABLE GPU RENDERING\n"
# Open new temp .py file, and inject the user parameters
def add_to_recent_files(self, file_path):
""" Add this project to the recent files list """
if not file_path or file_path is info.BACKUP_FILE:
# Ignore backup recovery project
return
s = settings.get_settings()
recent_projects = s.get("recent_projects")
# Make sure file_path is absolute
file_path = os.path.abspath(file_path)
# Remove existing project
if file_path in recent_projects:
recent_projects.remove(file_path)
# Remove oldest item (if needed)
if len(recent_projects) > 10:
del recent_projects[0]
# Append file path to end of recent files
recent_projects.append(file_path)
def save_project(self, file_path):
""" Save a project to a file path, and refresh the screen """
app = get_app()
_ = app._tr # Get translation function
try:
# Update history in project data
s = settings.get_settings()
app.updates.save_history(app.project, s.get("history-limit"))
# Save project to file
app.project.save(file_path)
# Set Window title
self.SetWindowTitle()
# Load recent projects again
self.load_recent_menu()
log.info("Saved project {}".format(file_path))
except Exception as ex:
log.error("Couldn't save project %s. %s" % (file_path, str(ex)))
QMessageBox.warning(self, _("Error Saving Project"), str(ex))
def load_recent_menu(self):
""" Clear and load the list of recent menu items """
s = settings.get_settings()
_ = get_app()._tr # Get translation function
# Get list of recent projects
recent_projects = s.get("recent_projects")
# Add Recent Projects menu (after Open File)
import functools
if not self.recent_menu:
# Create a new recent menu
self.recent_menu = self.menuFile.addMenu(QIcon.fromTheme("document-open-recent"), _("Recent Projects"))
self.menuFile.insertMenu(self.actionRecent_Placeholder, self.recent_menu)
else:
# Clear the existing children
self.recent_menu.clear()
# Add recent projects to menu
self._data = self.read_from_file(info.USER_DEFAULT_PROJECT)
except (FileNotFoundError, PermissionError) as ex:
log.warning("Unable to load user project defaults from {}: {}".format(info.USER_DEFAULT_PROJECT, ex))
except Exception:
raise
else:
log.info("Loaded user project defaults from {}".format(info.USER_DEFAULT_PROJECT))
else:
# Fall back to OpenShot defaults, if user defaults didn't load
self._data = self.read_from_file(self.default_project_filepath)
self.current_filepath = None
self.has_unsaved_changes = False
# Get default profile
s = settings.get_settings()
default_profile = s.get("default-profile")
# Loop through profiles
for profile_folder in [info.USER_PROFILES_PATH, info.PROFILES_PATH]:
for file in os.listdir(profile_folder):
# Load Profile and append description
profile_path = os.path.join(profile_folder, file)
profile = openshot.Profile(profile_path)
if default_profile == profile.info.description:
log.info("Setting default profile to %s" % profile.info.description)
# Update default profile
self._data["profile"] = profile.info.description
self._data["width"] = profile.info.width
self._data["height"] = profile.info.height
def load_settings(self):
s = settings.get_settings()
# Window state and geometry (also toolbar, dock locations and frozen UI state)
if s.get('window_state_v2'): self.restoreState(qt_types.str_to_bytes(s.get('window_state_v2')))
if s.get('window_geometry_v2'): self.restoreGeometry(qt_types.str_to_bytes(s.get('window_geometry_v2')))
if s.get('docks_frozen'):
""" Freeze all dockable widgets on the main screen """
self.freezeDocks()
self.actionFreeze_View.setVisible(False)
self.actionUn_Freeze_View.setVisible(True)
self.docks_frozen = True
# Load Recent Projects
self.load_recent_menu()
# The method restoreState restores the visibility of the toolBar,
# but does not set the correct flag in the actionView_Toolbar.