// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System; using FlaxEditor.GUI.Timeline.Undo; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; namespace FlaxEditor.GUI.Timeline.Tracks { /// /// The base class for timeline tracks that use single media with an asset reference. /// /// The type of the asset. /// The type of the media event. /// public abstract class SingleMediaAssetTrack : SingleMediaTrack where TAsset : Asset where TMedia : Media, new() { /// /// The asset reference picker control. /// protected readonly AssetPicker _picker; /// /// The asset id. /// public Guid AssetID; /// /// Gets or sets the asset. /// public TAsset Asset { get => FlaxEngine.Content.LoadAsync(AssetID); set { if (AssetID == value?.ID) return; AssetID = value?.ID ?? Guid.Empty; _picker.SelectedAsset = value; OnAssetChanged(); Timeline?.MarkAsEdited(); } } /// protected SingleMediaAssetTrack(ref TrackCreateOptions options) : base(ref options) { var width = 50.0f; var height = 36.0f; _picker = new AssetPicker(new ScriptType(typeof(TAsset)), Float2.Zero) { AnchorPreset = AnchorPresets.MiddleRight, Offsets = new Margin(-width - 2 + _muteCheckbox.Offsets.Left, width, height * -0.5f, height), Parent = this, }; _picker.SelectedItemChanged += OnPickerSelectedItemChanged; Height = 4 + _picker.Height; } private void OnPickerSelectedItemChanged() { if (Asset == (TAsset)_picker.SelectedAsset) return; using (new TrackUndoBlock(this)) Asset = (TAsset)_picker.SelectedAsset; } /// /// Called when selected asset gets changed. /// protected virtual void OnAssetChanged() { } } }