// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System; using System.Collections.Generic; using System.Text; using FlaxEditor.Content.Thumbnails; using FlaxEditor.Viewport.Previews; using FlaxEditor.Windows; using FlaxEditor.Windows.Assets; using FlaxEngine; using FlaxEngine.GUI; namespace FlaxEditor.Content { /// /// Implementation of for assets. /// /// class AudioClipItem : BinaryAssetItem { /// public AudioClipItem(string path, ref Guid id, string typeName, Type type) : base(path, ref id, typeName, type, ContentItemSearchFilter.Audio) { } /// public override bool OnEditorDrag(object context) { return true; } /// public override Actor OnEditorDrop(object context) { return new AudioSource { Clip = FlaxEngine.Content.LoadAsync(ID) }; } /// protected override void OnBuildTooltipText(StringBuilder sb) { base.OnBuildTooltipText(sb); var asset = FlaxEngine.Content.Load(ID, 100); if (asset) { var info = asset.Info; sb.Append("Duration: ").Append(asset.Length).AppendLine(); sb.Append("Channels: ").Append(info.NumChannels).AppendLine(); sb.Append("Bit Depth: ").Append(info.BitDepth).AppendLine(); } } } /// /// A asset proxy object. /// /// class AudioClipProxy : BinaryAssetProxy { private List _previews; /// public override string Name => "Audio Clip"; /// public override bool CanReimport(ContentItem item) { return true; } /// public override EditorWindow Open(Editor editor, ContentItem item) { return new AudioClipWindow(editor, (AssetItem)item); } /// public override AssetItem ConstructItem(string path, string typeName, ref Guid id) { return new AudioClipItem(path, ref id, typeName, AssetType); } /// public override Color AccentColor => Color.FromRGB(0xB3452B); /// public override Type AssetType => typeof(AudioClip); /// public override void OnThumbnailDrawPrepare(ThumbnailRequest request) { AudioClipPreview preview; if (_previews != null && _previews.Count > 0) { // Reuse preview control preview = _previews[_previews.Count - 1]; _previews.RemoveAt(_previews.Count - 1); } else { // Create new preview control preview = new AudioClipPreview { DrawMode = AudioClipPreview.DrawModes.Fill, AnchorPreset = AnchorPresets.StretchAll, Offsets = Margin.Zero, }; } // Cached used preview in request data request.Tag = preview; // Start loading the audio buffers preview.Asset = (AudioClip)request.Asset; } /// public override bool CanDrawThumbnail(ThumbnailRequest request) { // Check if asset is loaded and has audio buffer ready to draw var asset = (AudioClip)request.Asset; var preview = (AudioClipPreview)request.Tag; return asset.IsLoaded && preview.HasData; } /// public override void OnThumbnailDrawBegin(ThumbnailRequest request, ContainerControl guiRoot, GPUContext context) { var preview = (AudioClipPreview)request.Tag; preview.Parent = guiRoot; } /// public override void OnThumbnailDrawEnd(ThumbnailRequest request, ContainerControl guiRoot) { var preview = (AudioClipPreview)request.Tag; preview.Parent = null; } /// public override void OnThumbnailDrawCleanup(ThumbnailRequest request) { // Unlink asset var preview = (AudioClipPreview)request.Tag; preview.Asset = null; // Return the preview control back to the pool if (_previews == null) _previews = new List(8); _previews.Add(preview); } /// public override void Dispose() { if (_previews != null) { for (int i = 0; i < _previews.Count; i++) { _previews[i].Dispose(); } _previews.Clear(); } _previews = null; base.Dispose(); } } }