Fixed storing & loading project+manager-specific settings

The problem was that there was too much storing done in an on-change
handler, causing things to be overwritten. By splitting up some functionality
and properly marking the "we're now loading" bits of code, its' solved.
This commit is contained in:
Sybren A. Stüvel 2018-11-16 16:52:02 +01:00
parent d8c5c4eecd
commit 80155ed4f4
2 changed files with 32 additions and 16 deletions

View File

@ -66,12 +66,35 @@ def available_managers(self, context):
return [(p['_id'], p['name'], '') for p in mngrs] return [(p['_id'], p['name'], '') for p in mngrs]
def manager_updated(self: 'FlamencoManagerGroup', context):
from ..blender import preferences
flamenco_manager_id = self.manager
log.debug('manager updated to %r', flamenco_manager_id)
prefs = preferences()
project_id = prefs.project.project
ps = prefs.get('project_settings', {}).get(project_id, {})
# Load per-project, per-manager settings for the current Manager.
try:
pppm = ps['flamenco_managers_settings'][flamenco_manager_id]
except KeyError:
# No settings for this manager, so nothing to do.
return
with project_specific.mark_as_loading():
prefs.flamenco_job_file_path = pppm['file_path']
prefs.flamenco_job_output_path = pppm['output_path']
prefs.flamenco_job_output_strip_components = pppm['output_strip_components']
class FlamencoManagerGroup(PropertyGroup): class FlamencoManagerGroup(PropertyGroup):
manager = EnumProperty( manager = EnumProperty(
items=available_managers, items=available_managers,
name='Flamenco Manager', name='Flamenco Manager',
description='Which Flamenco Manager to use for jobs', description='Which Flamenco Manager to use for jobs',
update=project_specific.store, update=manager_updated,
) )
status = EnumProperty( status = EnumProperty(

View File

@ -10,18 +10,21 @@ PROJECT_SPECIFIC_SIMPLE_PROPS = (
) )
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
project_settings_loading = False project_settings_loading = 0 # counter, if > 0 then we're loading stuff.
@contextlib.contextmanager @contextlib.contextmanager
def mark_as_loading(): def mark_as_loading():
"""Sets project_settings_loading=True while the context is active.""" """Sets project_settings_loading > 0 while the context is active.
A counter is used to allow for nested mark_as_loading() contexts.
"""
global project_settings_loading global project_settings_loading
project_settings_loading = True project_settings_loading += 1
try: try:
yield yield
finally: finally:
project_settings_loading = False project_settings_loading -= 1
def handle_project_update(_=None, _2=None): def handle_project_update(_=None, _2=None):
@ -76,20 +79,10 @@ def handle_project_update(_=None, _2=None):
if flamenco_manager_id: if flamenco_manager_id:
log.debug('setting flamenco manager to %s', flamenco_manager_id) log.debug('setting flamenco manager to %s', flamenco_manager_id)
try: try:
# This will trigger a load of Project+Manager-specfic settings.
prefs.flamenco_manager.manager = flamenco_manager_id prefs.flamenco_manager.manager = flamenco_manager_id
except TypeError: except TypeError:
log.warning('manager %s for this project could not be found', flamenco_manager_id) log.warning('manager %s for this project could not be found', flamenco_manager_id)
else:
# Load per-project, per-manager settings for the current Manager.
try:
pppm = ps['flamenco_managers_settings'][flamenco_manager_id]
except KeyError:
# No settings for this manager, so nothing to do.
pass
else:
prefs.flamenco_job_file_path = pppm['file_path']
prefs.flamenco_job_output_path = pppm['output_path']
prefs.flamenco_job_output_strip_components = pppm['output_strip_components']
elif prefs.flamenco_manager.available_managers: elif prefs.flamenco_manager.available_managers:
prefs.flamenco_manager.manager = prefs.flamenco_manager.available_managers[0] prefs.flamenco_manager.manager = prefs.flamenco_manager.available_managers[0]