// public List<FTrackEditor> _trackEditors = new List<FTrackEditor>(); // [SerializeField] // private int[] _trackEditorIds = new int[0]; // [SerializeField] // private AnimVector3 _offsetAnim = new AnimVector3(); // private FTrackEditor _trackDragged = null; public override void Init(FObject obj, FEditor owner) { base.Init(obj, owner); if (Timeline.Owner == null) { Timeline.Awake(); } Editors.Clear(); List <FTrack> tracks = Timeline.Tracks; for (int i = 0; i < tracks.Count; ++i) { FTrack track = tracks[i]; FTrackEditor trackEditor = ContainerEditor.SequenceEditor.GetEditor <FTrackEditor>(track); trackEditor.Init(track, this); Editors.Add(trackEditor); } _icon = new GUIContent(FUtility.GetFluxTexture("Plus.png")); // _offsetAnim.valueChanged.AddListener( ContainerEditor.SequenceEditor.Repaint ); }
private void DestroyElements(List <ISelectableElement> elements) { Undo.IncrementCurrentGroup(); Undo.RecordObject(this, "Selected Elements"); for (int i = elements.Count - 1; i >= 0; --i) { if (elements[i] is FEvent) { FEvent evt = (FEvent)elements[i]; Undo.RecordObject(evt.GetTrack(), string.Empty); Undo.RecordObject(evt, string.Empty); evt.GetTrack().Remove(evt); Undo.DestroyObjectImmediate(evt.gameObject); } else if (elements[i] is FTrack) { FTrack track = (FTrack)elements[i]; Undo.RecordObject(track.GetTimeline(), string.Empty); Undo.RecordObject(track, string.Empty); track.GetTimeline().RemoveTrack(track); Undo.DestroyObjectImmediate(track.gameObject); } } Undo.CollapseUndoOperations(Undo.GetCurrentGroup()); Refresh(); }
public void ShowTrackMenu(FTrack track) { if (_fcEventTypes == null) { _fcEventTypes = new Type[0]; Type[] allTypes = typeof(FEvent).Assembly.GetTypes(); foreach (Type type in allTypes) { if (type.IsSubclassOf(typeof(FEvent)) && !type.IsAbstract) { object[] attributes = type.GetCustomAttributes(typeof(FEventAttribute), false); if (attributes.Length == 1) { ArrayUtility.Add <Type>(ref _fcEventTypes, type); } } } } GenericMenu menu = new GenericMenu(); foreach (Type t in _fcEventTypes) { TimelineMenuData param = new TimelineMenuData(); param.track = track; param.evtType = t; object[] attributes = t.GetCustomAttributes(typeof(FEventAttribute), false); menu.AddItem(new GUIContent(((FEventAttribute)attributes[0]).menu), false, AddEventToTrack, param); } menu.ShowAsContext(); }
public virtual void OnEnable() { if (target == null) { return; } FTrack track = (FTrack)target; Type trackType = track.GetType(); for (int i = 0; i != targets.Length; ++i) { if (trackType != targets[i].GetType()) { _allTracksSameType = false; break; } } if (_allTracksSameType) { _events = serializedObject.FindProperty("_events"); } else { _showEvents = false; } }
void AddTrackMenu(object param) { KeyValuePair <Type, FEventAttribute> kvp = (KeyValuePair <Type, FEventAttribute>)param; Undo.RecordObjects(new UnityEngine.Object[] { Container, this }, "add Track"); FTrack track = (FTrack)typeof(FContainer).GetMethod("Add", new Type[] { typeof(FrameRange) }).MakeGenericMethod(kvp.Key).Invoke(Container, new object[] { SequenceEditor.ViewRange }); string evtName = track.gameObject.name; int nameStart = 0; int nameEnd = evtName.Length; if (nameEnd > 2 && evtName[0] == 'F' && char.IsUpper(evtName[1])) { nameStart = 1; } if (evtName.EndsWith("Event")) { nameEnd = evtName.Length - "Event".Length; } evtName = evtName.Substring(nameStart, nameEnd - nameStart); track.gameObject.name = ObjectNames.NicifyVariableName(evtName); SequenceEditor.Refresh(); Undo.RegisterCreatedObjectUndo(track.gameObject, string.Empty); SequenceEditor.SelectExclusive(SequenceEditor.GetEditor <FEventEditor>(track.GetEvent(0))); }
private static void Rescale(FTrack track, float scaleFactor) { List <FEvent> events = track.GetEvents(); foreach (FEvent evt in events) { Rescale(evt, scaleFactor); } }
protected override void Paste(object obj) { if (!CanPaste(obj as FObject)) { return; } Undo.RecordObject(Container, string.Empty); FTrack track = Instantiate <FTrack>((FTrack)obj); track.hideFlags = Container.hideFlags; Container.Add(track); Undo.RegisterCreatedObjectUndo(track.gameObject, "Paste Track " + ((FTrack)obj).name); }
public override void OnInspectorGUI() { if (_allTracksSameType) { base.OnInspectorGUI(); } FTrack track = (FTrack)target; EditorGUI.BeginChangeCheck(); bool enabled = EditorGUILayout.Toggle("Enabled", ((FTrack)target).enabled); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, (enabled ? "enable" : "disable") + " Track"); track.enabled = enabled; EditorUtility.SetDirty(target); } EditorGUI.BeginChangeCheck(); string newName = EditorGUILayout.TextField("Name", target.name); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(track.gameObject, "rename Track"); target.name = newName; EditorUtility.SetDirty(target); } if (track.AllowedCacheMode != track.RequiredCacheMode) { EditorGUI.BeginChangeCheck(); CacheMode cacheMode = (CacheMode)EditorGUILayout.EnumMaskField("Cache Mode", track.CacheMode); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(track, "change Cache Mode"); track.CacheMode = (cacheMode | track.RequiredCacheMode) & track.AllowedCacheMode; EditorUtility.SetDirty(target); } } if (_showEvents && _events != null) { serializedObject.Update(); EditorGUILayout.PropertyField(_events, true); serializedObject.ApplyModifiedProperties(); } }
protected override void Init(FObject obj) { _track = (FTrack)obj; _eventEditors.Clear(); List <FEvent> events = _track.GetEvents(); for (int i = 0; i < events.Count; ++i) { FEvent evt = events[i]; FEventEditor evtEditor = SequenceEditor.GetEditor <FEventEditor>(evt); evtEditor.Init(evt, this); _eventEditors.Add(evtEditor); } }
protected override void Init(FObject obj) { _timeline = (FTimeline)obj; _trackEditors.Clear(); List <FTrack> tracks = _timeline.GetTracks(); for (int i = 0; i < tracks.Count; ++i) { FTrack track = tracks[i]; FTrackEditor trackEditor = _sequenceEditor.GetEditor <FTrackEditor>(track); trackEditor.Init(track, this); _trackEditors.Add(trackEditor); } }
UndoPropertyModification[] PostProcessModifications(UndoPropertyModification[] modifications) { Dictionary <int, FTrackEditor> trackEditors = new Dictionary <int, FTrackEditor>(); foreach (UndoPropertyModification modification in modifications) { if (modification.currentValue.target is FEvent) { FTrack track = ((FEvent)modification.currentValue.target).GetTrack(); if (track != null) { FTrackEditor trackEditor = _sequenceEditor.GetEditor <FTrackEditor>(track); if (!trackEditors.ContainsKey(trackEditor.GetInstanceID())) { trackEditors.Add(trackEditor.GetInstanceID(), trackEditor); } } } else if (modification.currentValue.target is FTrack) { FTrackEditor trackEditor = _sequenceEditor.GetEditor <FTrackEditor>(((FTrack)modification.currentValue.target)); if (!trackEditors.ContainsKey(trackEditor.GetInstanceID())) { trackEditors.Add(trackEditor.GetInstanceID(), trackEditor); } } else if (modification.currentValue.target is FTrackEditor) { FTrackEditor trackEditor = (FTrackEditor)modification.currentValue.target; if (!trackEditors.ContainsKey(trackEditor.GetInstanceID())) { trackEditors.Add(trackEditor.GetInstanceID(), trackEditor); } } // Debug.Log( "path: " + modification.propertyModification.propertyPath + " target: " + modification.propertyModification.target.name + " value: " + modification.propertyModification.value ); } Dictionary <int, FTrackEditor> .Enumerator e = trackEditors.GetEnumerator(); while (e.MoveNext()) { e.Current.Value.OnTrackChanged(); } return(modifications); }
public override void Init(FObject obj, FEditor owner) { base.Init(obj, owner); Editors.Clear(); List <FTrack> tracks = Container.Tracks; for (int i = 0; i < tracks.Count; ++i) { FTrack track = tracks[i]; FTrackEditor trackEditor = SequenceEditor.GetEditor <FTrackEditor>(track); trackEditor.Init(track, this); Editors.Add(trackEditor); } _icon = new GUIContent(FUtility.GetFluxTexture("Plus.png")); }
/// <summary> /// Retrieve tracks from a video file and extract subtitles, fonts and chapters to an external file. /// </summary> /// <param name="path">The path of the video file to analyse. This must be a local path.</param> /// <param name="outPath">The directory that will be used to store extracted files.</param> /// <param name="reExtract">Should the cache be invalidated and information re-extracted or not?</param> /// <returns>An array of <see cref="Track"/>.</returns> public static Track[] ExtractInfos(string path, string outPath, bool reExtract) { path = path.Replace('\\', '/'); outPath = outPath.Replace('\\', '/'); int size = Marshal.SizeOf <FTrack>(); IntPtr ptr = extract_infos(path, outPath, out uint arrayLength, out uint trackCount, reExtract); IntPtr streamsPtr = ptr; Track[] tracks; if (trackCount > 0 && ptr != IntPtr.Zero) { tracks = new Track[trackCount]; int j = 0; for (int i = 0; i < arrayLength; i++, streamsPtr += size) { FTrack stream = Marshal.PtrToStructure <FTrack>(streamsPtr); if (stream !.Type == FTrackType.Unknown || stream.Type == FTrackType.Attachment) { continue; } tracks[j] = stream.ToTrack(); j++; } Array.Resize(ref tracks, j); } else { tracks = Array.Empty <Track>(); } if (ptr != IntPtr.Zero) { free_streams(ptr, trackCount); } return(tracks); }
void AddTrackMenu(object param) { KeyValuePair <Type, FEventAttribute> kvp = (KeyValuePair <Type, FEventAttribute>)param; Undo.RecordObjects(new UnityEngine.Object[] { Container, this }, "add Track"); FTrack track = (FTrack)typeof(FContainer).GetMethod("Add", new Type[] { typeof(FrameRange) }).MakeGenericMethod(kvp.Key).Invoke(Container, new object[] { SequenceEditor.ViewRange }); //string evtName = track.gameObject.name; //int nameStart = 0; //int nameEnd = evtName.Length; //if (nameEnd > 2 && evtName[0] == 'F' && char.IsUpper(evtName[1])) // nameStart = 1; //if (evtName.EndsWith("Event")) // nameEnd = evtName.Length - "Event".Length; //evtName = evtName.Substring(nameStart, nameEnd - nameStart); string evtName = kvp.Value.menu; if (!string.IsNullOrEmpty(kvp.Value.menu)) { string[] nodes = kvp.Value.menu.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); evtName = nodes[nodes.Length - 1]; } track.gameObject.name = ObjectNames.NicifyVariableName(evtName); if (!Container.Sequence.IsStopped) { track.Init(); } SequenceEditor.Refresh(); Undo.RegisterCreatedObjectUndo(track.gameObject, string.Empty); SequenceEditor.SelectExclusive(SequenceEditor.GetEditor <FEventEditor>(track.GetEvent(0))); }
public override void RefreshRuntimeObject() { _track = (FTrack)EditorUtility.InstanceIDToObject(_track.GetInstanceID()); }