using System.Threading;
namespace Editor;
[Dock( "Editor", "Asset Browser", "folder_open" )]
public class MainAssetBrowser : WrappedAssetBrowser
{
private static WrappedAssetBrowser _instance;
public static WrappedAssetBrowser Instance
{
get
{
if ( !_instance.IsValid() ) return null;
return _instance;
}
private set => _instance = value;
}
///
/// This constructor should only get called by the Docked version created by the editor.
///
public MainAssetBrowser( Widget parent ) : base( parent, null )
{
Instance ??= this;
Local.OnAssetHighlight = a => EditorUtility.InspectorObject = a;
Local.OnAssetsHighlight = a => EditorUtility.InspectorObject = a;
Local.OnAssetSelected = a => a.OpenInEditor();
Local.OnFileSelected = f => EditorUtility.OpenFile( f );
Cloud.OnPackageHighlight = p => _ = InspectPackage( p );
Mounts.OnAssetHighlight = a => EditorUtility.InspectorObject = a;
Mounts.OnAssetsHighlight = a => EditorUtility.InspectorObject = a;
}
CancellationTokenSource packageCTS;
private async Task InspectPackage( Package package )
{
packageCTS?.Cancel();
packageCTS = new CancellationTokenSource();
// Get the full package info
package = await Package.FetchAsync( package.FullIdent, false );
if ( await TryInspectPrimaryAsset( package, packageCTS.Token ) )
return;
// Show package info
}
async Task TryInspectPrimaryAsset( Package package, CancellationToken cancel )
{
if ( package.TypeName == "map" ) return false;
if ( package.TypeName == "game" ) return false;
if ( package.TypeName == "collection" ) return false;
if ( package.TypeName == "addon" ) return false;
if ( package.TypeName == "library" ) return false;
if ( package.GetMeta( "PrimaryAsset" ) is not string assetPath )
return false;
if ( cancel.IsCancellationRequested )
return false;
var asset = await AssetSystem.InstallAsync( package.FullIdent, true, null, cancel );
if ( asset is null )
return false;
EditorUtility.PlayAssetSound( asset );
if ( cancel.IsCancellationRequested )
return false;
EditorUtility.InspectorObject = asset;
return true;
}
[Event( "tools.editorwindow.postcreateview" )]
private static void AddViewMenuButtons( Menu menu )
{
menu.AddSeparator();
menu.AddOption( "New Asset Browser", "create_new_folder", () => EditorWindow.DockManager.Create() );
}
}