Files
blender-portable-repo/scripts/addons/asset_pipeline/merge/task_layer.py
T
2026-03-17 14:58:51 -06:00

106 lines
3.9 KiB
Python

# SPDX-FileCopyrightText: 2025 Blender Studio Tools Authors
#
# SPDX-License-Identifier: GPL-3.0-or-later
import bpy
from .. import constants
from .. import config
def get_default_task_layer_owner(td_type: str, name="") -> [str, bool]:
if td_type == constants.ATTRIBUTE_KEY:
if name in config.ATTRIBUTE_DEFAULTS:
return (
config.ATTRIBUTE_DEFAULTS[name]['default_owner'],
config.ATTRIBUTE_DEFAULTS[name]['auto_surrender'],
)
try:
return (
config.TRANSFER_DATA_DEFAULTS[td_type]['default_owner'],
config.TRANSFER_DATA_DEFAULTS[td_type]['auto_surrender'],
)
except KeyError:
from .. import logging
logger = logging.get_logger()
logger.fatal(f"Task Layer File missing key {td_type}")
# TODO stop execution of operator at this point if this fails
def get_transfer_data_owner(
asset_pipe: bpy.types.PropertyGroup,
td_type_key: str,
name="",
) -> [str, bool]:
default_tl, auto_surrender = get_default_task_layer_owner(td_type_key, name)
if default_tl in asset_pipe.get_local_task_layers():
# If the default owner is local to the file, don't use auto_surrender
return default_tl, False
else:
# If the default owner is not local, pass auto surrender value
return asset_pipe.get_local_task_layers()[0], auto_surrender
def draw_task_layer_selection(
context: bpy.types.Context,
layout: bpy.types.UILayout,
data: bpy.types.CollectionProperty or bpy.types.ID,
show_all_task_layers=False,
text="",
data_owner_name="",
current_data_owner=None,
) -> None:
"""Draw an prop search UI for ownership of either OBJ/COL or Task Layer.
It has three modes, 'Show All Task Layers" "Show All Task Layers Greyed Out" and
"Only Show Local Task Layers"
- When the property is already set to a local task layer show: "Only Show Local Task Layers"
- When a property is owned by an external task layer: "Show All Task Layers Greyed Out" so they user cannot edit it
- When a user is overriding or the object is new (using default ownership): "Show All Task Layers"
Args:
layout (bpy.types.UILayout): Any UI Layout element like self.layout or row
data (bpy.types.CollectionProperty or bpy.types.ID or bpy.types.Operator): Python object that owns the ownership data.
show_all_task_layers (bool, optional): Used when we want to list all task layers in the production as options.
text (str, optional): Title of prop search.
data_owner_name(str, optional): Name of Data if it needs to be specified
current_data_owner(str, optional): Property that is named by data_owner_name so it can be checked, property should return a string
"""
# Set data_owner_name based on type of it hasn't been passed
if data_owner_name == "":
# These rna_type.names are defined by class names in props.py
if data.rna_type.name in ["AssetTransferData", 'AssetTransferDataTemp']:
data_owner_name = "owner"
else:
data_owner_name = "asset_id_owner"
# Get the current data owner from OBJ/COL or Transferable Data Item if it hasn't been passed
if current_data_owner is None:
current_data_owner = getattr(data, data_owner_name)
asset_pipe = context.scene.asset_pipeline
row = layout.row()
if current_data_owner not in asset_pipe.local_task_layers:
show_all_task_layers = True
if not isinstance(data, bpy.types.Operator):
row.enabled = False
if show_all_task_layers:
row.prop_search(
data,
data_owner_name,
asset_pipe,
'all_task_layers',
text=text,
)
else:
row.prop_search(
data,
data_owner_name,
asset_pipe,
'local_task_layers',
text=text,
)