Skip to content
Snippets Groups Projects
asset_browser.py 2.82 KiB
Newer Older
  • Learn to ignore specific revisions
  • # 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)
    
    def tag_redraw(screen: bpy.types.Screen) -> None:
        """Tag all asset browsers for redrawing."""
    
        for area in suitable_areas(screen):
            area.tag_redraw()