Sun Position: fix error in HDRI mode when no env tex is selected
[blender-addons.git] / pose_library / asset_browser.py
blob51103183eb679ffbfaabb4f0cc9dfd40a281f603
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
7 import bpy
8 from bpy_extras import asset_utils
11 if "functions" not in locals():
12 from . import functions
13 else:
14 import importlib
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.
25 """
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))
32 if not areas:
33 return None
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):
44 continue
45 yield area
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.
52 """
54 space_data = context.space_data
55 if asset_utils.SpaceAssetInfo.is_asset_browser(space_data):
56 return context.area
58 # Try the current screen first.
59 browser_area = biggest_asset_browser_area(context.screen)
60 if browser_area:
61 return browser_area
63 for win in context.window_manager.windows:
64 if win.screen == context.screen:
65 continue
66 browser_area = biggest_asset_browser_area(win.screen)
67 if browser_area:
68 return browser_area
70 return None
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):
97 area.tag_redraw()