diff --git a/Source/Editor/GUI/Timeline/Tracks/ActorTrack.cs b/Source/Editor/GUI/Timeline/Tracks/ActorTrack.cs
index d7f0b9967..9ab1a0d07 100644
--- a/Source/Editor/GUI/Timeline/Tracks/ActorTrack.cs
+++ b/Source/Editor/GUI/Timeline/Tracks/ActorTrack.cs
@@ -100,28 +100,15 @@ namespace FlaxEditor.GUI.Timeline.Tracks
{
base.OnShowAddContextMenu(menu);
+ OnSelectActorContextMenu(menu);
+
var actor = Actor;
- var selection = Editor.Instance.SceneEditing.Selection;
-
- // Missing actor case
if (actor == null)
- {
- if (selection.Count == 1 && selection[0] is ActorNode actorNode && actorNode.Actor && IsActorValid(actorNode.Actor))
- {
- menu.AddButton("Select " + actorNode.Actor, OnClickedSelectActor).TooltipText = Utilities.Utils.GetTooltip(actorNode.Actor);
- }
- else
- {
- menu.AddButton("No valid actor selected");
- }
return;
- }
- else if (selection.Count == 1)
- {
- // TODO: add option to change the actor to the selected one
- }
-
var type = actor.GetType();
+ menu.AddSeparator();
+
+ // Properties and events
if (AddProperties(this, menu, type) != 0)
menu.AddSeparator();
if (AddEvents(this, menu, type) != 0)
@@ -146,6 +133,31 @@ namespace FlaxEditor.GUI.Timeline.Tracks
}
}
+ ///
+ protected override void OnContextMenu(ContextMenu.ContextMenu menu)
+ {
+ base.OnContextMenu(menu);
+
+ menu.AddSeparator();
+ OnSelectActorContextMenu(menu);
+ }
+
+ private void OnSelectActorContextMenu(ContextMenu.ContextMenu menu)
+ {
+ var actor = Actor;
+ var selection = Editor.Instance.SceneEditing.Selection;
+ foreach (var node in selection)
+ {
+ if (node is ActorNode actorNode && IsActorValid(actorNode.Actor) && actorNode.Actor != actor)
+ {
+ var b = menu.AddButton("Select " + actorNode.Actor, OnClickedSelectActor);
+ b.Tag = actorNode.Actor;
+ b.TooltipText = Utilities.Utils.GetTooltip(actorNode.Actor);
+ }
+ }
+ menu.AddButton("Select...", OnClickedSelect).TooltipText = "Opens actor picker dialog to select the target actor for this track";
+ }
+
///
/// Adds the script track to this actor track.
///
@@ -169,7 +181,14 @@ namespace FlaxEditor.GUI.Timeline.Tracks
/// True if it's valid, otherwise false.
protected virtual bool IsActorValid(Actor actor)
{
- return true;
+ return actor;
+ }
+
+ ///
+ /// Called when actor gets changed.
+ ///
+ protected virtual void OnActorChanged()
+ {
}
private void OnAddScriptTrack(ContextMenuButton button)
@@ -178,16 +197,25 @@ namespace FlaxEditor.GUI.Timeline.Tracks
AddScriptTrack(script);
}
- private void OnClickedSelectActor()
+ private void OnClickedSelectActor(ContextMenuButton b)
{
- var selection = Editor.Instance.SceneEditing.Selection;
- if (selection.Count == 1 && selection[0] is ActorNode actorNode && actorNode.Actor && IsActorValid(actorNode.Actor))
- {
- var oldName = Name;
- Rename(actorNode.Actor.Name);
- using (new TrackUndoBlock(this, new RenameTrackAction(Timeline, this, oldName, Name)))
- Actor = actorNode.Actor;
- }
+ SetActor((Actor)b.Tag);
+ }
+
+ private void SetActor(Actor actor)
+ {
+ if (Actor == actor || !IsActorValid(actor))
+ return;
+ var oldName = Name;
+ Rename(actor.Name);
+ using (new TrackUndoBlock(this, new RenameTrackAction(Timeline, this, oldName, Name)))
+ Actor = actor;
+ OnActorChanged();
+ }
+
+ private void OnClickedSelect()
+ {
+ ActorSearchPopup.Show(this, PointFromScreen(FlaxEngine.Input.MouseScreenPosition), IsActorValid, SetActor);
}
private void OnClickedSelectActor(Image image, MouseButton button)
diff --git a/Source/Editor/GUI/Timeline/Tracks/CameraCutTrack.cs b/Source/Editor/GUI/Timeline/Tracks/CameraCutTrack.cs
index 68ee84a7c..ea5bf6554 100644
--- a/Source/Editor/GUI/Timeline/Tracks/CameraCutTrack.cs
+++ b/Source/Editor/GUI/Timeline/Tracks/CameraCutTrack.cs
@@ -694,6 +694,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks
var m = (CameraCutMedia)e.Media[i];
m.StartFrame = stream.ReadInt32();
m.DurationFrames = stream.ReadInt32();
+ m.UpdateThumbnails();
}
}
}
@@ -829,6 +830,14 @@ namespace FlaxEditor.GUI.Timeline.Tracks
return base.IsActorValid(actor) && actor is Camera;
}
+ ///
+ protected override void OnActorChanged()
+ {
+ base.OnActorChanged();
+
+ UpdateThumbnails();
+ }
+
///
public override void OnSpawned()
{