From 973dafcc3ad3c87046f928a4408a07a6a86287c9 Mon Sep 17 00:00:00 2001 From: Francesco Siddi Date: Wed, 25 Jul 2018 15:01:39 +0200 Subject: [PATCH] Store some flamenco job preferences on a per-manager basis 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. --- blender_cloud/flamenco/__init__.py | 21 +++++++++++++++- blender_cloud/project_specific.py | 40 ++++++++++++++++++++++++++++-- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/blender_cloud/flamenco/__init__.py b/blender_cloud/flamenco/__init__.py index 7ccdb7b..7b7fb3b 100644 --- a/blender_cloud/flamenco/__init__.py +++ b/blender_cloud/flamenco/__init__.py @@ -68,7 +68,7 @@ class FlamencoManagerGroup(PropertyGroup): items=available_managers, name='Flamenco Manager', description='Which Flamenco Manager to use for jobs', - update=project_specific.store, + update=project_specific.updated_manager, ) status = EnumProperty( @@ -89,6 +89,7 @@ class FlamencoManagerGroup(PropertyGroup): @available_managers.setter def available_managers(self, new_managers): self['available_managers'] = new_managers + project_specific.updated_manager() class FlamencoPollMixin: @@ -676,6 +677,24 @@ class FLAMENCO_PT_render(bpy.types.Panel, FlamencoPollMixin): prefs = preferences() + labeled_row = layout.split(0.25, align=True) + labeled_row.label('Manager:') + prop_btn_row = labeled_row.row(align=True) + + bcp = prefs.flamenco_manager + if bcp.status in {'NONE', 'IDLE'}: + if not bcp.available_managers or not bcp.manager: + prop_btn_row.operator('flamenco.managers', + text='Find Flamenco Managers', + icon='FILE_REFRESH') + else: + prop_btn_row.prop(bcp, 'manager', text='') + prop_btn_row.operator('flamenco.managers', + text='', + icon='FILE_REFRESH') + else: + prop_btn_row.label('Fetching available managers.') + labeled_row = layout.split(0.25, align=True) labeled_row.label('Job Type:') labeled_row.prop(context.scene, 'flamenco_render_job_type', text='') diff --git a/blender_cloud/project_specific.py b/blender_cloud/project_specific.py index a40e3cb..b30811f 100644 --- a/blender_cloud/project_specific.py +++ b/blender_cloud/project_specific.py @@ -63,6 +63,12 @@ def handle_project_update(_=None, _2=None): 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) @@ -91,7 +97,24 @@ def store(_=None, _2=None): for name in PROJECT_SPECIFIC_SIMPLE_PROPS: ps[name] = getattr(prefs, name) - ps['flamenco_manager'] = prefs.flamenco_manager.manager + + 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 @@ -100,6 +123,19 @@ def store(_=None, _2=None): 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()