Managers often require distinct input and output path, which can now be saved and loaded from the User Preferences, as well as in the Flamenco panel.
142 lines
5.4 KiB
Python
142 lines
5.4 KiB
Python
"""Handle saving and loading project-specific settings."""
|
|
|
|
import logging
|
|
|
|
# Names of BlenderCloudPreferences properties that are both project-specific
|
|
# and simple enough to store directly in a dict.
|
|
PROJECT_SPECIFIC_SIMPLE_PROPS = (
|
|
'cloud_project_local_path',
|
|
'flamenco_exclude_filter',
|
|
'flamenco_job_file_path',
|
|
'flamenco_job_output_path',
|
|
'flamenco_job_output_strip_components'
|
|
)
|
|
|
|
log = logging.getLogger(__name__)
|
|
project_settings_loading = False
|
|
|
|
|
|
def handle_project_update(_=None, _2=None):
|
|
"""Handles changing projects, which may cause extensions to be disabled/enabled.
|
|
|
|
Ignores arguments so that it can be used as property update callback.
|
|
"""
|
|
|
|
from .blender import preferences, project_extensions
|
|
|
|
global project_settings_loading
|
|
project_settings_loading = True
|
|
try:
|
|
prefs = preferences()
|
|
project_id = prefs.project.project
|
|
log.info('Updating internal state to reflect extensions enabled on current project %s.',
|
|
project_id)
|
|
|
|
project_extensions.cache_clear()
|
|
|
|
from blender_cloud import attract, flamenco
|
|
attract.deactivate()
|
|
flamenco.deactivate()
|
|
|
|
enabled_for = project_extensions(project_id)
|
|
log.info('Project extensions: %s', enabled_for)
|
|
if 'attract' in enabled_for:
|
|
attract.activate()
|
|
if 'flamenco' in enabled_for:
|
|
flamenco.activate()
|
|
|
|
# Load project-specific settings from the last time we visited this project.
|
|
ps = prefs.get('project_settings', {}).get(project_id, {})
|
|
if not ps:
|
|
log.debug('no project-specific settings are available, not touching options')
|
|
return
|
|
|
|
if log.isEnabledFor(logging.DEBUG):
|
|
from pprint import pformat
|
|
log.debug('loading project-specific settings:\n%s', pformat(ps.to_dict()))
|
|
|
|
for name in PROJECT_SPECIFIC_SIMPLE_PROPS:
|
|
if name in ps and hasattr(prefs, name):
|
|
setattr(prefs, name, ps[name])
|
|
if ps.get('flamenco_manager'):
|
|
manager_id = ps['flamenco_manager']
|
|
log.debug('setting flamenco manager to %s', manager_id)
|
|
try:
|
|
prefs.flamenco_manager.manager = manager_id
|
|
if 'flamenco_managers_settings' in ps and \
|
|
prefs.flamenco_manager.manager in ps['flamenco_managers_settings']:
|
|
mps = ps['flamenco_managers_settings'][prefs.flamenco_manager.manager]
|
|
setattr(prefs, 'flamenco_job_file_path', mps['file_path'])
|
|
setattr(prefs, 'flamenco_job_output_path', mps['output_path'])
|
|
setattr(prefs, 'flamenco_job_output_strip_components', mps['output_strip_components'])
|
|
except TypeError:
|
|
log.warning('manager %s for this project could not be found', manager_id)
|
|
|
|
finally:
|
|
project_settings_loading = False
|
|
|
|
|
|
def store(_=None, _2=None):
|
|
"""Remember project-specific settings as soon as one of them changes.
|
|
|
|
Ignores arguments so that it can be used as property update callback.
|
|
|
|
No-op when project_settings_loading=True, to prevent saving project-
|
|
specific settings while they are actually being loaded.
|
|
"""
|
|
from .blender import preferences
|
|
|
|
global project_settings_loading
|
|
if project_settings_loading:
|
|
return
|
|
|
|
prefs = preferences()
|
|
project_id = prefs.project.project
|
|
all_settings = prefs.get('project_settings', {})
|
|
ps = all_settings.get(project_id, {})
|
|
|
|
for name in PROJECT_SPECIFIC_SIMPLE_PROPS:
|
|
ps[name] = getattr(prefs, name)
|
|
|
|
if ps['flamenco_manager'] != prefs.flamenco_manager.manager:
|
|
# In this case we want to load the manager settings, not save them
|
|
# This is done in update_manager (connected to the FlamencoManagerGroup.manager update handle)
|
|
ps['flamenco_manager'] = prefs.flamenco_manager.manager
|
|
else:
|
|
# If the manager did not change, update its settings
|
|
if 'flamenco_managers_settings' not in ps:
|
|
ps['flamenco_managers_settings'] = {}
|
|
if prefs.flamenco_manager.manager not in ps['flamenco_managers_settings']:
|
|
ps['flamenco_managers_settings'][prefs.flamenco_manager.manager] = {}
|
|
|
|
ps['flamenco_managers_settings'][prefs.flamenco_manager.manager]['file_path'] = getattr(
|
|
prefs, 'flamenco_job_file_path')
|
|
ps['flamenco_managers_settings'][prefs.flamenco_manager.manager]['output_path'] = getattr(
|
|
prefs, 'flamenco_job_output_path')
|
|
ps['flamenco_managers_settings'][prefs.flamenco_manager.manager]['output_strip_components'] = getattr(
|
|
prefs, 'flamenco_job_output_strip_components')
|
|
|
|
if log.isEnabledFor(logging.DEBUG):
|
|
from pprint import pformat
|
|
if hasattr(ps, 'to_dict'):
|
|
ps_to_log = ps.to_dict()
|
|
else:
|
|
ps_to_log = ps
|
|
log.debug('saving project-specific settings:\n%s', pformat(ps_to_log))
|
|
all_settings[project_id] = ps
|
|
prefs['project_settings'] = all_settings
|
|
|
|
|
|
def updated_manager(_=None, _2=None):
|
|
"""When the manager selector in FlamencoManagerGroup is updated.
|
|
|
|
If a new manager is selected:
|
|
- store the manager id in the flamenco_manager key
|
|
- load the configuration of such manager in the settings fields
|
|
"""
|
|
global project_settings_loading
|
|
if project_settings_loading:
|
|
return
|
|
store()
|
|
handle_project_update()
|