106 lines
3.9 KiB
Python
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,
|
|
)
|