100 lines
2.8 KiB
Python
100 lines
2.8 KiB
Python
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
"""Functions for finding and working with Asset Browsers."""
|
|
|
|
from typing import Iterable, Optional, Tuple
|
|
|
|
import bpy
|
|
from bpy_extras import asset_utils
|
|
|
|
|
|
if "functions" not in locals():
|
|
from . import functions
|
|
else:
|
|
import importlib
|
|
|
|
functions = importlib.reload(functions)
|
|
|
|
|
|
def biggest_asset_browser_area(screen: bpy.types.Screen) -> Optional[bpy.types.Area]:
|
|
"""Return the asset browser Area that's largest on screen.
|
|
|
|
:param screen: context.window.screen
|
|
|
|
:return: the Area, or None if no Asset Browser area exists.
|
|
"""
|
|
|
|
def area_sorting_key(area: bpy.types.Area) -> Tuple[bool, int]:
|
|
"""Return area size in pixels."""
|
|
return (area.width * area.height)
|
|
|
|
areas = list(suitable_areas(screen))
|
|
if not areas:
|
|
return None
|
|
|
|
return max(areas, key=area_sorting_key)
|
|
|
|
|
|
def suitable_areas(screen: bpy.types.Screen) -> Iterable[bpy.types.Area]:
|
|
"""Generator, yield Asset Browser areas."""
|
|
|
|
for area in screen.areas:
|
|
space_data = area.spaces[0]
|
|
if not asset_utils.SpaceAssetInfo.is_asset_browser(space_data):
|
|
continue
|
|
yield area
|
|
|
|
|
|
def area_from_context(context: bpy.types.Context) -> Optional[bpy.types.Area]:
|
|
"""Return an Asset Browser suitable for the given category.
|
|
|
|
Prefers the current Asset Browser if available, otherwise the biggest.
|
|
"""
|
|
|
|
space_data = context.space_data
|
|
if asset_utils.SpaceAssetInfo.is_asset_browser(space_data):
|
|
return context.area
|
|
|
|
# Try the current screen first.
|
|
browser_area = biggest_asset_browser_area(context.screen)
|
|
if browser_area:
|
|
return browser_area
|
|
|
|
for win in context.window_manager.windows:
|
|
if win.screen == context.screen:
|
|
continue
|
|
browser_area = biggest_asset_browser_area(win.screen)
|
|
if browser_area:
|
|
return browser_area
|
|
|
|
return None
|
|
|
|
|
|
def activate_asset(
|
|
asset: bpy.types.Action, asset_browser: bpy.types.Area, *, deferred: bool
|
|
) -> None:
|
|
"""Select & focus the asset in the browser."""
|
|
|
|
space_data = asset_browser.spaces[0]
|
|
assert asset_utils.SpaceAssetInfo.is_asset_browser(space_data)
|
|
space_data.activate_asset_by_id(asset, deferred=deferred)
|
|
|
|
|
|
def active_catalog_id(asset_browser: bpy.types.Area) -> str:
|
|
"""Return the ID of the catalog shown in the asset browser."""
|
|
return params(asset_browser).catalog_id
|
|
|
|
|
|
def params(asset_browser: bpy.types.Area) -> bpy.types.FileAssetSelectParams:
|
|
"""Return the asset browser parameters given its Area."""
|
|
space_data = asset_browser.spaces[0]
|
|
assert asset_utils.SpaceAssetInfo.is_asset_browser(space_data)
|
|
return space_data.params
|
|
|
|
|
|
def tag_redraw(screen: bpy.types.Screen) -> None:
|
|
"""Tag all asset browsers for redrawing."""
|
|
|
|
for area in suitable_areas(screen):
|
|
area.tag_redraw()
|