1 # SPDX-License-Identifier: GPL-2.0-or-later
3 """Functions for finding and working with Asset Browsers."""
5 from typing
import Iterable
, Optional
, Tuple
8 from bpy_extras
import asset_utils
11 if "functions" not in locals():
12 from . import functions
16 functions
= importlib
.reload(functions
)
19 def biggest_asset_browser_area(screen
: bpy
.types
.Screen
) -> Optional
[bpy
.types
.Area
]:
20 """Return the asset browser Area that's largest on screen.
22 :param screen: context.window.screen
24 :return: the Area, or None if no Asset Browser area exists.
27 def area_sorting_key(area
: bpy
.types
.Area
) -> Tuple
[bool, int]:
28 """Return area size in pixels."""
29 return area
.width
* area
.height
31 areas
= list(suitable_areas(screen
))
35 return max(areas
, key
=area_sorting_key
)
38 def suitable_areas(screen
: bpy
.types
.Screen
) -> Iterable
[bpy
.types
.Area
]:
39 """Generator, yield Asset Browser areas."""
41 for area
in screen
.areas
:
42 space_data
= area
.spaces
[0]
43 if not asset_utils
.SpaceAssetInfo
.is_asset_browser(space_data
):
48 def area_from_context(context
: bpy
.types
.Context
) -> Optional
[bpy
.types
.Area
]:
49 """Return an Asset Browser suitable for the given category.
51 Prefers the current Asset Browser if available, otherwise the biggest.
54 space_data
= context
.space_data
55 if asset_utils
.SpaceAssetInfo
.is_asset_browser(space_data
):
58 # Try the current screen first.
59 browser_area
= biggest_asset_browser_area(context
.screen
)
63 for win
in context
.window_manager
.windows
:
64 if win
.screen
== context
.screen
:
66 browser_area
= biggest_asset_browser_area(win
.screen
)
73 def activate_asset(asset
: bpy
.types
.Action
, asset_browser
: bpy
.types
.Area
, *, deferred
: bool) -> None:
74 """Select & focus the asset in the browser."""
76 space_data
= asset_browser
.spaces
[0]
77 assert asset_utils
.SpaceAssetInfo
.is_asset_browser(space_data
)
78 space_data
.activate_asset_by_id(asset
, deferred
=deferred
)
81 def active_catalog_id(asset_browser
: bpy
.types
.Area
) -> str:
82 """Return the ID of the catalog shown in the asset browser."""
83 return params(asset_browser
).catalog_id
86 def params(asset_browser
: bpy
.types
.Area
) -> bpy
.types
.FileAssetSelectParams
:
87 """Return the asset browser parameters given its Area."""
88 space_data
= asset_browser
.spaces
[0]
89 assert asset_utils
.SpaceAssetInfo
.is_asset_browser(space_data
)
90 return space_data
.params
93 def tag_redraw(screen
: bpy
.types
.Screen
) -> None:
94 """Tag all asset browsers for redrawing."""
96 for area
in suitable_areas(screen
):