ZhuangPeiShiJianZhu/Assets/AVProVideo/Scripts/Editor/PlaylistMediaPlayerEditor.cs
2025-03-10 10:18:11 +08:00

417 lines
13 KiB
C#

using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
//-----------------------------------------------------------------------------
// Copyright 2015-2020 RenderHeads Ltd. All rights reserved.
//-----------------------------------------------------------------------------
namespace RenderHeads.Media.AVProVideo.Editor
{
/// <summary>
/// Editor for the MediaPlaylist.MediaItem class
/// </summary>
[CustomPropertyDrawer(typeof(MediaPlaylist))]
public class MediaPlaylistDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
// Using BeginProperty / EndProperty on the parent property means that
// prefab override logic works on the entire property.
EditorGUI.BeginProperty(position, label, property);
SerializedProperty propItems = property.FindPropertyRelative("_items");
if (propItems.arraySize == 0)
{
if (GUILayout.Button("Insert Item"))
{
propItems.InsertArrayElementAtIndex(0);
}
}
for (int i = 0; i < propItems.arraySize; i++)
{
SerializedProperty propItem = propItems.GetArrayElementAtIndex(i);
GUILayout.BeginVertical(GUI.skin.box);
propItem.isExpanded = EditorGUILayout.ToggleLeft("Item " + i, propItem.isExpanded);
if (propItem.isExpanded)
{
EditorGUILayout.PropertyField(propItem);
GUILayout.BeginHorizontal();
if (GUILayout.Button("Insert"))
{
propItems.InsertArrayElementAtIndex(i);
}
if (GUILayout.Button("Delete"))
{
propItems.DeleteArrayElementAtIndex(i);
}
EditorGUI.BeginDisabledGroup((i - 1) < 0);
if (GUILayout.Button("Up"))
{
propItems.MoveArrayElement(i, i - 1);
}
EditorGUI.EndDisabledGroup();
EditorGUI.BeginDisabledGroup((i + 1) >= propItems.arraySize);
if (GUILayout.Button("Down"))
{
propItems.MoveArrayElement(i, i + 1);
}
EditorGUI.EndDisabledGroup();
GUILayout.EndHorizontal();
}
GUILayout.EndVertical();
}
EditorGUI.EndProperty();
}
}
/// <summary>
/// Editor for the MediaPlaylist.MediaItem class
/// </summary>
[CustomPropertyDrawer(typeof(MediaPlaylist.MediaItem))]
public class MediaPlaylistItemDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
//SerializedProperty propSourceType = property.FindPropertyRelative("sourceType");
SerializedProperty propIsOverrideTransition = property.FindPropertyRelative("isOverrideTransition");
//EditorGUILayout.PropertyField(propSourceType);
//if (propSourceType.enumValueIndex == 0)
{
EditorGUILayout.PropertyField(property.FindPropertyRelative("fileLocation"));
EditorGUILayout.PropertyField(property.FindPropertyRelative("filePath"));
}
/*else
{
EditorGUILayout.PropertyField(property.FindPropertyRelative("texture"));
EditorGUILayout.PropertyField(property.FindPropertyRelative("textureDuration"));
}*/
EditorGUILayout.Space();
EditorGUILayout.PropertyField(property.FindPropertyRelative("stereoPacking"));
EditorGUILayout.PropertyField(property.FindPropertyRelative("alphaPacking"));
EditorGUILayout.Space();
EditorGUILayout.PropertyField(property.FindPropertyRelative("loop"));
EditorGUILayout.PropertyField(property.FindPropertyRelative("autoPlay"));
EditorGUILayout.PropertyField(property.FindPropertyRelative("startMode"));
SerializedProperty propProgressMode = property.FindPropertyRelative("progressMode");
EditorGUILayout.PropertyField(propProgressMode);
if (propProgressMode.enumValueIndex == (int)PlaylistMediaPlayer.ProgressMode.BeforeFinish)
{
EditorGUILayout.PropertyField(property.FindPropertyRelative("progressTimeSeconds"));
}
EditorGUILayout.Space();
EditorGUILayout.PropertyField(propIsOverrideTransition, new GUIContent("Override Transition"));
if (propIsOverrideTransition.boolValue)
{
EditorGUI.indentLevel++;
SerializedProperty propTransitionMode = property.FindPropertyRelative("overrideTransition");
EditorGUILayout.PropertyField(propTransitionMode, new GUIContent("Transition"));
if (propTransitionMode.enumValueIndex != (int)PlaylistMediaPlayer.Transition.None)
{
EditorGUILayout.PropertyField(property.FindPropertyRelative("overrideTransitionDuration"), new GUIContent("Duration"));
EditorGUILayout.PropertyField(property.FindPropertyRelative("overrideTransitionEasing.preset"), new GUIContent("Easing"));
}
EditorGUI.indentLevel--;
}
}
}
/// <summary>
/// Editor for the PlaylistMediaPlayer component
/// </summary>
[CanEditMultipleObjects]
[CustomEditor(typeof(PlaylistMediaPlayer))]
public class PlaylistMediaPlayerEditor : UnityEditor.Editor
{
private SerializedProperty _propPlayerA;
private SerializedProperty _propPlayerB;
private SerializedProperty _propNextTransition;
private SerializedProperty _propPlaylist;
private SerializedProperty _propPlaylistAutoProgress;
private SerializedProperty _propAutoCloseVideo;
private SerializedProperty _propPlaylistLoopMode;
private SerializedProperty _propPausePreviousOnTransition;
private SerializedProperty _propTransitionDuration;
private SerializedProperty _propTransitionEasing;
private static bool _expandPlaylistItems = false;
private static GUIStyle _sectionBoxStyle = null;
private const string SettingsPrefix = "AVProVideo-PlaylistMediaPlayerEditor-";
private void OnEnable()
{
_propPlayerA = serializedObject.FindProperty("_playerA");
_propPlayerB = serializedObject.FindProperty("_playerB");
_propNextTransition = serializedObject.FindProperty("_nextTransition");
_propTransitionDuration = serializedObject.FindProperty("_transitionDuration");
_propTransitionEasing = serializedObject.FindProperty("_transitionEasing.preset");
_propPausePreviousOnTransition = serializedObject.FindProperty("_pausePreviousOnTransition");
_propPlaylist = serializedObject.FindProperty("_playlist");
_propPlaylistAutoProgress = serializedObject.FindProperty("_playlistAutoProgress");
_propAutoCloseVideo = serializedObject.FindProperty("_autoCloseVideo");
_propPlaylistLoopMode = serializedObject.FindProperty("_playlistLoopMode");
_expandPlaylistItems = EditorPrefs.GetBool(SettingsPrefix + "ExpandPlaylistItems", false);
}
private void OnDisable()
{
EditorPrefs.SetBool(SettingsPrefix + "ExpandPlaylistItems", _expandPlaylistItems);
}
public override bool RequiresConstantRepaint()
{
PlaylistMediaPlayer media = (this.target) as PlaylistMediaPlayer;
return (media.Control != null && media.isActiveAndEnabled);
}
public override void OnInspectorGUI()
{
PlaylistMediaPlayer media = (this.target) as PlaylistMediaPlayer;
serializedObject.Update();
if (media == null || _propPlayerA == null)
{
return;
}
if (_sectionBoxStyle == null)
{
_sectionBoxStyle = new GUIStyle(GUI.skin.box);
_sectionBoxStyle.padding.top = 0;
_sectionBoxStyle.padding.bottom = 0;
}
EditorGUILayout.PropertyField(_propPlayerA);
EditorGUILayout.PropertyField(_propPlayerB);
EditorGUILayout.Space();
EditorGUILayout.Space();
GUILayout.Label("Playlist", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(_propPlaylistAutoProgress, new GUIContent("Auto Progress"));
EditorGUILayout.PropertyField(_propPlaylistLoopMode, new GUIContent("Loop Mode"));
EditorGUILayout.PropertyField(_propAutoCloseVideo);
{
EditorGUILayout.Space();
EditorGUILayout.Space();
GUI.color = Color.white;
GUI.backgroundColor = Color.clear;
if (_expandPlaylistItems)
{
GUI.color = Color.white;
GUI.backgroundColor = new Color(0.8f, 0.8f, 0.8f, 0.1f);
if (EditorGUIUtility.isProSkin)
{
GUI.backgroundColor = Color.black;
}
}
GUILayout.BeginVertical(_sectionBoxStyle);
GUI.backgroundColor = Color.white;
if (GUILayout.Button("Playlist Items", EditorStyles.toolbarButton))
{
_expandPlaylistItems = !_expandPlaylistItems;
}
GUI.color = Color.white;
if (_expandPlaylistItems)
{
EditorGUILayout.PropertyField(_propPlaylist);
}
GUILayout.EndVertical();
}
EditorGUILayout.Space();
EditorGUILayout.Space();
GUILayout.Label("Transition", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(_propNextTransition, new GUIContent("Next"));
EditorGUILayout.PropertyField(_propTransitionEasing, new GUIContent("Easing"));
EditorGUILayout.PropertyField(_propTransitionDuration, new GUIContent("Duration"));
EditorGUILayout.PropertyField(_propPausePreviousOnTransition, new GUIContent("Pause Previous"));
EditorGUILayout.Space();
EditorGUILayout.Space();
if (Application.isPlaying)
{
IMediaProducer textureSource = media.TextureProducer;
Texture texture = null;
if (textureSource != null)
{
texture = textureSource.GetTexture();
}
if (texture == null)
{
texture = EditorGUIUtility.whiteTexture;
}
float ratio = 1f;// (float)texture.width / (float)texture.height;
// Reserve rectangle for texture
GUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
Rect textureRect;
Rect alphaRect = new Rect(0f, 0f, 1f, 1f);
if (texture != EditorGUIUtility.whiteTexture)
{
textureRect = GUILayoutUtility.GetRect(Screen.width / 2, Screen.width / 2, (Screen.width / 2) / ratio, (Screen.width / 2) / ratio);
}
else
{
textureRect = GUILayoutUtility.GetRect(1920f / 40f, 1080f / 40f);
}
GUILayout.FlexibleSpace();
GUILayout.EndHorizontal();
string rateText = "0";
string playerText = string.Empty;
if (media.Info != null)
{
rateText = media.Info.GetVideoDisplayRate().ToString("F2");
playerText = media.Info.GetPlayerDescription();
}
EditorGUILayout.LabelField("Display Rate", rateText);
EditorGUILayout.LabelField("Using", playerText);
// Draw the texture
Matrix4x4 prevMatrix = GUI.matrix;
if (textureSource != null && textureSource.RequiresVerticalFlip())
{
GUIUtility.ScaleAroundPivot(new Vector2(1f, -1f), new Vector2(0, textureRect.y + (textureRect.height / 2)));
}
if (!GUI.enabled)
{
GUI.color = Color.grey;
GUI.DrawTexture(textureRect, texture, ScaleMode.ScaleToFit, false);
GUI.color = Color.white;
}
else
{
{
GUI.DrawTexture(textureRect, texture, ScaleMode.ScaleToFit, false);
EditorGUI.DrawTextureAlpha(alphaRect, texture, ScaleMode.ScaleToFit);
}
}
GUI.matrix = prevMatrix;
}
EditorGUI.BeginDisabledGroup(!(media.Control != null && media.Control.CanPlay() && media.isActiveAndEnabled && !EditorApplication.isPaused));
OnInspectorGUI_PlayControls(media.Control, media.Info);
EditorGUI.EndDisabledGroup();
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUI.BeginDisabledGroup(!Application.isPlaying);
GUILayout.Label("Current Item: " + media.PlaylistIndex + " / " + Mathf.Max(0, media.Playlist.Items.Count - 1) );
GUILayout.BeginHorizontal();
EditorGUI.BeginDisabledGroup(!media.CanJumpToItem(media.PlaylistIndex - 1));
if (GUILayout.Button("Prev"))
{
media.PrevItem();
}
EditorGUI.EndDisabledGroup();
EditorGUI.BeginDisabledGroup(!media.CanJumpToItem(media.PlaylistIndex + 1));
if (GUILayout.Button("Next"))
{
media.NextItem();
}
EditorGUI.EndDisabledGroup();
GUILayout.EndHorizontal();
EditorGUI.EndDisabledGroup();
serializedObject.ApplyModifiedProperties();
}
private void OnInspectorGUI_PlayControls(IMediaControl control, IMediaInfo info)
{
GUILayout.Space(8.0f);
// Slider
EditorGUILayout.BeginHorizontal();
bool isPlaying = false;
if (control != null)
{
isPlaying = control.IsPlaying();
}
float currentTime = 0f;
if (control != null)
{
currentTime = control.GetCurrentTimeMs();
}
float durationTime = 0f;
if (info != null)
{
durationTime = info.GetDurationMs();
if (float.IsNaN(durationTime))
{
durationTime = 0f;
}
}
string timeUsed = Helper.GetTimeString(currentTime / 1000f, true);
GUILayout.Label(timeUsed, GUILayout.ExpandWidth(false));
float newTime = GUILayout.HorizontalSlider(currentTime, 0f, durationTime, GUILayout.ExpandWidth(true));
if (newTime != currentTime)
{
control.Seek(newTime);
}
string timeTotal = "Infinity";
if (!float.IsInfinity(durationTime))
{
timeTotal = Helper.GetTimeString(durationTime / 1000f, true);
}
GUILayout.Label(timeTotal, GUILayout.ExpandWidth(false));
EditorGUILayout.EndHorizontal();
// Buttons
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("Rewind", GUILayout.ExpandWidth(false)))
{
control.Rewind();
}
if (!isPlaying)
{
GUI.color = Color.green;
if (GUILayout.Button("Play", GUILayout.ExpandWidth(true)))
{
control.Play();
}
}
else
{
GUI.color = Color.yellow;
if (GUILayout.Button("Pause", GUILayout.ExpandWidth(true)))
{
control.Pause();
}
}
GUI.color = Color.white;
EditorGUILayout.EndHorizontal();
}
}
}